Hugging Face Candleを触ってみた
はじめに
Hugging FaceがPyTorchライクなRust向けMLフレームワークである、Candleを公開していると知ったので初歩的な数値計算のコードを書きなながら、PyTorchとの違いを見てみようと思う。
Candleについて
前述の通り、PyTorchライクなRust向けMLフレームワーク。
サーバーレス推論を可能にする & GILのあるPythonの代替が主目標らしい。
また、CUDAだけでなく、将来的には、Apple SiliconのGPUをMPS経由で利用できるようにする計画もある。
実際に触ってみる
作業環境
- M1 MacBook Pro
- Rustのバージョン:
1.71.1
-
Cargo.toml
の中身は以下の通り。
単純なスカラー値同士の足し算
PyTorchとCandleでの記述方法を比較してみる。
まずは、PyTorchを使った記述をすると、以下のようになる。
x = torch.tensor(1.0, device="cpu")
y = torch.tensor(2.0, device="cpu")
z = x.add(y)
print(f"{x} + {y} = {z}")
次に、Candleを使った記述
単純なスカラー同士の足し算の場合は、ほぼ違いな見当たらない。
なお、Candleの方は x.to_scaler::<f32>()
とやっているが、これは PyTorchの .item()
と同等。
2次元配列同士のmatmul
1028×1028のランダムな2次元配列を生成して、matmulしてみよう。
まずは、PyTorchを使った記述をすると、以下のようになる。
a = torch.randn(1028, 1028)
b = torch.randn(1028, 1028)
c = a.matmul(b)
print(c)
次に、Candleを使った記述
Candleの方は、まず、mean
と std
を設定した上で、サイズを設定してあげる必要がある。
自動微分
最後に、自動微分を試してみる。
まずは、PyTorchを使った記述をすると、以下のようになる。
x = torch.tensor(3.0, requires_grad =True)
y = x.mul(x)
y.backward()
print(x.grad)
次に、Candleを使った記述
Candleで自動微分を行うには、Var
を使用する必要がある。
PyTorchでいう torch.tensor(..., requires_grad=True)
ってやるのと同じものと理解
(間違ってたら教えてください)
最後に
Candleはまだ新しいプロジェクトで安定していない部分もあるかもしれないが、今後の発展が楽しみだ。更なる進展に注目していきたい。
ちなみに、今回書いたコードはすべて以下のリポジトリに置いてある。
Discussion