最近,天才黑客
George Hotz
开源了一个小型深度学习框架
tinygrad
,兼具
PyTorch
和
micrograd
的功能。
tinygrad
的代码数量不到
1000
行,目前该项目获得了
GitHub 1400
星。
在深度学习时代,谷歌、
Facebook
、百度等科技巨头开源了多款框架来帮助开发者更轻松地学习、构建和训练不同类型的神经网络。而这些大公司也花费了很大的精力来维护
TensorFlow
、
PyTorch
这样庞大的深度学习框架。除了这类主流框架之外,开发者们也会开源一些小而精的框架或者库。比如今年
4
月份,特斯拉人工智能部门主管
Andrej Karpathy
开源了其编写的微型
autograd
引擎
micrograd
,该引擎还用
50
行代码实现了一个类
PyTorch api
的神经网络库。目前,
micrograd
项目的
GitHub star
量达到
1200
星。不久前,天才黑客
George Hotz
(乔治
·
霍兹)开源了一个小型
Autograd Tensor
库
tinygrad
,它介于
PyTorch
和
micrograd
之间,能够满足做深度学习的大部分要求。上线不到一个月,该项目在
GitHub
上已经获得
1400
星。
根据 GitHub 内容,下文对 tinygrad 的安装与使用做了简要介绍。感兴趣的同学也可通过 George Hotz 的 YouTube 视频进行学习。
视频地址:
https://www.youtube.com/channel/UCwgKmJM4ZJQRJ-U5NjvR2dg
tinygrad 的安装与使用
「tinygrad 可能不是最好的深度学习框架,但它确实是深度学习框架。」
George
在项目中保证,tinygrad 代码量会永远小于 1000 行。
tinygrad 的安装过程非常简单,只需使用以下命令:
安装好 tinygrad 之后,就可以进行示例运行,代码如下:
from tinygrad.tensor import Tensor
x = Tensor.eye(3)
y = Tensor([[2.0,0,-2.0]])
z = y.matmul(x).sum()
z.backward()
print(x.grad)
print(y.grad)
使用 torch 的代码如下:
import torch
x = torch.eye(3, requires_grad=True)
y = torch.tensor([[2.0,0,-2.0]], requires_grad=True)
z = y.matmul(x).sum()
z.backward()
print(x.grad)
print(y.grad)
满足对神经网络的需求
一个不错的autograd张量库可以满足你对神经网络 90%的需求。从 tinygrad.optim 添加优化器(SGD、RMSprop、Adam),再编写一些 minibatching 样板代码,就可以实现你的需求。
示例如下:
from tinygrad.tensor import Tensor
import tinygrad.optim as optim
from tinygrad.utils import layer_init_uniform
class TinyBobNet:
def __init__(self):
self.l1 = Tensor(layer_init_uniform(784, 128))
self.l2 = Tensor(layer_init_uniform(128, 10))
def forward(self, x):
return x.dot(self.l1).relu().dot(self.l2).logsoftmax()
model = TinyBobNet()
optim = optim.SGD([model.l1, model.l2], lr=0.001)
out = model.forward(x)
loss = out.mul(y).mean()
loss.backward()
optim.step()
tinygrad 通过 PyOpenCL 支持 GPU。但后向传播暂时无法支持所有 ops。
from tinygrad.tensor import Tensor
(Tensor.ones(4,4).cuda() + Tensor.ones(4,4).cuda()).cpu()
「麻雀虽小,五脏俱全。」tinygrad 还能够支持 full EfficientNet,输入一张图像,即可得到其类别。
ipython3 examples/efficientnet.py https://upload.wikimedia.org/wikipedia/commons/4/41/Chicken.jpg
如果你安装了 webcam 和 cv2,则可以使用以下代码:
ipython3 examples/efficientnet.py webcam
此外,乔治 · 霍兹还计划添加语言模型、检测模型,进一步减少代码量、提升速度等。
TODO
-
Train an EfficientNet on ImageNet
-
Make broadcasting work on the backward pass (simple please)
-
EfficientNet backward pass
-
Tensors on GPU (a few more backward)
-
Add a language model. BERT?
-
Add a detection model. EfficientDet?
-
Reduce code
-
Increase speed
-
Add features