在 AMD GPU 上使用 ROCm 运行 Vicuna 13B
TL;DR
Hugging Face 已展示,Vicuna 13B 开源聊天机器人可以通过利用 ROCm(Radeon Open Compute)和 GPTQ 4 位量化在单个 AMD GPU 上运行。此方法将 GPU 内存需求从约 28GB(fp16)降低至 7.52GB,使模型能够在消费级硬件如 Radeon RX6900XT 上运行。
Vicuna 13B 模型
Vicuna 是一个拥有 130 亿参数的开源聊天机器人,由加州大学伯克利分校、卡内基梅隆大学、斯坦福大学和加州大学圣迭戈分校合作开发。它通过使用来自 ShareGPT.com 的约 70,000 条用户共享对话,对 LLaMA 基础模型进行微调而创建。使用 GPT-4 作为参考的初步评估表明,Vicuna-13B 的质量超过 OpenAI ChatGPT 的 90%,总训练成本约为 300 美元。
通过 GPTQ 量化进行内存优化
在 fp16 精度下运行 Vicuna-13B 需要约 28GB 的 GPU 内存,这超出了许多单卡 GPU 的容量。为了解决此问题,Hugging Face 使用 GPTQ(精确的后训练量化),该技术允许参数超过 100 亿的模型在使用 3 位或 4 位精度的同时,保持与 fp16 相当的准确性。
量化不仅对内存占用至关重要,对延迟也同样关键。由于大型语言模型的 token 生成通常受内存带宽限制,而非原始计算能力(TFLOPs),当 GPU 处于内存受限状态时,量化模型不会出现 token 生成延迟增加的情况。
在 AMD 硬件上的技术实现
系统要求
- Hardware: 支持 ROCm 的 AMD GPU(已在 Instinct MI210 和 Radeon RX6900XT 上测试)。
- OS: 基于 Linux,推荐使用 Ubuntu 18.04、20.04 或 22.04。
- Software: ROCm 5.4.3、PyTorch 2.0 和 Python 3.6+。
- Environment: Conda 或 Docker。
部署工作流
- ROCm Installation: 安装
amdgpu-install包并为hiplibsdk、rocm和dkms配置系统。 - Containerization: 使用兼容 ROCm 的 PyTorch Docker 镜像(例如
rocm/pytorch:rocm5.4.2_ubuntu20.04_py3.8_pytorch_2.0.0_preview)。 - Model Acquisition: 从 Hugging Face 下载 4 位量化的 Vicuna-13b 权重,或使用 GPTQ-for-LLaMa 仓库对浮点模型进行量化。
- Inference: 使用
llama_inference.py脚本并加上--wbits 4和--groupsize 128参数来生成文本。 - API Integration: 可通过 FastChat 的 Web API 服务器公开模型,需要一个 controller、一个 model worker 和一个 Gradio Web 服务器。
性能与准确性指标
内存消耗
量化显著降低了显存占用。对于 13B 模型,内存需求从 fp16 的超过 28GB 降至 4 位量化的 7.52GB,仅占 Radeon RX6900XT 上 16GB DDR 的 46%。
准确性(困惑度)
使用 C4 数据集的 2,048 条样本,通过困惑度(PPL)衡量准确性。结果显示,4 位量化模型(使用 fp32 或 fp16 矩阵乘)相对于 fp16 基线保持了高准确性。
延迟
在不同配置下测量了 token 生成延迟。数据表明,4 位量化版本相较于 fp16 基线并未带来显著的延迟惩罚。
附录:手动模型量化
对于希望自行创建量化模型的用户,流程包括:
- Applying Delta Weights: 由于 Vicuna 以 delta 权重形式发布,需要使用
fastchat.model.apply_delta命令将其应用到原始 LLaMA 基础模型上。 - Quantization Process: 使用
GPTQ-for-LLaMa仓库,将模型在 C4 数据集上进行校准后量化为 4 位精度,并将结果保存为.safetensors文件。