这一节需要准备一个心的环境lmdeploy。
环境准备
老师提供两种方案
# 如果你是InternStudio 可以直接使用
# studio-conda -t lmdeploy -o pytorch-2.1.2
# 初始化环境
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
我使用studio-conda -t lmdeploy -o pytorch-2.1.2
这个方案。
安装lmdeploy最新版。
pip install -U lmdeploy[all]
超时了,重试就好了。
软链接 InternStudio 中的模型。
mkdir -p ~/model
cd ~/model
ln -s /root/share/new_models/meta-llama/Meta-Llama-3-8B-Instruct ~/model/Meta-Llama-3-8B-Instruct
LMDeploy Chat CLI
终端直接运行下面命令就好
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct
随便问几个问题看看
LMDeploy模型量化(lite)
目的:减小显存占用,提升运行速度
本部分内容主要介绍如何对模型进行量化。主要包括 KV8量化和W4A16量化。
模型在运行时,占用的显存可大致分为三部分:模型参数本身占用的显存、KV Cache占用的显存,以及中间运算结果占用的显存。LMDeploy的KV Cache管理器可以通过设置–cache-max-entry-count参数,控制KV缓存占用剩余显存的最大比例。默认的比例为0.8。
设置最大KV Cache缓存大小
默认(0.8)
命令
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct/
改成0.5
命令
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct/ --cache-max-entry-count 0.5
极限0.1
命令
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct/ --cache-max-entry-count 0.01
从上面可以看出来,参数--cache-max-entry-count
值越小,占用显存越少。
通过聊天也发现,值越小,推理速度也降低了,回复也变慢了。
使用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
等待量化完成后,我们直接运行下面命令
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct_4bit --model-format awq --cache-max-entry-count 0.01
可以看出,显存占用明显降低。
在线量化 KV
自 v0.4.0 起,LMDeploy KV 量化方式有原来的离线改为在线。并且,支持两种数值精度 int4、int8。量化方式为 per-head per-token 的非对称量化。它具备以下优势:
- 量化不需要校准数据集
- kv int8 量化精度几乎无损,kv int4 量化精度在可接受范围之内
- 推理高效,在 llama2-7b 上加入 int8/int4 kv 量化,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/docs/en/get_started.md at main · InternLM/lmdeploy
LMDeploy服务(serve)
启动API服务器
通过以下命令启动API服务器,推理Meta-Llama-3-8B-Instruct模型:
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
其中,model-format、quant-policy这些参数是与第三章中量化推理模型一致的;server-name和server-port表示API服务器的服务IP与服务端口;tp参数表示并行数量(GPU数量)。 通过运行以上指令,我们成功启动了API服务器,请勿关闭该窗口,后面我们要新建客户端连接该服务。
运行命令
点击下图的小地球,就能访问了
命令行客户端链接服务器
打开一个新的终端,运行下面命令
conda activate lmdeploy
lmdeploy serve api_client http://localhost:23333
聊两句
网页客户端连接API服务器
再新开一个终端,切换环境
conda activate lmdeploy
安装gradio,确保自己的gradio版本低于4.0.0。
pip install gradio==3.50.2
我开发机已经有了所以我没有下载,查看命令
pip list
运行下面命令启动网页客户端
lmdeploy serve gradio http://localhost:23333 \
--server-name 0.0.0.0 \
--server-port 6006
点击小地球访问
聊两句
拓展
推理速度
克隆仓库
cd ~
git clone https://github.com/InternLM/lmdeploy.git
下载测试数据
cd /root/lmdeploy
wget https://hf-mirror.com/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json
运行命令
python benchmark/profile_throughput.py \
ShareGPT_V3_unfiltered_cleaned_split.json \
/root/model/Meta-Llama-3-8B-Instruct \
--cache-max-entry-count 0.8 \
--concurrency 256 \
--model-format hf \
--quant-policy 0 \
--num-prompts 10000
展示
没跑起来,看报错是ArgumentHelper没有enable_prefix_caching 属性
去改下脚本,注释掉下面代码
运行命令
又没跑起来,老师建议(如果你的显存较小,可以调低–cache-max-entry-count)
调成0.5跑
起来了,结果如下:
使用LMDeploy运行视觉多模态大模型Llava-Llama-3
安装依赖
pip install git+https://github.com/haotian-liu/LLaVA.git
创建脚本文件
touch /root/pipeline_llava.py
编写脚本内容
from lmdeploy import pipeline, ChatTemplateConfig
from lmdeploy.vl import load_image
pipe = pipeline('xtuner/llava-llama-3-8b-v1_1-hf',
chat_template_config=ChatTemplateConfig(model_name='llama3'))
image = load_image('https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/tests/data/tiger.jpeg')
response = pipe(('describe this image', image))
print(response.text)
运行脚本
python pipeline_llava.py