本文参考Llama3-Tutorial(Llama 3 超级课堂),感谢机智流提供的教程,感谢书生*浦语社区提供的免费算力!
介绍
LMDeploy是一个用于压缩、部署和服务LLM的工具包,由MMRazor和MMDeploy团队开发。具有高效推理、有效量化和轻松分发的特性。
性能对比
开始部署
准备环境
InternStudio 平台已经提供了环境,但是为了更好的学习效果,建议大家手敲一遍,加深印象
conda create -n lmdeploy python=3.10
conda activate lmdeploy
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia
安装lmdeploy
pip install -U lmdeploy[all]
下载Llama3
因为磁盘空间有限,超出数据会丢失,我们就直接引用已经下载的模型就可以了。首先要创建~/model目录,避免开发机停止后被删除
mkdir -p ~/model
cd ~/model
# 引用已经存在的模型
ln -s /root/share/new_models/meta-llama/Meta-Llama-3-8B-Instruct ~/model/Meta-Llama-3-8B-Instruct
使用Ldeploy运行Llama3
# 切换到指定环境
conda activate lmdeploy
# 运行llama3
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct
运行结果如图所示:
资源消耗
LMDeploy模型量化(lite)
设置最大KV Cache缓存大小
模型在运行时,占用的显存大致分为三部分:
- 模型参数本身占用的显存
- KV Cache占用的显存
- 中间运算结果占用的显存
LMDeploy的KV Cache管理器可以通过设置 --cache-max-entry-count参数,控制值KV缓存占用剩余显存的最大比例。默认0.8。调小此参数的代价是会降低模型推理速度。
在InternStudio中执行
studio-smi
查看显存占用
可以看到,默认情况下模型占用了23120M的显存,为了方便比较,我们改成0.01,重新使用下面的命令运行
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct/ --cache-max-entry-count 0.01
再次查看显存占用,可以看到显存明显降低!
使用W4A16量化
执行如下命令
lmdeploy lite auto_awq \
/root/model/Meta-Llama-3-8B-Instruct \
--calib-dataset 'ptb' \
--calib-samples 128 \
--calib-seqlen 1024 \
--w-bits 4 \
--w-group-size 128 \
--work-dir /root/model/Meta-Llama-3-8B-Instruct_4bit
执行过程:
运行时间比较长。量化结束后,新的HF模型保存到Meta-Llama-3-8b-Instruct_4bit目录。运行量化后的模型:
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct_4bit --model-format awq
再次查看显存占用
将KV Cache调整为0.01后运行
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct_4bit --model-format awq --cache-max-entry-count 0.01
显存占用只有6546M。
数据对比:
在线量化
自v0.4.0开始,LMDeploy KV量化改为在线,并且支持int4、int8两种数值精读,量化方式为per-head per-token的非对称量化。它具备以下优势:
- 量化不需要校准数据集
- kv int8量化精度几乎无损,kv int4量化,RPS相较于fp16分别提升30%和40%
- 支持volta架构(sm70)及以上的所有显卡:V100、20系列、T4、30系列、40系列、A10、A100等通过LMDeploy应用kv量化非常简单,只需要设定quant_policy参数。LMdeploy规定,quant_policy=4表示kv int4量化,quant_policy=8表示kv int8 量化。
LMDeploy服务(API Server)
部署API Server
lmdeploy serve api_server \
/root/model/Meta-Llama-3-8B-Instruct \
--model-format hf \
--quant-policy 0 \
--server-name 0.0.0.0 \
--server-port 23333 \
--tp 1
其中,server-name和server-port表示api服务的服务于端口号,tp表示并行数量(GPU数量)。
参考VScode 远程连接开发机,将端口2333映射出来,访问效果如下:
命令行连接API Server
新建一个中端,运行以下命令
# 切换环境
conda activate lmdeploy
# 连接ApiServer
lmdeploy serve api_client http://localhost:23333
效果如图:
WebUI连接API Server
退出刚才的命令行client,确保gradio的版本低于4.0.0
pip install gradio==3.50.2
使用Gradio作为前端,启动网页客户端:
lmdeploy serve gradio http://localhost:23333 \
--server-name 0.0.0.0 \
--server-port 6006
运行效果如图:
最后
LLM的门槛当下还是很高,个人玩家很难入门,在这里再次感谢大佬们的无私奉献!另外书生浦语举办的大模型实战营第二期开班了,免费学、免费提供算力!欢迎大佬萌新加入交流!