← Python and ROCm 教室へ戻る

第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)での出力例:

device: cuda shape : torch.Size([1024, 1024]) sec : 0.0012

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

synchronize() の意味(クリックで開く)

GPU の計算は非同期で動くため、synchronize() を入れないと「まだ終わっていないのに時間を読んでしまう」ことがあります。実験で正確な時間を測りたいときに必要です。ROCm 版でも torch.cuda.synchronize() という名前が使われます。

よくあるつまずき

1分演習

行列サイズを 2048 に変えて、時間がどう変わるかを見てみましょう。shape はどう表示されるかも合わせて確認します。CPU 環境では時間がかかる場合があります。