← Python and ROCm 教室へ戻る

第4章

NumPyからPyTorchへ移りたい

ここでは、「数字の表」という見方を PyTorch の tensor にそのままつなげます。

今日は何をしたい?

NumPy の配列と PyTorch の tensor が、どちらも shape や dtype を持つ「数字のまとまり」だと分かることが目標です。まずは似ているところを見て、あとで GPU に進みやすくします。

確認コード

torch.tensor() の動作について(クリックで開く)

torch.tensor(x_np) は NumPy 配列のデータをコピーして PyTorch tensor を作ります。コピーなので、この後 NumPy 側を変えても tensor は変わりません(メモリを共有したい場合は torch.from_numpy(x_np) を使いますが、変更が連動するため混乱しやすく、最初は torch.tensor() を使うのが安全です)。

import numpy as np
import torch

x_np = np.array([[1, 2],
                 [3, 4]], dtype=np.float32)
x_t = torch.tensor(x_np)

print("--- NumPy ---")
print(x_np.shape, x_np.dtype)

print("--- PyTorch tensor ---")
print(x_t.shape, x_t.dtype, x_t.device)

このコードを chapter04.py というファイル名で保存して、python chapter04.py と実行します。

形はほぼ同じでも、PyTorch の tensor には .device という属性が加わっています。いまはまず、shape と dtype を同じ気分で読めることが大事です。

実行するとこう出ます

--- NumPy --- (2, 2) float32 --- PyTorch tensor --- torch.Size([2, 2]) torch.float32 cpu
device: cpu と出ていれば正常です。この章はGPUに乗せる前の準備 — 次章で cuda:0 に変わります。ROCm 環境でも cuda:0 と表示されます(第1章の torch.cuda と同じ理由です)。
表示の違いについて(クリックで開く)
  • shape の見え方が少し違います。NumPy は (2, 2)(タプル)、PyTorch は torch.Size([2, 2]) と表示されますが、意味は同じです。x_t.shape[0] で行数を取り出すのも NumPy と同じ書き方です。
  • dtype も表示が違います。NumPy は float32、PyTorch は torch.float32 と出ます。同じ型を指しています。
  • device: cpu と出ています。tensor を作っただけではまだ CPU 上です。GPU に乗っていないことを確認してください(次章で cuda に変わります)。

どこがROCm?

NumPy 配列は CPU 専用ですが、PyTorch tensor は .to("cuda") または .cuda() を呼ぶだけで GPU へ移動できます。ROCm 版 PyTorch では、この「cuda」という名前が AMD GPU(ROCm)への転送口になっています(第1章の torch.cuda と同じ理由です)。

現在 device: cpu と出ているのは「まだ GPU を使っていない」状態です。次章でこれを device: cuda:0 に変えると、第1章で確認した AMD GPU が実際に動き始めます。

PyTorch で tensor を直接作る方法

NumPy を経由せずに tensor を作ることもできます。演習で使うので確認しておきましょう。

# リストから直接作る(NumPy の np.array() に相当)
t1 = torch.tensor([[1, 2, 3],
                   [4, 5, 6]], dtype=torch.float32)

# ゼロで埋めた表を作る(NumPy の np.zeros() に相当)
t2 = torch.zeros(2, 3, dtype=torch.float32)

# 1 で埋めた表を作る
t3 = torch.ones(3, 4, dtype=torch.float32)

print(t1.shape, t1.device)
print(t2.shape, t2.device)

どれも作った直後は device: cpu です。shape / dtype の考え方は NumPy と同じです。

ここで出てきたPython

うまくいかなかったら

結果パターン別の次の一手(クリックで開く)
  • パターンA: device: cpu と出た → 正常。この章はクリア。次章で GPU に移動します。
  • パターンB: ModuleNotFoundError: No module named torch → torch 未導入。ROCm 版のインストールコマンドを PyTorch 公式サイトで確認(pip install torch は CUDA 版が入るので注意)。
  • パターンC: dtypetorch.float64 になった → NumPy 配列の dtype が float64 のままです。dtype=np.float32 を明示して作り直します。

よくあるつまずき

1分演習

NumPy を使わず、PyTorch だけで 2 行 3 列 の tensor を直接作って、shapedevice を表示してみましょう。上の「PyTorch で tensor を直接作る方法」セクションを参考にしてください。

確認したい点: ① shape が torch.Size([2, 3]) になっているか、② device が cpu と出ているか(この時点ではまだ cpu が正解です)。