在单个GPU上使用ROCm运行类似Chatgpt的聊天机器人

使用ROCm在单个GPU上运行Chatgpt类聊天机器人

介绍

ChatGPT,OpenAI的开创性语言模型,已成为人工智能领域的一个有影响力的力量,为各个行业的人工智能应用铺平了道路。ChatGPT具备理解和生成类似于人类文本的惊人能力,已经改变了从客户支持到创意写作等多个行业,并成为了一种宝贵的研究工具。

已经做出了各种努力来提供开源的大型语言模型,这些模型在较小的尺寸上展示出了很强的能力,比如OPT,LLAMA,Alpaca和Vicuna。

在这篇博客中,我们将深入探讨Vicuna的世界,并解释如何在单个AMD GPU上使用ROCm运行Vicuna 13B模型。

Vicuna是什么?

Vicuna是一个开源的聊天机器人,拥有130亿个参数,由加州大学伯克利分校、卡内基梅隆大学、斯坦福大学和加州大学圣地亚哥分校的团队开发。为了创建Vicuna,使用了约70,000个用户共享的通过公共API从ShareGPT.com收集的对话来微调LLAMA基础模型。根据使用GPT-4作为参考的初步评估,相比于OpenAI的ChatGPT,Vicuna-13B的质量提升了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模型,如下所示:

在AMD GPU上使用ROCm运行Vicuna 13B模型

要在AMD GPU上运行Vicuna 13B模型,我们需要利用ROCm(Radeon Open Compute)的强大功能,这是一个开源软件平台,为深度学习和高性能计算应用提供AMD GPU加速。

以下是如何在AMD GPU上使用ROCm设置和运行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 MI210和Radeon 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

这些命令将会将HIPIFIED CUDA等效内核二进制文件编译和链接到

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

# 模型推理
python llama_inference.py ../../models/vicuna-13b --wbits 4 --load \
../../models/vicuna-13b/vicuna-13b_4_actorder.safetensors --groupsize 128 --text “在这里输入文本”

现在,一切都准备好了,是时候在您的AMD GPU上运行Vicuna 13B模型了。使用上述命令运行模型。将“Your input text here”替换为您要用作模型输入的文本。如果一切设置正确,您应该会看到模型根据您的输入生成输出文本。

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,您需要设置控制器、工作器(Vicunal模型工作器)和Web服务器,通过将它们作为后台任务运行。

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 Matmul

  • Vicuna 13b – 量化(4位/fp32):4位数据类型参数,fp32 Matmul

  • Vicuna 13b – 量化(4位/fp16):4位数据类型参数,fp16 Matmul

指标 – 延迟(令牌生成延迟,ms)

  • 在令牌生成阶段进行测量。

  • Vicuna 13b – 基线:fp16数据类型参数,fp16 Matmul

  • Vicuna 13b – 量化(4位/fp32):4位数据类型参数,fp32 Matmul

  • Vicuna 13b – 量化(4位/fp16):4位数据类型参数,fp16 Matmul

结论

大型语言模型(LLM)在聊天机器人系统方面取得了重要进展,如OpenAI的ChatGPT所示。 Vicuna-13B是一个开源的LLM模型,已经开发并展示了出色的能力和质量。

通过遵循本指南,您现在应该对如何在AMD GPU上使用ROCm设置和运行Vicuna 13B模型有了更好的了解。这将使您能够为您的研究和个人项目充分发挥这个前沿语言模型的潜力。

谢谢阅读!

附录 – GPTQ模型量化

从浮点LLaMA模型构建Vicuna量化模型

a. 从Huggingface下载LLaMA和Vicuna delta模型

Vicuna的开发人员(lmsys)仅提供可以应用于LLaMA模型的增量模型。分别从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

GPTQ去量化 + 适用于AMD GPU的FP16 Mamul内核

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