第13章
小さなROCm実験コードを1本読めるようになりたい
最後は、短い実験コードを最初から最後まで自分で追う練習です。
今日は何をしたい?
「GPU を選ぶ」「tensor を作る」「計算する」「時間を見る」という流れが入った小さな実験コードを読んで、何を測っているのかを説明できるようにします。
実験コードを読むときは、この 3 つの観点 で追うと迷いにくくなります。
- device
- どこで計算しているか(CPU? GPU?)
- shape
- 入力と出力の大きさは何か
- timing
- どこからどこまでの時間を測っているか
確認コード
import time
import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 1024×1024 は GPU の計算力を確かめやすいサイズとして選んでいます
a = torch.randn(1024, 1024, device=device)
b = torch.randn(1024, 1024, device=device)
# CPU で実行するときは synchronize() は不要なので、GPU のときだけ呼んでいます
if device.type == "cuda":
torch.cuda.synchronize()
t0 = time.time()
c = a @ b
if device.type == "cuda":
torch.cuda.synchronize()
print("device:", device)
print("shape :", c.shape)
print("sec :", time.time() - t0)GPU 環境(ROCm)での出力例:
CPU 環境では sec の値が大きくなります(例: sec: 0.05 程度)。GPU と CPU の差がここに出ます。
最後の 3 行の print が、さきほどの 3 観点そのままです。「どこで」「何を」「どれくらいで」が読めれば、実験コードの入口として十分です。
ここまで来たら、第1章からの全体を振り返るとよい復習になります。お疲れさまでした!
第1章 GPU確認 → 第2章 配列 → 第3章 行列積 → 第4章 NumPy/Tensor → 第5章 .to(device) → 第6章 model → 第7章 eval+no_grad → 第8章 学習 → 第9章 推論vs学習 → 第10章 Conv2d → 第11章 Attention → 第12章 エラー読み → 第13章 実験コード
実行コマンド
ファイルを chapter13.py という名前で保存したら、ターミナルで次のコマンドを実行します。
python chapter13.pyどこがROCm?
GPU 実験では、時間を測る前後で同期を入れることがあります。ROCm 版 PyTorch でも torch.cuda.synchronize() という名前が出ますが、ここでも名前より役目を読むことが大切です。
ここで出てきたPython
- import time — 時間計測
- if device.type == "cuda" — GPU のときだけ同期
synchronize() の意味(クリックで開く)
GPU の計算は非同期で動くため、synchronize() を入れないと「まだ終わっていないのに時間を読んでしまう」ことがあります。実験で正確な時間を測りたいときに必要です。ROCm 版でも torch.cuda.synchronize() という名前が使われます。
よくあるつまずき
- 同期を入れないと、GPU の仕事がまだ終わっていないのに時間を読んでしまうことがあります。
- "cuda" という名前だけを見て、ROCm ではないと決めつけないようにします。
- まずは「どの device で」「何の shape を」「どれくらいの時間で」計算したかを読めれば十分です。
1分演習
行列サイズを 2048 に変えて、時間がどう変わるかを見てみましょう。shape はどう表示されるかも合わせて確認します。CPU 環境では時間がかかる場合があります。