tinygrad - あなたはパイトーチが好きですか?あなたはマイクログラードが好きですか?あなたはちっぽけな人が大好きです!❤️

(You like pytorch? You like micrograd? You love tinygrad! ❤️ )

Created at: 2020-10-19 00:23:12
Language: Python
License: MIT


単体テスト

パイトーチカルパシー/マイクログラードの間の何かのために

これは最良のディープラーニングフレームワークではないかもしれませんが、ディープラーニングフレームワークです。

それのサブ1000ラインコアは

tinygrad/

その非常に単純なため、推論とトレーニングの両方をサポートし、新しいアクセラレータを追加するのが最も簡単なフレームワークになることを目指しています。シンプルな基本操作をサポートし、SOTAビジョン言語モデルを取得します。

models/efficientnet.py
models/transformer.py

私たちは、アップルニューラルエンジンとグーグルTPUのサポートに取り組んでいますフォルダ。最終的には、tinygrad用のカスタムハードウェアを構築し、目がくらむほど高速になります。今、それは遅いです。

accel/

取り付け

git clone https://github.com/geohot/tinygrad.git
cd tinygrad
python3 setup.py develop

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)  # dz/dx
print(y.grad)  # 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 が実装されています) を追加し、定型的なミニバッチ処理コードを記述すれば、必要なものがすべて揃います。

ニューラルネットワークの例(テスト/test_mnist.pyから)

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()

GPU とアクセラレータのサポート

tinygrad は PyOpenCL を通じて GPU をサポートしています。

from tinygrad.tensor import Tensor
(Tensor.ones(4,4).gpu() + Tensor.ones(4,4).gpu()).cpu()

ANEサポート?!(壊れた)

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

ブート引数を設定し、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を使用したい場合は、悪い時間を過ごす可能性があります。

フロップ(tensor.py)

フロップは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を書く必要はもうありません

アクセラレータの追加 (llops)

autodiffのものはすべてmlopsになっているので、生の操作に集中できます

Buffer                                                     # class of memory on this device
unary_op  (RELU, EXP, LOG, NEG, SIGN)                      # 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"環境変数を設定します。

ティニーグラードは安定した拡散をサポートしています!

走る

TORCH=1 python3 examples/stable_diffusion.py

(またはトーチなし:

OPT=2 OPENCL=1 python3 examples/stable_diffusion.py
)

「ベーグルを食べる馬サイズの猫」

ティニーグラードはGANをサポートしています

見る

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