在 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。

部署工作流

  1. ROCm Installation: 安装 amdgpu-install 包并为 hiplibsdkrocmdkms 配置系统。
  2. Containerization: 使用兼容 ROCm 的 PyTorch Docker 镜像(例如 rocm/pytorch:rocm5.4.2_ubuntu20.04_py3.8_pytorch_2.0.0_preview)。
  3. Model Acquisition: 从 Hugging Face 下载 4 位量化的 Vicuna-13b 权重,或使用 GPTQ-for-LLaMa 仓库对浮点模型进行量化。
  4. Inference: 使用 llama_inference.py 脚本并加上 --wbits 4--groupsize 128 参数来生成文本。
  5. 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 基线并未带来显著的延迟惩罚。

附录:手动模型量化

对于希望自行创建量化模型的用户,流程包括:

  1. Applying Delta Weights: 由于 Vicuna 以 delta 权重形式发布,需要使用 fastchat.model.apply_delta 命令将其应用到原始 LLaMA 基础模型上。
  2. Quantization Process: 使用 GPTQ-for-LLaMa 仓库,将模型在 C4 数据集上进行校准后量化为 4 位精度,并将结果保存为 .safetensors 文件。

Sources