在 AMD GPU 上使用 ROCm 執行 Vicuna 13B

TL;DR

Hugging Face 已示範,透過 ROCm(Radeon Open Compute)與 GPTQ 4 位元量化,Vicuna 13B 開源聊天機器人可以在單一 AMD GPU 上執行。此方法將 GPU 記憶體需求從約 28GB(fp16)降低至 7.52GB,使模型能在如 Radeon RX6900XT 等消費級硬體上運行。

Vicuna 13B 模型

Vicuna 是一款由 UC Berkeley、CMU、Stanford 與 UC San Diego 合作開發的開源聊天機器人,擁有 130 億參數。它透過微調 LLaMA 基礎模型,使用約 70,000 筆來自 ShareGPT.com 的使用者對話資料完成。以 GPT-4 為參考的初步評估顯示,Vicuna-13B 的品質超過 OpenAI ChatGPT 的 90%,總訓練成本約為 300 美元。

透過 GPTQ 量化的記憶體最佳化

以 fp16 精度執行 Vicuna-13B 需要大約 28GB 的 GPU 記憶體,遠超過許多單卡的容量。為解決此問題,Hugging Face 採用 GPTQ(精確的後訓練量化),讓超過 100 億參數的模型在使用 3 位元或 4 位元精度時,仍能保持與 fp16 相近的準確度。

量化不僅能減少記憶體佔用,亦能降低延遲。因為大型語言模型的 token 產生通常受記憶體頻寬限制,而非純計算能力(TFLOPs),在記憶體受限的情況下,量化模型不會出現額外的 token 產生延遲。

在 AMD 硬體上的技術實作

系統需求

在 AMD 硬體上部署 Vicuna 13B,需要具備以下環境:

  • 硬體:支援 ROCm 的 AMD GPU(已測試於 Instinct MI210 與 Radeon RX6900XT)。
  • 作業系統:基於 Linux,建議使用 Ubuntu 18.04、20.04 或 22.04。
  • 軟體:ROCm 5.4.3、PyTorch 2.0 與 Python 3.6+。
  • 環境:Conda 或 Docker。

部署工作流程

  1. ROCm 安裝:安裝 amdgpu-install 套件,並為 hiplibsdkrocmdkms 進行系統設定。
  2. 容器化:使用相容 ROCm 的 PyTorch Docker 映像(例如 rocm/pytorch:rocm5.4.2_ubuntu20.04_py3.8_pytorch_2.0.0_preview)。
  3. 模型取得:從 Hugging Face 下載 4 位元量化的 Vicuna-13b 權重,或使用 GPTQ-for-LLaMa 倉庫將浮點模型量化。
  4. 推論:使用 llama_inference.py 腳本,搭配 --wbits 4--groupsize 128 參數產生文字。
  5. API 整合:可透過 FastChat 的 Web API 伺服器公開模型,需要一個 controller、一個 model worker 與一個 Gradio 網頁伺服器。

效能與準確度指標

記憶體消耗

量化大幅降低 VRAM 佔用。對於 13B 模型而言,記憶體需求從 fp16 的超過 28GB 降至 4 位元量化的 7.52GB,僅佔 Radeon RX6900XT 上 16GB DDR 的 46%。

準確度(Perplexity)

使用 C4 資料集的 2,048 個樣本計算 Perplexity(PPL),結果顯示 4 位元量化模型(無論使用 fp32 或 fp16 Matmul)相較於 fp16 基線仍保持高準確度。

延遲

在不同配置下測量 token 產生延遲,資料顯示 4 位元量化版本相較於 fp16 基線並未產生顯著的延遲懲罰。

附錄:手動模型量化

欲自行建立量化模型的使用者,可依以下步驟操作:

  1. 套用 Delta 權重:Vicuna 以 delta 權重形式發布,必須使用 fastchat.model.apply_delta 指令將其套用至原始 LLaMA 基礎模型。
  2. 量化流程:利用 GPTQ-for-LLaMa 倉庫,使用 C4 資料集進行校準,將模型量化至 4 位元精度,並將結果儲存為 .safetensors 檔案。

Sources