4 ポイント 投稿者 GN⁺ 2024-10-04 | 1件のコメント | WhatsAppで共有
  • AMD GPUで大規模言語モデルを実行するための Docker ベースの推論エンジンで、Hugging Face モデルを対象とし、LLaMA 系列に重点を置く
  • 実行環境には ROCm 対応 AMD GPU、Docker、ホストにインストールされた ROCm ドライバー 5.4.2 または互換バージョンが必要
  • run-docker-amd.sh が Docker イメージを自動でビルドし、AMD GPU へのアクセスに必要な /dev/kfd/dev/drivideo グループ、SYS_PTRACEseccomp=unconfined 設定でコンテナを実行する
  • ユーザーは Hugging Face リポジトリ名とプロンプトを引数として渡してモデルを変更でき、例として meta-llama/Llama-2-7b-chat-hffacebook/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件のコメント

 
GN⁺ 2024-10-04
Hacker Newsの意見
  • 推論用途なら、サポート対象のカードか、Linuxで HSA_OVERRIDE_GFX_VERSION が使えるアーキテクチャであれば、上流の PyTorchtransformers でほぼ何でも動かせる
    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-GPUs

  • 生成系で雑に作られた 機械学習ライブラリの乱立 が驚くほどだ
    このライブラリは半分が print 文で、分岐している箇所も実際には分岐する必要がない
    環境変数を2つ定義し、torch のフラグを2つ設定する程度だ

    • データサイエンティストや機械学習系の人たちをソフトウェアエンジニアだと誤解し、同じ成果物を期待すると血圧が上がるだけだということを直すために、治療まで受けなければならなかった
      チームや組織では 期待値管理 が本当に大きな部分だと思う
    • harshすぎるかと思ったが、リポジトリを見たらそうではなかった
      実際、内容がほとんどない
    • 言いたいことは分かるが、こういうコメントのせいで、人々がコードを共有したり オープンソースに貢献 したり、プログラミングを続けたりすることをためらうようになる
  • 古い ROCm 5.4.2 を使っているようだが、2年前のバージョンなので自分のRX 7900 XTXをサポートするか疑わしい
    個人的には最新の rocm/pytorch イメージを使い、その中で必要なものを実行するのが一番簡単だった

    • RX 7900 XTX(gfx1100)はROCm 5.4で rocBLAS などの数学ライブラリでは初めて有効化されたが、MIOpen のような AIライブラリ はROCm 5.5まで有効化されていなかったように思う
      その後のリリースで性能もかなり大きく向上したと思う
  • Ubuntu 24.04とDebian Unstableでは、OSが提供するパッケージだけで、Vega以降のほぼすべてのディスクリート AMD GPUllama.cpp をROCmで動かせる
    Dockerや HSA_OVERRIDE_GFX_VERSION も不要で、hipcclibhipblas-devlibrocblas-devcmake などをインストールした後、videorender グループ権限を付与し、GGML_HIPBLAS=ON でビルドすればよい
    RDNA 3、MI200、MI300ユーザーは性能のためにAMD提供のROCmパッケージのほうがよく、PyTorchが必要な場合もシステムパッケージにない依存関係があるため、AMD提供パッケージを使うほうがよい
    それでもインストールのしやすさと古いハードウェア互換性ではOSパッケージが強く、参考リンクは https://lists.debian.org/debian-ai/2024/07/msg00002.html

    • Ubuntu 22.04.5でRX 7900 XTXにAMD提供の ROCmとOllama を大きな問題なくインストールでき、OllamaでROCmベースのLLM実行も問題なく動く
    • 現在の市場に、消費者向けの価格で 24GBを超えるVRAM を搭載したAMDカードはあるのか?
  • Ryzen 8700GをNPUでニューラルネットワーク推論に使おうと思って買ってから8か月ほど経ったが、今のところ高速化はNPUではなくiGPUのVulkanでしか得られていない
    Linuxだけを使っていて、良い点はRAM 64GBのおかげで32GBを超えるモデルも問題なく試せたこと
    Vulkanバックエンドをサポートするllama.cppは称賛に値する

    • iGPUでもROCm/HIPのサポートを受けられるはずで、llama.cppをコンパイルするときにLLAMA_HIP_UMA=1フラグを入れてみればよい
      https://github.com/amd/RyzenAI-SWを見ると、NPUで遊べるソフトウェアはかなりあるが、Phoenixは16 TOPSなので自分でテストする気にはならなかった
  • NixOSワークステーションにはこの程度を追加すればよかった
    hardware.graphics.enable = true;を有効にし、services.ollamaacceleration = "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がどう正当化されるのか理解できない

    • 最近のソフトウェアが途方もなく肥大化しているのは確かだが、ROCmは単なるGPUドライバではない
      複数のツールやライブラリが含まれている
      CUDA toolkitも単一ファイルで入手するとダウンロードだけで4GBを超えるので、どちらにしても信じられないほど大きく見える結果になる
    • https://github.com/zml/zmlでこの問題に取り組んでいる
    • いまやGPU上で動くCPUドライバは、ほとんど完全なOSだ
    • AMDはドライバでLinuxカーネルを完全に汚しているレベルだ: https://www.phoronix.com/news/AMD-5-Million-Lines
  • これはラッパーのラッパーのラッパーの上に、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を動かすときに他の人が何を使っているのか気になる

    • 最近MI100を650ドルで買った
      32GB HBM2で、標準のFlash Attention 2ベンチマークでは3090より0〜5%ほど速いが、実アプリケーションでの性能はばらつく
      CDNAの行列コア向けに最適化されていないプロジェクトが多く、RDNA向けの作業があってもCDNAにそのままつながらないことが多い
      llama.cppがAMD向けFlash AttentionのPRを、ヘッダーオンリーライブラリが不要な依存関係を追加するとして閉じたのももどかしい: https://github.com/ggerganov/llama.cpp/pull/7011
      SDXLのデフォルトでxformersを使うと4.5〜5it/s程度で3090と4090の間くらい、exllamav2でQwen 72B 3bpwは約7t/sで3090より遅いが、3090に載せるにはもっと低い精度を使う必要がある
      このプロジェクトがllama.cppexllamav2mlc-aiのような既存の選択肢よりAMDユーザーに何を多く提供するのかはよく分からないし、最近はほとんどのプロジェクトが比較的簡単に動く
    • 個人的には、AMD iGPU/GPUはPyTorch、ROCm、xformers、Ollamaのアップデートのたびに壊れて、あまり価値がなかった
      Nvidiaのほうが夜も安心して眠れる
    • Radeon Pro VIIを新品で300ユーロで買ったが、悪くない取引だった
      HBM2があり、メモリ帯域幅は4090と同じ1TB/s
      ただしVRAMは16GBしかない
    • おそらく7900 XTXが答えになりそう
      1,000ドルで24GB RAMだ
  • 人々は「Dockerベース」とよく言うが、実際の意味は$SOFTWAREをDockerイメージとして配布するということだ
    「Dockerベース」と言うと、まるでDockerでAMDカード上の推論をしているように読めるが、それは意味のない表現に感じる

    • Nvidiaでやるように、Dockerコンテナ内で推論できる
      OpenAIもこの方式でK8sクラスタを動かしており、AMDにもドキュメントがある
      ただしAMD AI周りは、適切なカード、適切なROCmバージョン、そして純粋な運が必要だ
      AMDがROCm対応Dockerイメージを提供しているので、それをベースレイヤーとしてアプリと組み合わせ、GPUをコンテナに渡せば動作し得る
      結局、デプロイ時に気にすべき変数を1つ減らしてくれるので、文字どおりDockerでAMD上の推論をしていることになる
    • Dockerが機械学習の標準ツールになった理由は、システムライブラリにリンクするPythonディストリビューションが、そのレイヤーまで一緒に持ち運ばないとめちゃくちゃになるからだ
    • Dockerには特定のデバイスをマウントできる
      スクリプトを見るとGPUをマウントしている: https://github.com/slashml/amd_inference/blob/main/run-docke...
    • ZMLでこの問題に取り組んでいる: https://github.com/zml/zml
    • なぜ意味がないのか? Dockerコンテナでもデバイスと通信できるし、接続してやればよい