AMD GPU上で ROCm を使用して Vicuna 13B を実行する
TL;DR
Hugging Face は、ROCm(Radeon Open Compute)と GPTQ 4 ビット量子化を活用することで、Vicuna 13B オープンソースチャットボットを単一の AMD GPU 上で実行できることを実証しました。この手法により、GPU メモリ要件は fp16 の約 28 GB から 7.52 GB に削減され、Radeon RX6900XT のような一般消費者向けハードウェアでもモデルを動作させることが可能になります。
Vicuna 13B モデル
Vicuna は、UC Berkeley、CMU、Stanford、UC San Diego の共同プロジェクトにより開発された、130 億パラメータのオープンソースチャットボットです。ShareGPT.com から共有された約 70,000 件のユーザー会話を用いて LLaMA ベースモデルをファインチューニングして作られました。GPT‑4 を基準とした初期評価では、Vicuna‑13B は OpenAI の ChatGPT の品質の 90 %以上を達成しており、トレーニングコストは約 300 USD とされています。
GPTQ 量子化によるメモリ最適化
Vicuna‑13B を fp16 精度で実行するにはおよそ 28 GB の GPU RAM が必要で、多くの単体 GPU の容量を超えます。これに対し、Hugging Face は GPTQ(正確な事後量子化)を利用し、10 B 超のモデルでも fp16 と同等の精度を保ちつつ 3 ビットまたは 4 ビット精度で動作させています。
量子化はメモリフットプリントの削減だけでなく、レイテンシの低減にも重要です。LLM のトークン生成は通常、計算量(TFLOPs)よりもメモリ帯域幅に制約されるため、GPU がメモリバウンド状態にあるときでも、量子化モデルはトークン生成レイテンシの増加を招きません。
AMD ハードウェア上での技術実装
システム要件
Vicuna 13B を AMD ハードウェアにデプロイするために必要な環境は以下の通りです。
- ハードウェア: ROCm に対応した AMD GPU(テスト済みは Instinct MI210 と Radeon RX6900XT)。
- OS: Linux 系、できれば Ubuntu 18.04、20.04、または 22.04。
- ソフトウェア: ROCm 5.4.3、PyTorch 2.0、Python 3.6+。
- 環境: Conda または Docker。
デプロイワークフロー
- ROCm インストール:
amdgpu-installパッケージをインストールし、hiplibsdk、rocm、dkms用にシステムを構成します。 - コンテナ化: ROCm 対応の PyTorch Docker イメージ(例:
rocm/pytorch:rocm5.4.2_ubuntu20.04_py3.8_pytorch_2.0.0_preview)を使用します。 - モデル取得: Hugging Face から 4 ビット量子化された Vicuna‑13b 重みをダウンロードするか、
GPTQ-for-LLaMaリポジトリを用いて浮動小数点モデルを量子化します。 - 推論:
llama_inference.pyスクリプトを--wbits 4と--groupsize 128フラグ付きで実行し、テキストを生成します。 - API 統合: FastChat を用いた Web API サーバーでモデルを公開します。コントローラ、モデルワーカー、Gradio Web サーバーが必要です。
パフォーマンスと精度指標
メモリ消費
量子化により VRAM フットプリントが大幅に削減されます。13B モデルの場合、fp16 での 28 GB 超のメモリ要件が、4 ビット量子化で 7.52 GB に低減し、Radeon RX6900XT の 16 GB DDR の 46 % しか使用しません。
精度(Perplexity)
精度は C4 データセットから抽出した 2,048 件のサンプルに対する Perplexity(PPL)で測定しました。4 ビット量子化モデル(fp32 または fp16 の行列乗算を使用)でも、fp16 ベースラインに対して高い精度を維持しています。
レイテンシ
トークン生成レイテンシは様々な構成で測定しました。その結果、4 ビット量子化版は fp16 ベースラインと比較して大きなレイテンシペナルティを生じないことが示されています。
付録:手動モデル量子化
独自に量子化モデルを作成したいユーザー向けの手順は以下の通りです。
- Delta 重みの適用: Vicuna は delta 重みとして提供されるため、
fastchat.model.apply_deltaコマンドで元の LLaMA ベースモデルに適用します。 - 量子化プロセス:
GPTQ-for-LLaMaリポジトリを使用し、C4 データセットでキャリブレーションしながら 4 ビット精度に量子化し、結果を.safetensorsファイルとして保存します。