パイトーチとカルパシー/マイクログラードの間の何かのために
これは最良のディープラーニングフレームワークではないかもしれませんが、ディープラーニングフレームワークです。
それのサブ1000ラインコアは
tinygrad/
その非常に単純なため、推論とトレーニングの両方をサポートし、新しいアクセラレータを追加するのが最も簡単なフレームワークになることを目指しています。シンプルな基本操作をサポートし、SOTAビジョンと言語モデルを取得します。
models/efficientnet.py
models/transformer.py
私たちは、フォルダ内のApple Neural EngineとGoogle TPUのサポートに取り組んでいます。最終的には、tinygrad用のカスタムハードウェアを構築し、目がくらむほど高速になります。今、それは遅いです。
accel/
このプロジェクトは、小さな株式会社によって維持されています。
git clone https://github.com/geohot/tinygrad.git
cd tinygrad
python3 -m pip install -e .
最近、ティニーグラードに多くの関心が寄せられています。貢献するためのガイドラインは次のとおりです。
from tinygrad.tensor import Tensor
x = Tensor.eye(3, requires_grad=True)
y = Tensor([[2.0,0,-2.0]], requires_grad=True)
z = y.matmul(x).sum()
z.backward()
print(x.grad.numpy()) # dz/dx
print(y.grad.numpy()) # dz/dy
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) # dz/dx
print(y.grad) # dz/dy
結局のところ、まともなautogradテンソルライブラリは、ニューラルネットワークに必要なものの90%です。tinygrad.nn.optim からオプティマイザ(SGD、RMSprop、および Adam が実装されています) を追加し、定型的なミニバッチ処理コードを記述すれば、必要なものがすべて揃います。
from tinygrad.tensor import Tensor
import tinygrad.nn.optim as optim
class TinyBobNet:
def __init__(self):
self.l1 = Tensor.uniform(784, 128)
self.l2 = Tensor.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)
# ... and complete like pytorch, with (x,y) data
out = model.forward(x)
loss = out.mul(y).mean()
optim.zero_grad()
loss.backward()
optim.step()
tinygrad は PyOpenCL を通じて GPU をサポートしています。
from tinygrad.tensor import Tensor
(Tensor.ones(4,4).gpu() + Tensor.ones(4,4).gpu()).cpu()
ReLUだけならラッキー!あなたは非常に速いReLUを行うことができます(少なくとも30メガレLU /秒が確認されています)
エンタイトルメントを追加するには、Python で署名する必要があります。でライブラリをビルドします
ane/lib/sign_python.sh
com.apple.ane.iokit-user-access
sudo nvram boot-args="amfi_get_out_of_my_way=1 ipc_control_port_options=0"
ane/lib/build.sh
boot-args を設定し、AMFI kext がその引数を尊重するには、リカバリモードで実行します。
csrutil enable --without-kext --without-nvram
from tinygrad.tensor import Tensor
a = Tensor([-2,-1,0,1,2]).ane()
b = a.relu()
print(b.cpu())
警告: ANE ポートに依存しないでください。セグメンテーション違反が発生することがあります。したがって、tinygradで何か重要なことをしていて、ANEを使用したい場合は、悪い時間を過ごす可能性があります。
フロップはMLOPSの周りの構文上の砂糖です。彼らはトーチがするほとんどのことをサポートします。
mlopは中間レベルの運用であり、15個あります。彼らはメモリ割り当てと派生物を理解しています
Relu, Log, Exp # unary ops Sum, Max # reduce ops (with axis argument) Add, Sub, Mul, Pow # binary ops (no broadcasting, use expand) Reshape, Permute, Slice, Expand, Flip # movement ops Conv2D(NCHW) # processing op (Matmul is also Conv2D)
新しいアクセラレータ用にmlopsを書く必要はもうありません
autodiffのものはすべてmlopsになっているので、生の操作に集中できます
Buffer # class of memory on this device unary_op (RELU, EXP, LOG, NEG, GT0) # A -> A reduce_op (SUM, MAX) # A -> B (smaller size, B has 1 in shape) binary_op (ADD, SUB, MUL, DIV, POW, CMPEQ) # A + B -> C (all the same size) movement_op (RESHAPE, PERMUTE, PAD, SHRINK, EXPAND, FLIP) # A -> B (different size) processing_op (CONV) # A + B -> C
tinygradが遅延評価に移行すると、ここで最適化が行われます。
小さいにもかかわらず、tinygradは完全なEfficientNetをサポートしています。それが何であるかを発見するために写真を渡してください。
ipython3 examples/efficientnet.py https://media.istockphoto.com/photos/hen-picture-id831791190
または、Webカメラとcv2がインストールされている場合
ipython3 examples/efficientnet.py webcam
PROTIP: これを高速化したい場合は、 "GPU = 1"環境変数を設定します。
PROPROTIP:遅い理由を確認したい場合は、 "DEBUG=1"環境変数を設定します。
安定した拡散の重みをダウンロードして、重みに入れる必要があるかもしれません/
走る
GPU=1 python3 examples/stable_diffusion.py
「ベーグルを食べる馬サイズの猫」
見る
examples/mnist_gan.py
見る
examples/yolov3.py
ティニーグラードは常に1000行未満になります。そうでない場合は、tinygradが小さくなるまでコミットを元に戻します。
GRAPH=1 python3 test/test_mnist.py TestMNIST.test_sgd_onestep
# requires dot, outputs /tmp/net.svg
python3 -m pytest