Re Reference AI

技術

PyTorch

動的計算グラフとPython親和性の高いAPIを特徴とする、オープンソースの機械学習フレームワーク

フレームワークPython

概要

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変換など追加の変換ステップが必要になることがある

比較

  • CUDAPyTorchはCUDAをバックエンドとして利用し、GPU上のテンソル演算を高レベルAPIから実行する

関連用語

CUDAGPU深層学習ニューラルネットワーク

参考文献