ankane/torch.rb

Deep learning for Ruby, powered by LibTorch

Torch.rb – Rubyのためのディープラーニング

概要

  • FacebookのLibTorch(PyTorchのC++コア)をラップするRuby gemであり、RubyでPyTorchスタイルのディープラーニングコードを記述・実行できます。
  • PyTorchのPython APIを密接にミラーリングしつつ、Rubyらしい調整(例:インプレース操作用の add!、ブール値チェック用の tensor?、NumPyの代わりに Numo 配列を使用)が加えられています。

主要コンポーネント

  • Tensor操作 – 作成(Torch.rand, Torch.zeros など)、算術演算、インデックス参照、Numo::NArray との相互変換。
  • Autogradrequires_grad, backward, および .grad を介した勾配アクセスによる自動微分。
  • ニューラルネットワーク・モジュールTorch::NN::Module をサブクラス化してモデルを定義し、Conv2d, Linear などのレイヤーや Torch::NN::F 配下の関数ヘルパーを使用します。
  • オプティマイザ – 例:Torch::Optim::SGD を使用した、典型的な zero_grad, step ワークフロー。
  • 保存/読み込み – モデルの状態辞書(state dict)のための Torch.save / Torch.load(PyTorchファイルと互換性がありますが、Python側での小さな変換に関する注記があります)。
  • デバイスサポート – CPU、CUDA GPU(Torch::CUDA.available?, net.cuda)、AppleシリコンのMetal(Torch::Backends::MPS)。

インストール方法

  1. プラットフォームに適合するLibTorchビルド(CPU専用またはCUDA対応)をダウンロードします。macOS arm64の例:
    curl -L https://download.pytorch.org/libtorch/cpu/libtorch-macos-arm64-2.14.0.zip > libtorch.zip
    unzip -q libtorch.zip
    
  2. GemがLibTorchの場所を認識できるように設定し、Gemfile に追加します:
    bundle config set build.torch-rb --with-torch-dir=/path/to/libtorch
    
    gem "torch-rb"
    
  3. bundle install を実行します。コンパイルには約5〜10分かかります。Windowsはサポートされていません。

はじめに

  • tutorials/blitz/README.md にある60分間のブリッツ・チュートリアルに従ってください。
  • その他のチュートリアルでは、転移学習、シーケンスモデル、および単語埋め込み(word embeddings)を扱います。
  • サンプルプロジェクトには、MNIST画像分類、MovieLensコラボレーティブ・フィルタリング、およびGANが含まれます。

典型的なワークフロー(Rubyコード)

# シンプルなCNNを定義
class MyNet < Torch::NN::Module
  def initialize
    super()
    @conv1 = Torch::NN::Conv2d.new(1, 6, 3)
    @conv2 = Torch::NN::Conv2d.new(6, 16, 3)
    @fc1   = Torch::NN::Linear.new(16*6*6, 120)
    @fc2   = Torch::NN::Linear.new(120, 84)
    @fc3   = Torch::NN::Linear.new(84, 10)
  end

  def forward(x)
    x = Torch::NN::F.max_pool2d(Torch::NN::F.relu(@conv1.call(x)), [2,2])
    x = Torch::NN::F.max_pool2d(Torch::NN::F.relu(@conv2.call(x)), 2)
    x = Torch.flatten(x, 1)
    x = Torch::NN::F.relu(@fc1.call(x))
    x = Torch::NN::F.relu(@fc2.call(x))
    @fc3.call(x)
  end
end

net = MyNet.new
input = Torch.randn(1,1,32,32)
output = net.call(input)

criterion = Torch::NN::MSELoss.new
target = Torch.randn(10).view(1,-1)
loss = criterion.call(output, target)

optimizer = Torch::Optim::SGD.new(net.parameters, lr: 0.01)
optimizer.zero_grad
loss.backward
optimizer.step

デバイスの扱い

if Torch::CUDA.available?
  net.cuda               # モデルをGPUに移動
  input = input.cuda
end

またはAppleシリコンの場合:

if Torch::Backends::MPS.available?
  device = Torch.device('mps')
  net.to(device)
end

エコシステム

  • 特定のドメイン向けのコンパニオンGem:torchvision-ruby, torchtext-ruby, torchaudio-ruby, torchcodec-ruby, torchrec-ruby, torchdata-ruby
  • 高レベルなツール:transformers-ruby(Transformerモデル)および safetensors-ruby(効率的なテンソル保存)。

なぜ重要なのか

  • 言語を切り替えることなく、Ruby開発者が最新のディープラーニング・モデルを試行錯誤できるようになります。
  • PyTorchで使用されているものと同じ高性能なC++バックエンドを活用するため、モデルはCPUまたはGPU上でネイティブ速度で動作します。
  • 親しみやすいAPIを通じて、Rubyコミュニティを、急速に進化するPyTorchエコシステムと同期させることができます。

リソース

  • ビルドステータス・バッジは、複数のプラットフォームでのCIテストを示しています。
  • 詳細な変更履歴、コントリビューション・ガイド、およびGPUテスト用のスクリプト(AWS Deep Learning AMI)が提供されています。

Torch.rbはPyTorchのパワーをRubyに持ち込み、Rubyプログラマーにとってネイティブに感じられる、フル機能でGPU加速されたディープラーニング・スタックを提供します。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト