在單 GPU 上使用 ROCm 執行類似 ChatGPT 的聊天機器人

釋出於 2023 年 5 月 15 日
在 GitHub 上更新

引言

ChatGPT 是 OpenAI 開創性的語言模型,已成為人工智慧領域的一股強大力量,為跨行業的大量 AI 應用鋪平了道路。憑藉其驚人的理解和生成類人文字的能力,ChatGPT 改變了從客戶支援到創意寫作等行業,甚至成為了一種寶貴的研究工具。

人們已做出各種努力來提供開源大型語言模型,這些模型在更小的尺寸下也展現出強大的能力,例如 OPTLLAMAAlpacaVicuna

在本部落格中,我們將深入探討 Vicuna 的世界,並解釋如何在配備 ROCm 的單個 AMD GPU 上執行 Vicuna 13B 模型。

什麼是 Vicuna?

Vicuna 是一個擁有 130 億引數的開源聊天機器人,由加州大學伯克利分校、卡耐基梅隆大學、斯坦福大學和加州大學聖地亞哥分校的團隊共同開發。為了建立 Vicuna,LLAMA 基礎模型使用從 ShareGPT.com 透過公共 API 收集的約 7 萬個使用者共享對話進行了微調。根據使用 GPT-4 作為參考的初步評估,Vicuna-13B 的質量已達到 OpenAI ChatGPT 質量的 90% 以上*。

它於幾周前的 4 月 11 日在 Github 上釋出。值得一提的是,Vicuna 的資料集、訓練程式碼、評估指標和訓練成本都是公開的。其總訓練成本僅為 300 美元左右,使其成為普通大眾經濟實惠的解決方案。

有關 Vicuna 的更多詳細資訊,請訪問 https://vicuna.lmsys.org

為什麼我們需要量化的 GPT 模型?

在 fp16 中執行 Vicuna-13B 模型需要大約 28GB 的 GPU 記憶體。為了進一步減少記憶體佔用,需要最佳化技術。最近發表了一篇研究論文 GPTQ,該論文提出了針對較低位精度 GPT 模型的精確訓練後量化。如下圖所示,對於引數大於 10B 的模型,4 位或 3 位 GPTQ 可以實現與 fp16 相當的精度。

此外,這些模型的巨大引數也會嚴重影響 GPT 延遲,因為 GPT 令牌生成更多受記憶體頻寬 (GB/s) 限制,而非計算 (TFLOPs 或 TOPs) 本身。因此,當 GPU 處於記憶體受限狀態時,量化模型不會降低令牌生成延遲。請參閱 GPTQ 量化論文github 倉庫

透過利用此技術,Hugging Face 提供了幾個 4 位量化 Vicuna 模型,如下所示:

在配備 ROCm 的 AMD GPU 上執行 Vicuna 13B 模型

要在 AMD GPU 上執行 Vicuna 13B 模型,我們需要利用 ROCm(Radeon Open Compute)的強大功能,ROCm 是一個開源軟體平臺,可為深度學習和高效能計算應用提供 AMD GPU 加速。

以下是關於如何在配備 ROCm 的 AMD GPU 上設定和執行 Vicuna 13B 模型的逐步指南

系統要求

在深入安裝過程之前,請確保您的系統滿足以下要求

  • 支援 ROCm 的 AMD GPU(在 docs.amd.com 頁面上檢視相容性列表)

  • 基於 Linux 的作業系統,最好是 Ubuntu 18.04 或 20.04

  • Conda 或 Docker 環境

  • Python 3.6 或更高版本

有關更多資訊,請訪問 https://docs.amd.com/bundle/ROCm-Installation-Guide-v5.4.3/page/Prerequisites.html

此示例已在配備 ROCm5.4.3 和 Pytorch2.0 的 Instinct MI210Radeon RX6900XT GPU 上進行測試。

快速入門

1 ROCm 安裝和 Docker 容器設定 (宿主機)

1.1 ROCm 安裝

以下適用於 ROCm5.4.3 和 Ubuntu 22.04。請根據您的目標 ROCm 和 Ubuntu 版本進行修改,網址為:https://docs.amd.com/bundle/ROCm-Installation-Guide-v5.4.3/page/How_to_Install_ROCm.html

sudo apt update && sudo apt upgrade -y
wget https://repo.radeon.com/amdgpu-install/5.4.3/ubuntu/jammy/amdgpu-install_5.4.50403-1_all.deb
sudo apt-get install ./amdgpu-install_5.4.50403-1_all.deb
sudo amdgpu-install --usecase=hiplibsdk,rocm,dkms
sudo amdgpu-install --list-usecase
sudo reboot

1.2 ROCm 安裝驗證

rocm-smi
sudo rocminfo

1.3 Docker 映象拉取和執行 Docker 容器

以下使用 ROCm5.4.2 上的 Pytorch2.0。請根據您的目標 ROCm 和 Pytorch 版本使用適當的 docker 映象:https://hub.docker.com/r/rocm/pytorch/tags

docker pull rocm/pytorch:rocm5.4.2_ubuntu20.04_py3.8_pytorch_2.0.0_preview

sudo docker run --device=/dev/kfd --device=/dev/dri --group-add video \
--shm-size=8g --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \
--ipc=host -it --name vicuna_test -v ${PWD}:/workspace -e USER=${USER} \
rocm/pytorch:rocm5.4.2_ubuntu20.04_py3.8_pytorch_2.0.0_preview

2 模型 量化和模型推理 (在 docker 內部)

您可以從 Huggingface 下載量化後的 Vicuna-13b 模型,或對浮點模型進行量化。如果您想對浮點模型進行量化,請檢視附錄 - GPTQ 模型量化

2.1 下載量化後的 Vicuna-13b 模型

使用以下 git 倉庫中的 download-model.py 指令碼。

git clone https://github.com/oobabooga/text-generation-webui.git
cd text-generation-webui
python download-model.py anon8231489123/vicuna-13b-GPTQ-4bit-128g
  1. 在 AMD GPU 上執行 Vicuna 13B GPTQ 模型
git clone https://github.com/oobabooga/GPTQ-for-LLaMa.git -b cuda
cd GPTQ-for-LLaMa
python setup_cuda.py install

這些命令將編譯並連結與 CUDA 等效的 HIPIFIED 核心二進位制檔案到

Python 作為 C 擴充套件。此實現的核心由去量化 + FP32 矩陣乘法組成。如果您想使用去量化 + FP16 矩陣乘法以獲得額外加速,請檢視附錄 - AMD GPU 的 GPTQ 去量化 + FP16 矩陣乘法核心

git clone https://github.com/oobabooga/GPTQ-for-LLaMa.git -b cuda
cd GPTQ-for-LLaMa/
python setup_cuda.py install

# model inference
python llama_inference.py ../../models/vicuna-13b --wbits 4 --load \
../../models/vicuna-13b/vicuna-13b_4_actorder.safetensors --groupsize 128 --text “You input text here”

現在您已完成所有設定,是時候在 AMD GPU 上執行 Vicuna 13B 模型了。使用上述命令執行模型。將“您的輸入文字此處”替換為您想用作模型輸入的文字。如果一切設定正確,您應該會看到模型根據您的輸入生成輸出文字。

3. 將量化 Vicuna 模型暴露給 Web API 伺服器

更改以下行中 GPTQ Python 模組(GPTQ-for-LLaMa)的路徑

https://github.com/thisserand/FastChat/blob/4a57c928a906705404eae06f7a44b4da45828487/fastchat/serve/load_gptq_model.py#L7

要從 gradio 庫啟動 Web UXUI,您需要透過將它們作為後臺作業執行來設定控制器、worker(Vicunal 模型 worker)、web_server。

nohup python0 -W ignore::UserWarning -m fastchat.serve.controller &

nohup python0 -W ignore::UserWarning -m fastchat.serve.model_worker --model-path /path/to/quantized_vicuna_weights \
--model-name vicuna-13b-quantization --wbits 4 --groupsize 128 &

nohup python0 -W ignore::UserWarning -m fastchat.serve.gradio_web_server &

現在,4 位量化的 Vicuna-13B 模型可以適應 RX6900XT GPU DDR 記憶體,其擁有 16GB DDR。執行 13B 模型僅需 7.52GB DDR(16GB 的 46%),而該模型在 fp16 資料型別中需要超過 28GB DDR 空間。延遲和精度損失也非常小,相關指標在本文末尾提供。

在 Web API 伺服器中測試量化 Vicuna 模型

讓我們試一試。首先,我們使用 fp16 Vicuna 模型進行語言翻譯。

它比我做得更好。接下來,我們問一些關於足球的問題。答案在我看來不錯。

當我們切換到 4 位模型時,對於相同的問題,答案略有不同。其中有一個重複的“Lionel Messi”。

Vicuna fp16 和 4 位量化模型比較

測試環境

- GPU:Instinct MI210,RX6900XT

- python:3.10

- pytorch:2.1.0a0+gitfa08e54

- rocm:5.4.3

指標 - 模型大小 (GB)

  • 模型引數大小。當模型預載入到 GPU DDR 時,由於輸入和輸出令牌空間的快取,實際 DDR 空間消耗大於模型本身。

指標 – 準確性 (PPL: 困惑度)

  • 在 C4 (https://paperswithcode.com/dataset/c4) 資料集的 2048 個示例上測量

  • Vicuna 13b – 基線:fp16 資料型別引數,fp16 矩陣乘法

  • Vicuna 13b – 量化 (4bit/fp32):4 位資料型別引數,fp32 矩陣乘法

  • Vicuna 13b – 量化 (4bit/fp16):4 位資料型別引數,fp16 矩陣乘法

指標 – 延遲 (令牌生成延遲,毫秒)

  • 在令牌生成階段測量。

  • Vicuna 13b – 基線:fp16 資料型別引數,fp16 矩陣乘法

  • Vicuna 13b – 量化 (4bit/fp32):4 位資料型別引數,fp32 矩陣乘法

  • Vicuna 13b – 量化 (4bit/fp16):4 位資料型別引數,fp16 矩陣乘法

結論

大型語言模型(LLM)在聊天機器人系統中取得了顯著進展,正如 OpenAI 的 ChatGPT 所見。Vicuna-13B,一個開源 LLM 模型,已開發並展示了出色的能力和質量。

透過遵循本指南,您現在應該對如何在配備 ROCm 的 AMD GPU 上設定和執行 Vicuna 13B 模型有更好的理解。這將使您能夠為您的研究和個人專案充分發揮這一尖端語言模型的潛力。

感謝閱讀!

附錄 - GPTQ 模型量化

從浮點 LLaMA 模型構建量化 Vicuna 模型

a. 從 Huggingface 下載 LLaMA 和 Vicuna 增量模型

Vicuna (lmsys) 的開發者只提供了可應用於 LLaMA 模型的增量模型。分別從 Huggingface 下載 Huggingface 格式的 LLaMA 和 Vicuna 增量引數。目前,Vicuna 的 7b 和 13b 增量模型可用。

https://huggingface.co/models?sort=downloads&search=huggyllama

https://huggingface.co/models?sort=downloads&search=lmsys

b. 使用 Vicuna-delta 模型將 LLaMA 轉換為 Vicuna

git clone https://github.com/lm-sys/FastChat
cd FastChat

使用此命令轉換 LLaMA 引數

(注意:不要使用 vicuna-{7b, 13b}-*delta-v0,因為它與 LLaMA 的詞彙量大小不同,模型無法轉換)

python -m fastchat.model.apply_delta  --base /path/to/llama-13b --delta lmsys/vicuna-13b-delta-v1.1 \ 
--target ./vicuna-13b  

現在 Vicuna-13b 模型已準備就緒。

c. 將 Vicuna 量化為 2/3/4 位

要將 GPTQ 應用於 LLaMA 和 Vicuna,

git clone https://github.com/oobabooga/GPTQ-for-LLaMa -b cuda  
cd GPTQ-for-LLaMa

(注意,目前不要使用 https://github.com/qwopqwop200/GPTQ-for-LLaMa。因為此倉庫中實現的 2、3、4 位量化 + MatMul 核心沒有並行化 dequant+matmul,因此令牌生成效能較低)

使用此命令量化 Vicuna-13b 模型。QAT 基於 c4 資料集完成,但您也可以使用其他資料集,例如 wikitext2

(注意。只要模型精度顯著提高,就以不同的組合更改組大小。在 wbit 和 groupsize 的某些組合下,模型精度可以顯著提高。)

python llama.py ./Vicuna-13b c4 --wbits 4 --true-sequential --act-order \
--save_safetensors Vicuna-13b-4bit-act-order.safetensors

現在模型已準備就緒,並儲存為 Vicuna-13b-4bit-act-order.safetensors

用於 AMD GPU 的 GPTQ 去量化 + FP16 矩陣乘法核心

https://github.com/oobabooga/GPTQ-for-LLaMa/blob/57a26292ed583528d9941e79915824c5af012279/quant_cuda_kernel.cu#L891 中更最佳化的核心實現

目標是 A100 GPU,不相容 ROCM5.4.3 HIPIFY 工具包。需要進行如下修改。VecQuant2MatMulKernelFaster、VecQuant3MatMulKernelFaster、VecQuant4MatMulKernelFaster 核心也一樣。

為方便起見,所有修改後的程式碼都可在 Github Gist 中找到。

社群

註冊登入 發表評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.