【深度学习】Ivy 开源框架,深度学习大一统时代到来?

共 3128字,需浏览 7分钟

 ·

2022-02-12 13:23

它来了,它带着统一主流深度学习框架的接口来了。最近,有一个开源的框架:IVY,它将几个主流的深度学习框架都做了一个统一的封装,包括 PyTorch、TensorFlow、MXNet、Jax 和 Numpy。下面来大致看一下这个框架吧。

近两年来,学术界和工业界一直在争论 PyTorch 和 TensorFlow 哪一个才是最好用的深度学习框架。除了这两个框架,谷歌出品的 Jax 也有起势的样子,还有亚马逊的 MXNet,都还在发展。PyTorch 在学术界最火,TensorFlow 工程上部署的较多,可谓各有千秋。所以,就有开源作者想把各种主流的框架统一做了封装,于是就有了 Ivy。

代码地址:https://github.com/unifyai/ivy

先看看 IVY 官方是怎么定义的吧。

Ivy is a unified machine learning framework which maximizes the portability of machine learning codebases. Ivy wraps the functional APIs of existing frameworks. Framework-agnostic functions, libraries and layers can then be written using Ivy, with simultaneous support for all frameworks. Ivy currently supports Jax, TensorFlow, PyTorch, MXNet and Numpy. 


翻译出来就是:

Ivy 是一个统一的机器学习框架,可最大限度地提高机器学习代码库的可移植性。Ivy 封装了现有框架的功能 API。然后可以使用 Ivy 编写与框架无关的函数、库和层,它可以同时支持所有框架。Ivy 目前支持 Jax、TensorFlow、PyTorch、MXNet 和 Numpy。
目前官方已经发布了不少 Ivy 编写的派生库,包括力学、3D 视觉、机器人、增强学习、神经记忆、预训练模型以及实现,此外还有训练、数据加载的构建器工具等。

快速入门

我们可以直接 pip install ivy-core来安装,然后你可以使用你喜欢的框架来训练一个模型,下面是一个示例:
import ivy

class MyModel(ivy.Module):
    def __init__(self):
        self.linear0 = ivy.Linear(3, 64)
        self.linear1 = ivy.Linear(64, 1)
        ivy.Module.__init__(self)

    def _forward(self, x):
        x = ivy.relu(self.linear0(x))
        return ivy.sigmoid(self.linear1(x))

ivy.set_framework('torch')  # change to any framework!
model = MyModel()
optimizer = ivy.Adam(1e-4)
x_in = ivy.array([1., 2., 3.])
target = ivy.array([0.])

def loss_fn(v):
    out = model(x_in, v=v)
    return ivy.reduce_mean((out - target)**2)[0]

for step in range(100):
    loss, grads = ivy.execute_with_gradients(loss_fn, model.v)
    model.v = optimizer.step(model.v, grads)
    print('step {} loss {}'.format(step, ivy.to_numpy(loss).item()))

print('Finished training!')
这个示例使用 PyTorch 作为后端框架,但后端可以轻松更改为你喜欢的框架,例如 TensorFlow、JAX 或 MXNet。

框架无关的函数

Ivy 的函数可以接受所有框架的 tensor,如下面的例子:
import jax.numpy as jnp
import tensorflow as tf
import numpy as np
import mxnet as mx
import torch

import ivy

jax_concatted = ivy.concatenate((jnp.ones((1,)), jnp.ones((1,))), -1)
tf_concatted = ivy.concatenate((tf.ones((1,)), tf.ones((1,))), -1)
np_concatted = ivy.concatenate((np.ones((1,)), np.ones((1,))), -1)
mx_concatted = ivy.concatenate((mx.nd.ones((1,)), mx.nd.ones((1,))), -1)
torch_concatted = ivy.concatenate((torch.ones((1,)), torch.ones((1,))), -1)
下面是 Ivy 支持的函数,可以看到,跟 Numpy、PyTorch、TensorFlow 的函数非常像

统一所有框架的目的何在?

很多开发者都想用一个框架开发,那么 Ivy 有啥用呢?
当你想让代码可用性最强的时候,Ivy的威力就显现了。
当我们想写一些代码,然后让社区所有开发者都可以用,不管他们用的是啥框架,TF、PyTorch、MXNet、Jax,都没关系。例如一个简单的裁剪函数 ivy.clip,它很好的封装了其他框架的函数。
就其本身而言,这似乎不是很有意思,在机器学习中还有比裁剪张量更有趣的事情。Ivy 可以构建更多有趣的应用。
Ivy 官方发布的力学、3D 视觉、机器人和可微分环境的代码库都是用纯 Ivy 编写的。这些库为任何机器学习框架的用户提供了各种应用功能的完全可区分的实现,随时可以集成到用户的代码中。
Ivy 的另一个好处是灵活性。通过保持 Ivy 抽象的轻量级,以及齐全的功能,这使您可以完全控制您的代码。下面的示意图强调您可以选择在任何抽象级别进行开发。
你可以完全在 Ivy 中编写代码,或者在原生 DL 框架中使用少量 Ivy 代码。这完全取决于您需要从现有 Ivy 库中获得多少 Ivy 函数。
总得来说,Ivy 看着还挺有意思的。虽然我们当前可能用不上它,但是可以观察一下它的发展,说不准未来会有机会使用它,让我们静观其变吧~

点击“阅读原文”,直通公开课。
往期精彩回顾




浏览 60
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报