PyTorch
動的計算グラフとPython親和性の高いAPIを特徴とする、オープンソースの機械学習フレームワーク
概要
PyTorchは、Meta(旧Facebook)のAI研究部門が開発したオープンソースの機械学習フレームワーク。 テンソル演算とGPUアクセラレーションを提供する基盤ライブラリの上に、ニューラルネットワークの構築・学習を支援する高レベルAPIを備える。 計算グラフを実行時に動的に構築するdefine-by-run方式を採用しており、Pythonの制御構文をそのままモデル定義に使える柔軟さから、研究分野を中心に広く採用されている。 内部ではCUDAを介してGPU上のテンソル演算を実行する。
背景
深層学習モデルの研究では、モデル構造を試行錯誤しながら素早く実装・検証するニーズが強い。 従来の静的計算グラフ方式のフレームワークはグラフ定義と実行が分離されデバッグが難しかったため、Python本来の制御フローと自然に統合できる動的計算グラフ方式のフレームワークとしてPyTorchが開発された。
歴史
2016年: FacebookのAI研究部門(FAIR)がPyTorchを公開。 2018年: Caffe2の機能を統合。 2022年: プロジェクトの中立性を高めるためLinux Foundation傘下のPyTorch Foundationに移管。 研究コミュニティでの採用が広がり、TensorFlowと並ぶ主要な深層学習フレームワークの一つとなった。
アーキテクチャ
多次元配列を扱うTensorクラスを中核とし、GPU上での演算はCUDAバックエンドに委譲される。 `autograd`機構が演算履歴を動的に記録し、逆伝播時に自動微分で勾配を計算する。 `nn.Module`によってレイヤーやモデルをオブジェクト指向的に定義・合成できる。
ワークフロー
モデルを`nn.Module`のサブクラスとして定義 → 入力データをTensorとしてモデルに渡し順伝播 → 損失関数で誤差を計算 → `backward()`で自動微分により勾配を計算 → オプティマイザでパラメータを更新、を反復する。
コード例
PyTorchでの学習ループの基本形
import torch
import torch.nn as nn
model = nn.Linear(10, 1)
optimizer = torch.optim.Adam(model.parameters())
loss_fn = nn.MSELoss()
for inputs, targets in dataloader:
optimizer.zero_grad()
outputs = model(inputs)
loss = loss_fn(outputs, targets)
loss.backward()
optimizer.step()利点
- 動的計算グラフによりPythonの制御構文をそのまま使え、デバッグ・試行錯誤がしやすい
- 研究コミュニティでの採用が広く、最新の論文実装が公開されやすい
- CUDAとの統合が整備されており、GPU学習への切り替えが容易
欠点
- 動的グラフゆえに、静的グラフ方式に比べて実行前の最適化がしにくい場面がある
- 本番環境へのデプロイには`TorchScript`やONNX変換など追加の変換ステップが必要になることがある
比較
- CUDA — PyTorchはCUDAをバックエンドとして利用し、GPU上のテンソル演算を高レベルAPIから実行する
関連用語
参考文献
- Official WebsitePyTorch
- DocumentationPyTorch Documentation