← 教室トップへ

第0章 — Docker

環境のしくみを理解する

Quickstart で「動いた」ことを確認しましたか? ここでは、あのとき作った compose.yaml何をしていたのか を1行ずつ理解します。

アカツキちゃん — Docker ルート
この章の前提: Quickstart(Docker) が終わっていることを前提にしています。まだの方は先にそちらをどうぞ。

全体の構造 — 何がどこにいるのか

Docker ルートでは、ホストの GPU をコンテナ越しに使っています。下から順に見るとこうです:

あなたのコード(Python)
PyTorch(ROCm 版)
ROCm ランタイム(HIP, rocBLAS など)
──── 🐳 Docker コンテナの境界 ────
カーネルドライバ(amdgpu — ホスト側)
🖥️ GPU ハードウェア

コンテナとは: 「使い捨ての作業箱」のようなものです。中で何をしてもホスト(自分の PC) 環境には影響しません。うまくいかなかったらコンテナを消して作り直せます。

compose.yaml を1行ずつ理解する

Quickstart で作った compose.yaml は、実はいくつかの設定を重ねたものです。段階的に見てみましょう。

Stage 1: 最小の compose — Docker だけ

最もシンプルな compose.yaml はこれだけです。

services:
  rocm:
    image: ubuntu:22.04
    tty: true
💡 それぞれの意味:
services: — 「使いたいコンテナの一覧」を書く場所
rocm: — このコンテナに付ける名前(好きな名前でOK)
image: — 使う Docker イメージ
tty: true — コマンドを打てる対話モードにする

これだけでも docker compose run --rm rocm でコンテナに入れます。ただし中身はただの Ubuntu で、Python も GPU も使えません。

Stage 2: Python + ROCm を足す

イメージを AMD が公開している rocm/pytorch に変えるだけで、Python と ROCm と PyTorch が全部入ります。

services:
  rocm:
    image: rocm/pytorch:latest
    tty: true

これでコンテナ内で python3import torch が使えます。
ただし、まだ GPU デバイスをコンテナに渡していないので、rocminfo では GPU が見えません。

Stage 3: GPU を渡す

コンテナの「境界」を越えてホストの GPU にアクセスするために、デバイスと権限を明示的に渡します。

services:
  rocm:
    image: rocm/pytorch:latest
    tty: true
    devices:
      - /dev/kfd
      - /dev/dri
    group_add:
      - video
💡 追加した行の意味:
devices: /dev/kfd — ROCm のカーネルドライバ(KFD)をコンテナに渡す。これがないと GPU にアクセスできない。
devices: /dev/dri — DRM(Direct Rendering Manager)デバイスを渡す。GPU のレンダリング機能に必要。
group_add: video — GPU デバイスファイルの読み書き権限を追加。
アカツキちゃん
普通の Docker コンテナは GPU が見えません。devicesgroup_add は、上のレイヤー図の「🐳 Docker コンテナの境界」を越えて GPU へのアクセスを通すための設定です。

この段階で rocminfotorch.cuda.is_available() が動きます。

💡 Permission denied が出るときは: Ubuntu 20.04 以降では render グループも必要になることがあります。そのときは group_addrender を追加してください。

Stage 4: ホストとファイルを共有する

最後に、ホスト側のフォルダをコンテナ内で使えるようにし、入った瞬間に作業ディレクトリに立つようにします。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: /workspace
💡 追加した行の意味:
stdin_open: true — コンテナの標準入力を開いたままにする(docker run-i に相当)。
volumes: .:/workspacecompose.yaml があるフォルダ(.)をコンテナ内の /workspace に結びつける。ホスト側でファイルを編集すると、コンテナ内にも反映されます。
working_dir: /workspace — コンテナに入った瞬間に /workspace に立つようにする。

これが Quickstart で使った完成形です。GPU アクセス・Python 環境・ファイル共有がすべて揃っています。

docker run との対応 — compose.yaml は何を省略しているのか

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 — GPU が「見えている」とはどういうことか

コンテナ内で rocminfo を実行しました。これは ROCm のランタイムが GPU を認識しているかを確認するツール です。

💡 なぜ大事なのか: Docker でデバイスを渡しても、ドライバのバージョン不一致やデバイスファイルのパーミッション問題で GPU が「見えない」ことがあります。rocminfo は「ホスト → Docker → ROCm ランタイム → GPU」の経路が通っているかの最初のチェックポイントです。

rocminfo の出力で見るべきところ:

rocm/pytorch イメージ — 中には何が入っているのか

rocm/pytorch は、AMD が公開している Docker イメージです。

💡 このイメージに入っているもの:
ROCm ランタイム — GPU に命令を送るためのライブラリ群
ROCm 版 PyTorchtorch.cuda が AMD GPU で動くビルド
Python — PyTorch を動かすための Python 環境
rocminfo などのツール — GPU 確認用

つまり、ネイティブ Linux では自分でやる ROCm のインストールと PyTorch の導入が、すでにコンテナの中で終わっています。だから Quickstart の Docker ルートはステップが少なかったのです。

torch.version.hip — ROCm 版かどうかを見分ける

python3 -c "import torch; print(torch.version.hip)"
💡 なぜ大事なのか: PyTorch には CPU 版、CUDA 版、ROCm 版があります。rocm/pytorch イメージを使っていれば ROCm 版が入っていますが、自分でパッケージを追加した場合は CPU 版が紛れ込むこともあります。torch.version.hip がバージョン番号を返せば ROCm 版です。
アカツキちゃん
torch.cuda という名前なのに AMD GPU?
PyTorch は歴史的に GPU API を cuda という名前にしています。ROCm 版でもこの名前はそのまま使います。名前は CUDA でも、中身は ROCm が動いています。詳しくは第1章で。

Docker とネイティブ — 何が違うのか

この講座では 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() は全層を通した最終チェックです。

✅ 第0章のチェックリスト

ここまで来たら、第1章に進む準備ができています。
環境の意味がわかった状態でコードを書くと、エラーが出たときの対処がずっと楽になります。
第1章へ進む →