LinuxではAMDのグラフィックボードでPytorchが動くようになってきています。では、Windowsではどうでしょう? 実際のところ、Windows上ではROCmが部分対応の状況でまだ制約があるようです。それでも、ごく簡単な学習までは動いたので、その手順を記します。
この手順は AMD Software: PyTorch on Windows Edition 7.1.1 を前提に、Python venv で PyTorch(ROCm SDK 7.1.1)を導入し、動作確認(テスト #1〜#4)まで行うまとめです。
0. 前提(重要)
- ドライバー要件:PyTorch on Windows 7.1.1 では Graphics driver 25.20.01.17 が必須
- Python:ROCm Windows wheels は Python 3.12(cp312)前提
-
DataLoader:安定性のため、まず
pin_memory=Falseをデフォルト推奨-
pin_memoryは転送高速化(pinned memory)に有効だが、環境によっては終了時の挙動に影響することがあるため、まず安定側で固める
-
1. 既存の AMD ドライバー / AMD Software を外す(推奨)
1-1) 通常のアンインストール
- Windows 設定 → アプリ → インストールされているアプリから AMD Softwareをアンインストール
- 再起動
1-2) 問題が残る場合は AMD Cleanup Utility
- AMD Cleanup Utility を使う(セーフモード推奨)
- 実行後に再起動
2. AMD Software: PyTorch on Windows Edition 7.1.1 をインストール
- AMD公式の PyTorch on Windows Edition 7.1.1 をインストール
- この段階で「Driver Version」が 25.20.01.17 になっていることが前提
確認の目安:AMD Software の「Settings → System → Software」等で Driver Version を確認。
3. Python 3.12 + venv を作成
PowerShell 例:
py -3.12 -m venv .venv
.\.venv\Scripts\activate
python -V # 3.12.x を確認
python -m pip install -U pip
4. PyTorch(ROCm SDK 7.1.1)を pip で導入
ROCm docs の「Install PyTorch via PIP」に沿って導入します。
# ROCm SDK components
pip install --no-cache-dir `
https://repo.radeon.com/rocm/windows/rocm-rel-7.1.1/rocm_sdk_core-0.1.dev0-py3-none-win_amd64.whl `
https://repo.radeon.com/rocm/windows/rocm-rel-7.1.1/rocm_sdk_devel-0.1.dev0-py3-none-win_amd64.whl `
https://repo.radeon.com/rocm/windows/rocm-rel-7.1.1/rocm_sdk_libraries_custom-0.1.dev0-py3-none-win_amd64.whl `
https://repo.radeon.com/rocm/windows/rocm-rel-7.1.1/rocm-0.1.dev0.tar.gz
# torch / torchvision / torchaudio (PyTorch 2.9 + ROCm SDK 7.1.1)
pip install --no-cache-dir `
https://repo.radeon.com/rocm/windows/rocm-rel-7.1.1/torch-2.9.0+rocmsdk20251116-cp312-cp312-win_amd64.whl `
https://repo.radeon.com/rocm/windows/rocm-rel-7.1.1/torchaudio-2.9.0+rocmsdk20251116-cp312-cp312-win_amd64.whl `
https://repo.radeon.com/rocm/windows/rocm-rel-7.1.1/torchvision-0.24.0+rocmsdk20251116-cp312-cp312-win_amd64.whl
4-1) インストール後の簡易確認(推奨)
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"
注意:
torchvision/torchaudioの導入時に pip が依存解決で CPU版 torch を上書きしてしまうケースが報告されています。
期待:2.9.0+rocmsdk.../ 実際:2.9.1+cpuのように変わる場合は再導入を検討。
5. 動作確認(テスト #1〜#4)
テスト #1:GPU認識
python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"
期待例:
TrueAMD Radeon(TM) 8060S Graphics
テスト #2:行列積(GEMM)
rocm_test2.py
import time, torch
assert torch.cuda.is_available()
x = torch.randn(4096, 4096, device="cuda", dtype=torch.float16)
torch.cuda.synchronize()
t0 = time.time()
y = x @ x
torch.cuda.synchronize()
print("ok", y.shape, "sec", time.time() - t0)
テスト #3:Conv2d
rocm_test3.py
import torch
import torch.nn as nn
m = nn.Conv2d(64, 128, 3, padding=1).cuda().half()
x = torch.randn(32, 64, 64, 64, device="cuda", dtype=torch.float16)
y = m(x)
torch.cuda.synchronize()
print(y.shape)
テスト #4:CIFAR-10 学習(スモーク:短め)
- 初回は CIFAR-10 の ダウンロードが走るため遅く見えることがあります
- 終了しない問題が出た場合は、データセットで
pin_memory=Trueしていないか確認。pin_memory=Falseで運用
rocm_test4.py
import time
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
device = "cuda" if torch.cuda.is_available() else "cpu"
print("device:", device)
if device == "cuda":
print("gpu:", torch.cuda.get_device_name(0))
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),
])
train_ds = datasets.CIFAR10(root="./data", train=True, download=True, transform=transform)
test_ds = datasets.CIFAR10(root="./data", train=False, download=True, transform=transform)
# 安定優先:pin_memory=False
train_loader = DataLoader(train_ds, batch_size=128, shuffle=True, num_workers=0, pin_memory=False)
test_loader = DataLoader(test_ds, batch_size=128, shuffle=False, num_workers=0, pin_memory=False)
model = nn.Sequential(
nn.Conv2d(3, 32, 3, padding=1), nn.ReLU(),
nn.Conv2d(32, 64, 3, padding=1), nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(64, 128, 3, padding=1), nn.ReLU(),
nn.MaxPool2d(2),
nn.Flatten(),
nn.Linear(128*8*8, 256), nn.ReLU(),
nn.Linear(256, 10),
).to(device)
opt = optim.Adam(model.parameters(), lr=1e-3)
crit = nn.CrossEntropyLoss()
# train (short)
model.train()
t0 = time.time()
for step, (x, y) in enumerate(train_loader, start=1):
x, y = x.to(device), y.to(device)
opt.zero_grad(set_to_none=True)
out = model(x)
loss = crit(out, y)
loss.backward()
opt.step()
if step % 50 == 0 or step == 1:
acc = (out.argmax(1) == y).float().mean().item()
print(f"epoch 1 step {step} loss {loss.item():.4f} acc {acc*100:.1f}%")
if step >= 350: # 短めに切る(必要なら外す)
break
if device == "cuda":
torch.cuda.synchronize()
print(f"train done: {time.time()-t0:.1f}s")
# eval (short)
model.eval()
correct = 0
total = 0
with torch.no_grad():
for step, (x, y) in enumerate(test_loader, start=1):
x, y = x.to(device), y.to(device)
out = model(x)
pred = out.argmax(1)
correct += (pred == y).sum().item()
total += y.numel()
if step >= 50:
break
print(f"eval (first 50 batches): acc {100.0*correct/total:.2f}%")
print("OK")
6. 参考リンク(公式・一次情報中心)
-
AMD:PyTorch on Windows Edition 7.1.1 Release Notes
-
ROCm Docs:PyTorch via PIP installation(Windows)
-
AMD:AMD Cleanup Utility(セーフモード推奨の記載あり)
-
PyTorch Docs:pinned memory / non_blocking の解説(チュートリアル)
-
AMD: PyTorch on Windows Edition 7.1.1 Release Notes: https://www.amd.com/en/resources/support-articles/release-notes/RN-AMDGPU-WINDOWS-PYTORCH-7-1-1.html
-
ROCm Docs: PyTorch via PIP installation (Windows): https://rocm.docs.amd.com/projects/radeon-ryzen/en/latest/docs/install/installryz/windows/install-pytorch.html
-
AMD: AMD Cleanup Utility: https://www.amd.com/en/resources/support-articles/faqs/GPU-601.html
-
PyTorch Tutorial: pin_memory() and non_blocking: https://docs.pytorch.org/tutorials/intermediate/pinmem_nonblock.html
-
ROCm issue: pip resolver may overwrite ROCm torch with CPU torch: https://github.com/ROCm/ROCm/issues/5733