1.LMDeploy环境准备
1.1 Cuda环境问题
此处应该选择镜像Cuda12.2-conda。如果选择Cuda11.7-conda的镜像,新版本的lmdeploy会出现兼容性问题。
1.2 创建conda环境
studio-conda -t lmdeploy -o pytorch-2.1.2
1.3 安装LMDeploy
step1: conda activate lmdeploy
step2: pip install lmdeploy[all]==0.3.0
等待安装结束。
2.LMDeploy模型对话
2.1 下载模型
> way1: ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/
> way2: cp -r /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/
2.2 使用Transformer库运行模型
step1: touch /root/pipeline_transformer.py
step2: conda activate lmdeploy
step3: python /root/pipeline_transformer.py
运行效果:
2.3 使用LMDeploy与模型对话
step1: 激活环境 conda activate lmdeploy
step2: 进行chat,格式为 lmdeploy chat [HF格式模型路径/TurboMind格式模型路径]
step3: lmdeploy chat /root/internlm2-chat-1_8b
3.LMDeploy模型量化(lite)
3.1 两个概念
- 计算密集(compute-bound): 指推理过程中,绝大部分时间消耗在数值计算上;针对计算密集型场景,可以通过使用更快的硬件计算单元来提升计算速度。
- 访存密集(memory-bound): 指推理过程中,绝大部分时间消耗在数据读取上;针对访存密集型场景,一般通过减少访存次数、提高计算访存比或降低访存量来优化。
常见的 LLM 模型由于 Decoder Only 架构的特性,实际推理时大多数的时间都消耗在了逐 Token 生成阶段(Decoding 阶段),是典型的访存密集型场景。
3.2 设置最大KV Cache缓存大小
3.2.1 尝试不同的–cache-max-entry-count参数
lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.4
3.2.2 效果展示
3.3 使用W4A16量化
3.3.1 简介
LMDeploy使用AWQ算法,实现模型4bit权重量化。推理引擎TurboMind提供了非常高效的4bit推理cuda kernel,性能是FP16的2.4倍以上。
3.3.2 实操
运行前,首先安装一个依赖库。
step1: pip install einops==0.7.0
step2: 只需运行下面一条命令即可完成模型量化
lmdeploy lite auto_awq \
/root/internlm2-chat-1_8b \
--calib-dataset 'ptb' \
--calib-samples 128 \
--calib-seqlen 1024 \
--w-bits 4 \
--w-group-size 128 \
--work-dir /root/internlm2-chat-1_8b-4bit
运行结果展示:
3.3.3 效果展示
简单展示,如下所示:
lmdeploy chat /root/internlm2-chat-1_8b-4bit --model-format awq
为了更加明显体会到W4A16的作用,我们将KV Cache比例调为0.4,查看显存占用情况。
lmdeploy chat /root/internlm2-chat-1_8b-4bit --model-format awq --cache-max-entry-count 0.4
效果展示:
非常的不错!!!速度非常快
4.LMDeploy服务
下面是架构图:
4.1 启动API服务器
通过以下命令启动API服务器,推理internlm2-chat-1_8b模型:
step1: 启动API服务器
lmdeploy serve api_server \
/root/internlm2-chat-1_8b \
--model-format hf \
--quant-policy 0 \
--server-name 0.0.0.0 \
--server-port 23333 \
--tp 1
step2: 端口转发
ssh -CNg -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p 端口号
step3: 网页访问
浏览器打开http://127.0.0.1:23333
其中,model-format、quant-policy这些参数是与第三章中量化推理模型一致的;server-name和server-port表示API服务器的服务IP与服务端口;tp参数表示并行数量(GPU数量)。
效果展示:
4.2 命令行客户端连接API服务器
在4.1节中,我们在终端里新开了一个API服务器。下面进行命令行链接API服务器:
step1: conda activate lmdeploy
step2: lmdeploy serve api_client http://localhost:23333
效果展示:
现在使用的架构为:
4.3 网页客户端连接API服务器
step1: 激活环境
conda activate lmdeploy
step2: 使用Gradio作为前端,启动网页客户端。
lmdeploy serve gradio http://localhost:23333 \
--server-name 0.0.0.0 \
--server-port 6006
step3: 配置端口转发
ssh -CNg -L 6006:127.0.0.1:6006 root@ssh.intern-ai.org.cn -p 端口号
step4: 打开浏览器,访问地址http://127.0.0.1:6006
一不下心出了一个这个:
按照提示修改好即可
运行结果展示:
现在你使用的架构是这样的:
5.Python代码集成
在开发项目时,有时我们需要将大模型推理集成到Python代码里面。
5.1 Python代码集成运行1.8B模型
首先激活conda环境。
conda activate lmdeploy
新建Python源代码文件pipeline.py。
touch /root/pipeline.py
打开pipeline.py,填入以下内容。
from lmdeploy import pipeline
pipe = pipeline('/root/internlm2-chat-1_8b')
response = pipe(['Hi, pls intro yourself', '上海是'])
print(response)
代码解读:
第1行,引入lmdeploy的pipeline模块
第3行,从目录“./internlm2-chat-1_8b”加载HF模型
第4行,运行pipeline,这里采用了批处理的方式,用一个列表包含两个输入,lmdeploy同时推理两个输入,产生两个输出结果,结果返回给response
第5行,输出response
5.2 向TurboMind后端传递参数
在第3章,我们通过向lmdeploy传递附加参数,实现模型的量化推理,及设置KV Cache最大占用比例。在Python代码中,可以通过创建TurbomindEngineConfig,向lmdeploy传递参数。
以设置KV Cache占用比例为例,新建python文件pipeline_kv.py。
如下图所示:
得到输出结果:
6.拓展部分
6.1 使用LMDeploy运行视觉多模态大模型llava
最新版本的LMDeploy支持了llava多模态模型,下面演示使用pipeline推理llava-v1.6-7b。
6.1.1 命令行使用
step1: 激活环境
conda activate lmdeploy
step2: 安装llava依赖库。
pip install git+https://github.com/haotian-liu/LLaVA.git@4e2277a060da264c4f21b364c867cc622c945874
step3: 新建pipeline_llava.py
touch /root/pipeline_llava.py
step4: 运行pipeline_llava.py
| 依赖安装完毕:
| 运行结果截图
6.1.2 Gradio运行llava模型
step1: 创建gradio_llava.py文件
step2: python /root/gradio_llava.py
step3: 配置端口转发(同上)
终端展示:
运行效果展示: