🤗

Hugging Face Candleを触ってみた

2023/08/11に公開

はじめに

Hugging FaceがPyTorchライクなRust向けMLフレームワークである、Candleを公開していると知ったので初歩的な数値計算のコードを書きなながら、PyTorchとの違いを見てみようと思う。

https://github.com/huggingface/candle

Candleについて

前述の通り、PyTorchライクなRust向けMLフレームワーク。
サーバーレス推論を可能にする & GILのあるPythonの代替が主目標らしい。

また、CUDAだけでなく、将来的には、Apple SiliconのGPUをMPS経由で利用できるようにする計画もある。
https://github.com/huggingface/candle/issues/313

実際に触ってみる

作業環境

  • M1 MacBook Pro
  • Rustのバージョン: 1.71.1
  • Cargo.toml の中身は以下の通り。

https://github.com/khirotaka/hello-candle/blob/2c79188be829c973d96065b66f16ef317375d533/simple-ops/Cargo.toml#L1-L9

単純なスカラー値同士の足し算

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を使った記述
https://github.com/khirotaka/hello-candle/blob/2c79188be829c973d96065b66f16ef317375d533/simple-ops/src/main.rs#L8-L19

単純なスカラー同士の足し算の場合は、ほぼ違いな見当たらない。
なお、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を使った記述

https://github.com/khirotaka/hello-candle/blob/2c79188be829c973d96065b66f16ef317375d533/simple-ops/src/main.rs#L21-L26

Candleの方は、まず、meanstd を設定した上で、サイズを設定してあげる必要がある。

自動微分

最後に、自動微分を試してみる。
まずは、PyTorchを使った記述をすると、以下のようになる。

x = torch.tensor(3.0, requires_grad =True)
y = x.mul(x)

y.backward()

print(x.grad)

次に、Candleを使った記述

https://github.com/khirotaka/hello-candle/blob/2c79188be829c973d96065b66f16ef317375d533/simple-ops/src/main.rs#L28-L40

Candleで自動微分を行うには、Var を使用する必要がある。
PyTorchでいう torch.tensor(..., requires_grad=True) ってやるのと同じものと理解
(間違ってたら教えてください)

最後に

Candleはまだ新しいプロジェクトで安定していない部分もあるかもしれないが、今後の発展が楽しみだ。更なる進展に注目していきたい。

ちなみに、今回書いたコードはすべて以下のリポジトリに置いてある。
https://github.com/khirotaka/hello-candle

Discussion