STACK / TENSOR · AUTOGRAD · DEVICE
PyTorchML FRAMEWORK
機械学習の計算を、Pythonで組み立てて動かす
PyTorchは、テンソル(Tensor)と呼ばれる多次元配列と自動微分を中心に、機械学習モデルを柔軟に組み立てるためのPythonフレームワークです。NVIDIA GPUならCUDA、Apple SiliconならMPS、アクセラレータがなければCPUへと、同じコードのまま実行先を切り替えられます。
データをデバイスへ移し、並列計算を実行して結果を戻します。
CONTENTSこの記事の目次+
01 — POSITION
PyTorchとは
何か
PyTorchでは、画像や文章などのデータをテンソルとして表現し、nn.Moduleでモデル構造を定義し、損失関数から勾配を逆伝播してオプティマイザで重みを更新します。Pythonで記述した処理の裏側では、選択したデバイスに応じた最適化演算カーネルが動作します。
02 — COMPUTE PIPELINE
データが計算結果へ
変わるまで
CPUとGPUの役割を分け、どこでデータが動くのかを順番に見ます。
テンソルをデバイスに配置し、順伝播で計算グラフを構築。誤差から自動微分(Autograd)で各重みの勾配を逆伝播計算します。
データをTensorへ
画像、テキスト、数値データなどの入力を、形状(shape)とデータ型(dtype)を持つテンソルに変換します。
→Layerを順に通す
nn.Moduleで定義した各層(レイヤー)がテンソルを順次変換し、予測値を出力します。
→Lossから勾配を計算
計算グラフを逆方向にたどる自動微分(backward)により、各パラメータ(重み)の勾配を算出します。
→Weightを更新する
オプティマイザが算出した勾配に基づいて重みを更新し、次のバッチ処理へ進みます。
小さなデータでは移動の時間が勝つこともあるため、計算量と転送量を一緒に見積もります。
03 — LAYER MAP
PyTorchの下でCUDAが計算を担当する
PyTorchのコードは、テンソルをどのデバイスに配置するかによって実行先が切り替わります。NVIDIA GPUを指定すればCUDAへ、Apple Siliconを指定すればMPSへ演算が渡されます。
model(x)を書く
開発者はPythonコードでデータセット、モデル構造、損失関数、オプティマイザを組み立てます。
→Deviceを選ぶ
テンソルとモデルが配置されたデバイスに応じて、背後で動くバックエンドと演算カーネルが決定されます。
→Backendが実行する
NVIDIAではCUDA、Apple SiliconではMetal系のMPSが演算を受け持ちます。
→結果を返す
選択したGPUまたはCPU上で演算を実行し、得られた結果を次のレイヤーや損失関数の計算へ渡します。
PyTorchは上位のAPI、CUDAやMPSはDeviceごとのBackendです。役割を分けて考えると、MacでCUDAがなくても学習を始められます。
データと演算を表す
テンソルの形状・データ型・配置デバイスを意識しながら、行列演算やモデルの入力パイプラインを組み立てます。
学習の計算を自動化
順伝播(forward)で記録された計算履歴から、逆伝播(backward)によって各重みの勾配を自動計算します。
CUDA・MPS・CPUへつなぐ
同じPyTorchのコードでもデバイスごとに裏側の実装が異なるため、実行環境ごとの動作確認が重要です。
04 — QUICK START
使えるDeviceを選んで計算する
利用可能な環境に応じてCUDA、Apple SiliconのMPS、CPUの順に自動フォールバックする最小実装例です。モデル側にも同じデバイスを指定して整合性を保ちます。
import torch
if torch.cuda.is_available():
device = torch.device("cuda")
elif hasattr(torch.backends, "mps") and torch.backends.mps.is_available():
device = torch.device("mps")
else:
device = torch.device("cpu")
x = torch.tensor([1.0, 2.0, 3.0], device=device)
print(device, x * 2)
# model.to(device) も忘れない01CHECK CUDAおよびMPSの利用可否を実行時に自動判定
02MOVE テンソルとモデルを同一のデバイスへ配置
03FALLBACK GPUがなくてもCPUで学習の流れを試せる
05 — CHOOSE YOUR DEVICE
手元の環境に
合わせる
「CUDAがないと機械学習できない」わけではありません。使えるバックエンドを確認してから始めます。
CUDAで高速化する
LinuxやWindowsのNVIDIA GPU環境では、PyTorch公式サイトの「Start Locally」からOS・パッケージ管理・Python・CUDAの組み合わせを選択してインストールします。導入後はtorch.cuda.is_available()がTrueを返すことを確認します。
MPSでMacのGPUを使う
Apple Silicon搭載MacではCUDAの代わりにMPSバックエンドを利用します。torch.backends.mps.is_available()がTrueになることを確認し、device="mps"を指定してテンソルとモデルを転送します。
CPUやROCmも選択肢
まずはコードの書き方や学習の流れを学ぶだけであればCPU環境でも十分に動作します。また、Linux上でAMD製GPUを利用する場合は、PyTorch公式のROCm対応ビルドを選択します。
06 — WATCH OUT
最初につまずきやすい
3つの点
GPUが見えること、速くなること、安定して動くことは別々に確認します。
TensorとModelのDeviceをそろえる
CPU上の入力テンソルをGPU上のモデルへ直接渡すことはできません。x.to(device)とmodel.to(device)のように共通のdevice変数を指定することで、デバイス不一致エラー(Device mismatch)を未然に防げます。
形状と型も計算の契約
GPUが正常に認識されていても、バッチ次元の欠落やデータ型(dtype)の不一致があると計算エラーになります。まずは小さなテンソルを使ってshape、dtype、deviceの3点を出力し、期待通りか確認する習慣をつけます。
GPUがあれば必ず速いわけではない
小規模なモデルや軽量な処理では、GPUの初期化やCPU・GPU間のデータ転送にかかるオーバーヘッドの方が大きくなり、かえって遅くなることがあります。バッチサイズをまとめて処理効率を上げ、実際の処理時間を計測した上で適切なデバイスを選択します。
IN ONE SENTENCE
PyTorchとは?
テンソル計算と自動微分を中心に、機械学習モデルの構築から学習・推論までをPythonで柔軟に記述し、CUDA・MPS・CPUで実行できるフレームワーク。
SOURCES / OFFICIAL DOCS
