第0章 — Docker
Quickstart で「動いた」ことを確認しましたか? ここでは、あのとき作った compose.yaml が 何をしていたのか を1行ずつ理解します。
Docker ルートでは、ホストの GPU をコンテナ越しに使っています。下から順に見るとこうです:
コンテナとは: 「使い捨ての作業箱」のようなものです。中で何をしてもホスト(自分の PC) 環境には影響しません。うまくいかなかったらコンテナを消して作り直せます。
Quickstart で作った compose.yaml は、実はいくつかの設定を重ねたものです。段階的に見てみましょう。
最もシンプルな compose.yaml はこれだけです。
services:
rocm:
image: ubuntu:22.04
tty: trueservices: — 「使いたいコンテナの一覧」を書く場所rocm: — このコンテナに付ける名前(好きな名前でOK)image: — 使う Docker イメージtty: true — コマンドを打てる対話モードにする
これだけでも docker compose run --rm rocm でコンテナに入れます。ただし中身はただの Ubuntu で、Python も GPU も使えません。
イメージを AMD が公開している rocm/pytorch に変えるだけで、Python と ROCm と PyTorch が全部入ります。
services:
rocm:
image: rocm/pytorch:latest
tty: trueこれでコンテナ内で python3 や import torch が使えます。
ただし、まだ GPU デバイスをコンテナに渡していないので、rocminfo では GPU が見えません。
コンテナの「境界」を越えてホストの GPU にアクセスするために、デバイスと権限を明示的に渡します。
services:
rocm:
image: rocm/pytorch:latest
tty: true
devices:
- /dev/kfd
- /dev/dri
group_add:
- videodevices: /dev/kfd — ROCm のカーネルドライバ(KFD)をコンテナに渡す。これがないと GPU にアクセスできない。devices: /dev/dri — DRM(Direct Rendering Manager)デバイスを渡す。GPU のレンダリング機能に必要。group_add: video — GPU デバイスファイルの読み書き権限を追加。
devices と group_add は、上のレイヤー図の「🐳 Docker コンテナの境界」を越えて GPU へのアクセスを通すための設定です。
この段階で rocminfo と torch.cuda.is_available() が動きます。
render グループも必要になることがあります。そのときは group_add に render を追加してください。
最後に、ホスト側のフォルダをコンテナ内で使えるようにし、入った瞬間に作業ディレクトリに立つようにします。Quickstart で作った compose.yaml はこの状態です。
services:
rocm:
image: rocm/pytorch:latest
tty: true
stdin_open: true
devices:
- /dev/kfd
- /dev/dri
group_add:
- video
volumes:
- .:/workspace
working_dir: /workspacestdin_open: true — コンテナの標準入力を開いたままにする(docker run の -i に相当)。volumes: .:/workspace — compose.yaml があるフォルダ(.)をコンテナ内の /workspace に結びつける。ホスト側でファイルを編集すると、コンテナ内にも反映されます。working_dir: /workspace — コンテナに入った瞬間に /workspace に立つようにする。
これが Quickstart で使った完成形です。GPU アクセス・Python 環境・ファイル共有がすべて揃っています。
compose.yaml がやっていることを docker run で書き直すと、こうなります:
docker run -it --rm \
--device=/dev/kfd \
--device=/dev/dri \
--group-add video \
-v "$PWD":/workspace \
-w /workspace \
rocm/pytorch:latest| compose.yaml | docker run フラグ |
|---|---|
image: rocm/pytorch:latest |
rocm/pytorch:latest(末尾) |
tty: true + stdin_open: true |
-it |
devices: - /dev/kfd |
--device=/dev/kfd |
group_add: - video |
--group-add video |
volumes: - .:/workspace |
-v "$PWD":/workspace |
working_dir: /workspace |
-w /workspace |
compose.yaml に書いておけば毎回フラグを打たなくて済みます。繰り返す設定は設定ファイルに寄せる — これは Docker に限らず、開発全般で使える考え方です。
コンテナ内で rocminfo を実行しました。これは ROCm のランタイムが GPU を認識しているかを確認するツール です。
rocminfo は「ホスト → Docker → ROCm ランタイム → GPU」の経路が通っているかの最初のチェックポイントです。
rocminfo の出力で見るべきところ:
gfx1100)rocm/pytorch は、AMD が公開している Docker イメージです。
torch.cuda が AMD GPU で動くビルドつまり、ネイティブ Linux では自分でやる ROCm のインストールと PyTorch の導入が、すでにコンテナの中で終わっています。だから Quickstart の Docker ルートはステップが少なかったのです。
python3 -c "import torch; print(torch.version.hip)"rocm/pytorch イメージを使っていれば ROCm 版が入っていますが、自分でパッケージを追加した場合は CPU 版が紛れ込むこともあります。torch.version.hip がバージョン番号を返せば ROCm 版です。
torch.cuda という名前なのに AMD GPU?cuda という名前にしています。ROCm 版でもこの名前はそのまま使います。名前は CUDA でも、中身は ROCm が動いています。詳しくは第1章で。
この講座では Docker とネイティブ Linux の2つのルートを用意しています。
| ネイティブ | Docker | |
|---|---|---|
| ROCm のインストール | 自分でやる | コンテナに入っている |
| 環境の独立性 | venv で分離 | コンテナ自体が分離 |
| やり直し | venv を消して作り直す | コンテナを消して起動し直す |
| 起動コマンド | source ~/rocm-env/bin/activate |
docker compose run --rm rocm |
| 向いている人 | Linux をそのまま使いたい | 環境を汚したくない |
第1章以降は、どちらのルートでも同じコードで進めます。
ここまでに出てきた 3 つの確認方法を整理します。
| コマンド | 確認できること | 確認する層 |
|---|---|---|
rocminfo |
ROCm ランタイムから GPU が見えるか | ドライバ〜ランタイム |
torch.version.hip |
PyTorch が ROCm 版かどうか | PyTorch |
torch.cuda.is_available() |
PyTorch から GPU が使えるか | PyTorch〜ランタイム〜ドライバ |
rocminfo は Python なしで使えるので、まずはここから。torch.version.hip は PyTorch の種類判定。torch.cuda.is_available() は全層を通した最終チェックです。
compose.yaml の devices と group_add が「GPU をコンテナに渡す」設定だとわかったrocminfo が「ROCm のランタイムから GPU が見えるかの確認」だとわかったrocm/pytorch イメージに ROCm と PyTorch がすでに入っていることがわかったtorch.version.hip が「ROCm 版 PyTorch かどうかの目安」だとわかったtorch.cuda が AMD GPU でも使う API 名だと知った