在单 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 中找到。

社区

注册登录 发表评论