はじめに
この記事は、2025年春に、某大学にAMD MI210を搭載したクラスタシステムが導入されたため、この上でLLMを使った実験を行う方法を調べた試行錯誤の記録(2025年10月現在)です。
AMD GPUを取り巻く環境は変化が激しく、かつ、AMD本家のドキュメントも玉石混交であり、どのドキュメントを信用したら良いか分からないことが多かった。おそらく、この記事も、投稿した直後には現実と合わなくなると思われるので、そのつもりで参照願います。
コンテナイメージの選択
AMD純正Dockerコンテナイメージには、いろんな種類がある。主なところで、
-
rocm/dev-ubuntu-24.04
- Ubuntu24.04 + Python3.12.3
- ROCmがインストールされているだけで、Pythonモジュールは一切なし。
-
rocm/pytorch
- Ubuntu24.04 + Python3.12.3
-
/opt/venv/以下に、独自ビルドのPyTorchがインストール。
-
rocm/vllm
- Ubuntu22.04 + Python3.12.11
-
/usr/local/lib/以下に、独自ビルドのPyTorch, vllm, flash_attnなどがインストール。
当初、AMDによってビルドされたPyTorchの方が確実に最適化されている可能性が高いと考えて、rocm/pytorch コンテナまたは rocm/vllm コンテナを利用する方針を検討した。しかし、これらのコンテナに bitsandbytes モジュールを組み合わせると、様々なエラーが発生し動作する組み合わせを発見できなかった。そのため、rocm/dev-ubuntu-24.04 コンテナを、ベースとなるコンテナイメージとして利用する方針を採用した。
https://hub.docker.com/r/rocm/dev-ubuntu-24.04/tags を見ると、rocm/dev-ubuntu-24.04 コンテナには、通常版の系列(6.4.4など)と完全版の系列(6.4.4-completeなど)がある。hipblas などが必要になるので、完全版を使う。
ただ、rocm/dev-ubuntu-24.04 コンテナには、本当に最小限のツールしかインストールされていない。例えば、git や cmake もインストールされていないので、このままのコンテナイメージ上では各種作業に差し支える。そのため、以下のような Dockerfile を作成し、ある程度の作業ができるコンテナイメージを用意する。
FROM rocm/dev-ubuntu-24.04:6.4.4-complete
RUN apt update && \
DEBIAN_FRONTEND=noninteractive apt install -y \
build-essential \
ca-certificates \
cmake \
curl \
gfortran \
git \
libjpeg-dev \
libopenblas64-dev \
python3 \
python3-dev \
python3-pip \
python3-packaging \
python3-venv \
vim && \
apt clean && \
rm -rf /var/lib/apt/lists && \
pip3 install --break-system-packages --root-user-action=ignore uv wheel setuptools
# remove cache files
RUN rm -rf /root/.cache
ハードウェアの確認
ハードウェアの種類の確認は、rocm-smi コマンドを使う。
$ rocm-smi --showproductname
============================ ROCm System Management Interface ============================
====================================== Product Info ======================================
GPU[0] : Card Series: Instinct MI210
GPU[0] : Card Model: 0x740f
GPU[0] : Card Vendor: Advanced Micro Devices, Inc. [AMD/ATI]
GPU[0] : Card SKU: D67301V
GPU[0] : Subsystem ID: 0x0c34
GPU[0] : Device Rev: 0x02
GPU[0] : Node ID: 2
GPU[0] : GUID: 63484
GPU[0] : GFX Version: gfx23e
GPU[1] : Card Series: Instinct MI210
GPU[1] : Card Model: 0x740f
GPU[1] : Card Vendor: Advanced Micro Devices, Inc. [AMD/ATI]
GPU[1] : Card SKU: D67301V
GPU[1] : Subsystem ID: 0x0c34
GPU[1] : Device Rev: 0x02
GPU[1] : Node ID: 3
GPU[1] : GUID: 42924
GPU[1] : GFX Version: gfx23e
==========================================================================================
================================== End of ROCm SMI Log ===================================
PyTorch のインストール
最初に、適当な方法で uv をインストール。最小限の pyproject.toml を用意する。
[project]
name = "samplecodes"
version = "0.1.0"
description = "Sample codes to use ROCm"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
]
[[tool.uv.index]]
name = "pytorch-src"
url = "https://download.pytorch.org/whl/rocm6.4"
explicit = true
[tool.uv.sources]
torch = { index = "pytorch-src" }
pytorch-triton-rocm = { index = "pytorch-src" }
}
venv環境を初期化する。
$ uv venv
ここで PyTorch をインストールするために、以下のコマンドを実行してみても、何故か依存関係の解決に失敗する。
$ uv add torch
No solution found when resolving dependencies:
(snip)
先に、pytorch-triton-rocm をインストールしておくと、うまく PyTorch をインストールできる。
$ uv add pytorch-triton-rocm
$ uv add torch
bitsandbytes のインストール
手順は、HuggingFace の説明の通り。
$ git clone https://github.com/bitsandbytes-foundation/bitsandbytes.git
$ cd bitsandbytes
$ cmake -DCOMPUTE_BACKEND=hip -S .
$ make
$ python3 setup.py bdist_wheel
bitsandbytes/dist/ ディレクトリ配下に whl ファイルができているはずなので、適当な場所に移動する。その上で、以下のコマンドを実行する。
$ uv add bitsandbytes-0.48.2.dev0-cp312-cp312-linux_x86_64.whl
flash-attention のインストール
手順は、基本的には、flash-attention 本家の説明の通り。ただし、以下に留意して修正が必要。
- ビルド時に torch を参照しているので、仮想環境でビルドスクリプトを実行する必要がある。
- ビルドスクリプトが pip を参照しているので、仮想環境に pip をインストールしておく必要がある。
$ uv pip install pip
$ git clone https://github.com/Dao-AILab/flash-attention.git
$ cd flash-attention
$ uv run env FLASH_ATTENTION_TRITON_AMD_ENABLE="TRUE" python setup.py bdist_wheel
flash-attention/dist/ ディレクトリ配下に whl ファイルができているはずなので、適当な場所に移動する。その上で、以下のコマンドを実行する。
$ uv add flash_attn-2.8.3-py3-none-any.whl
なお、最近のLLM(例えば,llm-jp-3.1-1.8b)は,flash-attention に依存していることが多い。これらのLLMを実行するときも、FLASH_ATTENTION_TRITON_AMD_ENABLE 環境変数を指定しておかないと、flash-attention が CUDA 用のバックエンドを参照して以下のようなエラーが発生するため、注意が必要。
ModuleNotFoundError: No module named 'flash_attn_2_cuda'
Transformers のインストール
その他、必要なモジュールを追加する。
$ uv add transformers
最終的に、以下のような内容の pyproject.toml が得られるはずである。
[project]
name = "samplecodes"
version = "0.1.0"
description = "Sample codes to use ROCm"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"bitsandbytes",
"datasets>=4.2.0",
"evaluate>=0.4.6",
"flash-attn",
"peft>=0.17.1",
"pytorch-triton-rocm>=3.4.0",
"scikit-learn>=1.7.2",
"torch>=2.8.0",
"transformers>=4.57.1",
"xformers>=0.0.32.post2",
]
[[tool.uv.index]]
name = "pytorch-src"
url = "https://download.pytorch.org/whl/rocm6.4"
explicit = true
[tool.uv.sources]
torch = { index = "pytorch-src" }
pytorch-triton-rocm = { index = "pytorch-src" }
xformers = { index = "pytorch-src" }
bitsandbytes = { path = "bitsandbytes-0.48.2.dev0-cp312-cp312-linux_x86_64.whl" }
flash-attn = { path = "flash_attn-2.8.3-py3-none-any.whl" }