- AMD GPUで大規模言語モデルを実行するための Docker ベースの推論エンジンで、Hugging Face モデルを対象とし、LLaMA 系列に重点を置く
- 実行環境には ROCm 対応 AMD GPU、Docker、ホストにインストールされた ROCm ドライバー 5.4.2 または互換バージョンが必要
run-docker-amd.sh が Docker イメージを自動でビルドし、AMD GPU へのアクセスに必要な /dev/kfd、/dev/dri、video グループ、SYS_PTRACE、seccomp=unconfined 設定でコンテナを実行する
- ユーザーは Hugging Face リポジトリ名とプロンプトを引数として渡してモデルを変更でき、例として
meta-llama/Llama-2-7b-chat-hf と facebook/opt-1.3b が示されている
- 推論動作を変更するには
run_inference.py を修正したうえで Docker イメージを再ビルドする必要があり、メモリ不足時はより小さいモデルや短い入出力長を使う必要がある
プロジェクトの目的と対象モデル
- このプロジェクトは AMD GPU で LLM を実行するための Docker ベースの推論エンジン
- Hugging Face のモデルを使うよう設計されており、特に LLaMA モデル系列に重点を置く
- Hugging Face Transformers ライブラリを使用する
必要環境
- 実行前に必要な条件は次のとおり
- ROCm をサポートする AMD GPU
- システムにインストールされた Docker
- ホストシステムにインストールされた ROCm ドライバー
- バージョンは 5.4.2 または互換バージョンが必要
プロジェクト構成
- リポジトリ構造は
src/ ディレクトリと実行・ビルド用ファイルで構成される
src/engine.py
src/model.py
src/utils.py
src/amd_setup.py
Dockerfile
requirements.txt
run_inference.py
run-docker-amd.sh
README.md
クイック実行手順
- リポジトリをクローンした後、プロジェクトディレクトリへ移動する
git clone https://github.com/slashml/amd-gpu-inference.git
cd amd-gpu-inference
chmod +x run-docker-amd.sh
- モデル名とプロンプトを渡して推論エンジンを実行する
./run-docker-amd.sh "meta-llama/Llama-2-7b-chat-hf" "Translate the following English text to French: 'Hello, how are you?'"
"meta-llama/Llama-2-7b-chat-hf" は使用したい Hugging Face モデルに置き換えられ、プロンプトも直接指定できる
Docker と ROCm の実行方式
Aptfile には Docker コンテナ内にインストールする ROCm パッケージが列挙されている
- 必要な ROCm ドライバーとライブラリをコンテナで利用できるようにするための構成
run-docker-amd.sh は Docker イメージを自動でビルドする
- 手動ビルドは次のコマンドで可能
docker build -t amd-gpu-inference .
- コンテナを手動で実行する場合は、AMD GPU へのアクセスに必要なデバイスと権限オプションを指定する
docker run --rm -it \
--device=/dev/kfd \
--device=/dev/dri \
--group-add=video \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
amd-gpu-inference "model_name" "your prompt here"
"model_name" には Hugging Face モデル名を入れ、"your prompt here" には入力テキストを入れる
カスタマイズとトラブルシューティング
- モデル変更は、実行時に Hugging Face リポジトリ名を指定する方式で処理する
./run-docker-amd.sh "facebook/opt-1.3b" "Your prompt here"
- 推論ロジックを変更するには
run_inference.py ファイルを修正する
- 変更後は Docker イメージを再ビルドする必要がある
- トラブルシューティング項目は次のとおり
- AMD GPU ドライバーと ROCm がホストシステムに正しくインストール・構成されているか確認する必要がある
"out of memory" エラーが発生した場合は、より小さいモデルを使うか、入力・出力長を短くする必要がある
- モデル別の問題は Hugging Face の該当モデルのドキュメントを参照する必要がある
ライセンスと参考
- プロジェクトは Pull Request でコントリビューションを受け付けることができる
- ROCm は AMD が開発しており、MIT License で提供される
- 質問や Issue は GitHub リポジトリの Issue として開くことができる
1件のコメント
Hacker Newsの意見
推論用途なら、サポート対象のカードか、Linuxで
HSA_OVERRIDE_GFX_VERSIONが使えるアーキテクチャであれば、上流の PyTorch とtransformersでほぼ何でも動かせるllama.cppも少なくとも1年ほどはかなり問題なくコンパイルできており、Windowsでは通常リリースにwin-hipバイナリがあるか、だめでも性能は落ちるがVulkanビルドで回避できるただ、この文書の ROCm 5.4.2 はほぼ2年前のバージョンで、その間に大きく変わっているのに、2024年10月に新たに公開された理由が気になる
最近、RDNA3中心の互換性ドキュメントをROCm 6.2基準に更新したが、数か月の間にも上流の
bitsandbytes、上流のxformers、TritonベースのFlash Attentionなど変化が多かった: https://llm-tracker.info/howto/AMD-GPUsa1111のようなものを使うなら、requirements.txtを信じずにPyTorch公式サイトの案内どおり ROCm版torch をインストールすればよいObsidianも似たような感じで、HIPは少なくともArchとUbuntuでは簡単なほうで、Fedoraはまだ少し手を入れる必要がある
xformersも動くとは知らなかったが、いいニュースだすぐ動いたのは例があるOllamaだけだった: https://github.com/ollama/ollama/blob/main/docs/docker.md
llama.cppとkoboldcppはDockerイメージはあるが実行例が不足しており、text-generation-webui-dockerはRHEL9の7800 XTで壊れた: https://github.com/ggerganov/llama.cpp/blob/master/docs/dock..., https://github.com/LostRuins/koboldcpp?tab=readme-ov-file#do..., https://github.com/Atinoda/text-generation-webui-docker要約すると、最新の ROCm 6.2 で、単一ノードの8×MI300X AMD GPU上でLlama 405Bを完全精度推論で動かしている
ROCm 6.2とAMDスタックがNvidia比でどの程度成熟していると見ているのか気になる
生成系で雑に作られた 機械学習ライブラリの乱立 が驚くほどだ
このライブラリは半分が
print文で、分岐している箇所も実際には分岐する必要がない環境変数を2つ定義し、
torchのフラグを2つ設定する程度だチームや組織では 期待値管理 が本当に大きな部分だと思う
実際、内容がほとんどない
古い ROCm 5.4.2 を使っているようだが、2年前のバージョンなので自分のRX 7900 XTXをサポートするか疑わしい
個人的には最新の
rocm/pytorchイメージを使い、その中で必要なものを実行するのが一番簡単だったgfx1100)はROCm 5.4でrocBLASなどの数学ライブラリでは初めて有効化されたが、MIOpenのような AIライブラリ はROCm 5.5まで有効化されていなかったように思うその後のリリースで性能もかなり大きく向上したと思う
Ubuntu 24.04とDebian Unstableでは、OSが提供するパッケージだけで、Vega以降のほぼすべてのディスクリート AMD GPU で
llama.cppをROCmで動かせるDockerや
HSA_OVERRIDE_GFX_VERSIONも不要で、hipcc、libhipblas-dev、librocblas-dev、cmakeなどをインストールした後、video、renderグループ権限を付与し、GGML_HIPBLAS=ONでビルドすればよいRDNA 3、MI200、MI300ユーザーは性能のためにAMD提供のROCmパッケージのほうがよく、PyTorchが必要な場合もシステムパッケージにない依存関係があるため、AMD提供パッケージを使うほうがよい
それでもインストールのしやすさと古いハードウェア互換性ではOSパッケージが強く、参考リンクは https://lists.debian.org/debian-ai/2024/07/msg00002.html だ
Ryzen 8700GをNPUでニューラルネットワーク推論に使おうと思って買ってから8か月ほど経ったが、今のところ高速化はNPUではなくiGPUのVulkanでしか得られていない
Linuxだけを使っていて、良い点はRAM 64GBのおかげで32GBを超えるモデルも問題なく試せたこと
Vulkanバックエンドをサポートする
llama.cppは称賛に値するllama.cppをコンパイルするときにLLAMA_HIP_UMA=1フラグを入れてみればよいhttps://github.com/amd/RyzenAI-SWを見ると、NPUで遊べるソフトウェアはかなりあるが、Phoenixは16 TOPSなので自分でテストする気にはならなかった
NixOSワークステーションにはこの程度を追加すればよかった
hardware.graphics.enable = true;を有効にし、services.ollamaでacceleration = "rocm";、ROC_ENABLE_PRE_VEGA = "1";、HSA_OVERRIDE_GFX_VERSION = "11.0.0";を設定した以前、
llamafileの手軽さを見てAMD ROCmをインストールしかけたことがあるところが
sudo apt install rocmの結果は、インストールパッケージ203個、ダウンロード約2.37GB、必要容量35.7GBだった実質GPUドライバに近いものに36GBがどう正当化されるのか理解できない
複数のツールやライブラリが含まれている
CUDA toolkitも単一ファイルで入手するとダウンロードだけで4GBを超えるので、どちらにしても信じられないほど大きく見える結果になる
これはラッパーのラッパーのラッパーの上に、AIが作ったラッパーのように見える
# Other AMD-specific optimizations can be added here、# For example, you might want to set specific flags or use AMD-optimized librariesのようなコメントがあるが、それならここで何をしているのか分からないrequirementsファイルとDockerfileで、残りの大半はヘルパースクリプトだ最近、コスパの良いAMD GPUには何がある?
たった今、中古の3090を2枚、eBayのリファービッシュ品でそれぞれ750ドルくらいで買ったのだが、ローカルでLLMを動かすときに他の人が何を使っているのか気になる
32GB HBM2で、標準のFlash Attention 2ベンチマークでは3090より0〜5%ほど速いが、実アプリケーションでの性能はばらつく
CDNAの行列コア向けに最適化されていないプロジェクトが多く、RDNA向けの作業があってもCDNAにそのままつながらないことが多い
llama.cppがAMD向けFlash AttentionのPRを、ヘッダーオンリーライブラリが不要な依存関係を追加するとして閉じたのももどかしい: https://github.com/ggerganov/llama.cpp/pull/7011SDXLのデフォルトで
xformersを使うと4.5〜5it/s程度で3090と4090の間くらい、exllamav2でQwen 72B 3bpwは約7t/sで3090より遅いが、3090に載せるにはもっと低い精度を使う必要があるこのプロジェクトが
llama.cpp、exllamav2、mlc-aiのような既存の選択肢よりAMDユーザーに何を多く提供するのかはよく分からないし、最近はほとんどのプロジェクトが比較的簡単に動くxformers、Ollamaのアップデートのたびに壊れて、あまり価値がなかったNvidiaのほうが夜も安心して眠れる
HBM2があり、メモリ帯域幅は4090と同じ1TB/s
ただしVRAMは16GBしかない
1,000ドルで24GB RAMだ
人々は「Dockerベース」とよく言うが、実際の意味は
$SOFTWAREをDockerイメージとして配布するということだ「Dockerベース」と言うと、まるでDockerでAMDカード上の推論をしているように読めるが、それは意味のない表現に感じる
OpenAIもこの方式でK8sクラスタを動かしており、AMDにもドキュメントがある
ただしAMD AI周りは、適切なカード、適切なROCmバージョン、そして純粋な運が必要だ
AMDがROCm対応Dockerイメージを提供しているので、それをベースレイヤーとしてアプリと組み合わせ、GPUをコンテナに渡せば動作し得る
結局、デプロイ時に気にすべき変数を1つ減らしてくれるので、文字どおりDockerでAMD上の推論をしていることになる
スクリプトを見るとGPUをマウントしている: https://github.com/slashml/amd_inference/blob/main/run-docke...