← Python and ROCm 教室へ戻る

第5章

データをGPUに送りたい

ここで初めて、「どこに置かれているデータか」をコードで意識します。

今日は何をしたい?

CPU にある tensor を GPU へ送って、device が変わる様子を見ます。計算そのものより、まずは「置き場所」を読めることが目標です。

確認コード

import torch

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
x = torch.tensor([[1.0, 2.0]], dtype=torch.float32)

print("before:", x.device)
x = x.to(device)
print("after :", x.device)

このコードを chapter05.py として保存して、python chapter05.py で実行します。

GPU 環境なら、こう表示されます。

before: cpu after : cuda:0

GPU がない環境では aftercpu のままになります。それはエラーではなく、CPU で実行されている正常な状態です。

beforeafter を見比べるだけで、データがどこにあるかを追えるようになります。

cuda:0 と出ていれば、GPU への転送は成功です。cpu のままでもエラーではありません — GPU がない環境ではそれが正常です。

どこがROCm?

ROCm 版 PyTorch でも、GPU を指す場所で "cuda" という名前が出ます。名前に引っ張られず、「GPU 側へ送るための入口」と読むのがコツです。

出力の cuda:0 は、ROCm 経由で接続されている AMD GPU の 0 番を指しています。第1章で torch.cuda.is_available()True になっていた GPU が、ここで初めて実際にデータを受け取ります。

ここで出てきたPython

よくあるつまずき

device が混ざるとどうなるか、見てみましょう。

device 不一致のエラー例(クリックで開く)
# device 不一致の例
import torch
import torch.nn as nn

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = nn.Linear(2, 1)          # CPU のまま
x = torch.tensor([[1.0, 2.0]], device=device)  # GPU

try:
    model(x)
except RuntimeError as e:
    print(e)
Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!

model.to(device) を足すか、x を CPU に戻せば解消します。

1分演習

コードの最後に print(x) を足して、値そのものは同じでも置き場所だけが変わることを見てみましょう。