文章目录
前言
本文介绍大模型部署的背景知识,并介绍LMDeploy工具,并实现一个部署demo
一、大模型部署的背景知识
大模型的特点
显存开销大:7B的模型就需要14G显存
自回归需要缓存大量的kv,显存开销大
shape是动态的:请求数量不固定,token逐个生成
大模型部署的挑战
设备:难以应对巨大的存储开销
推理:token的生成如何加速;动态的shape如何解决;如何有效管理和利用内存
服务:提升系统的整体吞吐量,降低平均响应时间
部署的方案
模型并行
低比特量化
…
二、LMDeploy简介
1.基本情况
LLM在英伟达设备上的部署方案,包含模型轻量化、推理和服务
推理性能:
静态(固定batch和输出输入的token数目):小batch下性能是fp16的两倍,batch越大加速效果越不明显
动态(输入输出不定长):精度优于vLLM框架
2.LMDeploy的核心功能
量化
量化的目的:减小显存占用,提升运行速度
推理的两种该情况:计算密集和访存密集
解决计算密集:采用更快的硬件计算单元提升速度,如量化
解决访存密集:提高计算访存比
Weight Only的量化可以一举两得的起到解决现存和提升推理速度的作用,内部的核心算法是AWQ算法
推理引擎TurboMind
持续批处理:
不必batch中的所有样本都处理完才进行下一个batch
有状态的推理:
请求不带历史记录,历史记录在推理测缓存中
blocked k/vcache:
block有三种状态:Free,Activate,Cache
计算过程中动态的调整显存
高性能的cuda kernel:
不断更新最新的优化方法
推理服务
通过api启动服务
部署实战demo
准备工作
创建环境
/root/share/install_conda_env_internlm_base.sh lmdeploy #复制一个base环境
conda activate lmdeploy # 激活环境
pip install packaging # 安装一个库
pip install /root/share/wheels/flash_attn-2.4.2+cu118torch2.0cxx11abiTRUE-cp310-cp310-linux_x86_64.whl # 使用预编译包提升flash_attn的安装速度
pip install 'lmdeploy[all]==v0.1.0' # 安装lmdeploy
- 1
- 2
- 3
- 4
- 5
模型转换
在线转换
在线转换模型权重,直接读取本地的模型权重
(也支持读取huggingface上的模型权重)
lmdeploy chat turbomind /share/temp/model_repos/internlm-chat-7b/ --model-name internlm-chat-7b
- 1
运行上述命令会在终端直接创建一个对话窗口
离线转换
与在线转换的区别在于需要首先将模型转换为TurboMind格式
转换后就可以实现tensor并行
创建一个lmdeploy文件夹,并利用官方提供的模型文件进行离线转换
mkdir lmdeploy
cd lmdeploy
lmdeploy convert internlm-chat-7b /root/share/temp/model_repos/internlm-chat-7b/
- 1
- 2
- 3
转换后会在当前文件夹下生成一个workspace文件夹
随后使用lmdeploy chat turbomind ./workspace
即可启动基于TurboMind推理引擎的本地对话
可以发现同样的指令,两次生成的故事是不一样的,并且基于TurboMind推理引擎的生成速度要更快
TurboMind与API服务
使用以下命令启动服务
# ApiServer+Turbomind api_server => AsyncEngine => TurboMind
lmdeploy serve api_server ./workspace \
--server_name 0.0.0.0 \
--server_port 23333 \
--instance_num 64 \
--tp 1
- 1
- 2
- 3
- 4
- 5
- 6
再启动一个终端,在新终端中运行
lmdeploy serve api_client http://localhost:23333
- 1
这样就可以启动刚刚创建的API服务,不需要加载模型,速度更快
打开本地终端,输入以下指令
ssh -CNg -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p <你的ssh端口号>
- 1
即可在本地打开http://localhost:23333
可以通过在页面上修改传入API的参数,实现对话
发现这里的模型似乎有点奇怪,问他是谁他竟然说自己是程序员哈哈
网页demo
可以使用TurboMind服务作为后端或者直接用TurboMind推理作为后端
以TurboMind推理作为后端:
lmdeploy serve gradio ./workspace
- 1
此时本地需要映射6006端口ssh -CNg -L 6006:127.0.0.1:6006 root@ssh.intern-ai.org.cn -p 34027
再打开http://localhost:6006/即可
以TurboMind服务作为后端:
先启动服务:
# ApiServer+Turbomind api_server => AsyncEngine => TurboMind
lmdeploy serve api_server ./workspace \
--server_name 0.0.0.0 \
--server_port 23333 \
--instance_num 64 \
--tp 1
- 1
- 2
- 3
- 4
- 5
- 6
再用gradio调用
# Gradio+ApiServer。必须先开启 Server,此时 Gradio 为 Client
lmdeploy serve gradio http://0.0.0.0:23333 \
--server_name 0.0.0.0 \
--server_port 6006 \
--restful_api True
- 1
- 2
- 3
- 4
- 5
完成后打开http://localhost:6006/ 界面如下
如何选用合适的部署方式
对于Python项目,推荐使用TurboMind推理+Python的方式,直接调用,类似于
from lmdeploy import turbomind as tm
load model
model_path = “/root/share/temp/model_repos/internlm-chat-7b/”
tm_model = tm.TurboMind.from_pretrained(model_path, model_name=‘internlm-chat-20b’)
generator = tm_model.create_instance()
process query
query = “你好啊兄嘚”
prompt = tm_model.model.get_prompt(query)
input_ids = tm_model.tokenizer.encode(prompt)
inference
for outputs in generator.stream_infer(
session_id=0,
input_ids=[input_ids]):
res, tokens = outputs[0]
response = tm_model.tokenizer.decode(res.tolist())
print(response)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
模型量化
LLM是访存密集型,量化可以降低显存,提高效率
资源足够的时候可以不需要量化,只有CPU或者文本长度很长的时候,就需要量化
KV Cache量化
将KV变成int8
第一步:计算minmax
第二步:线性映射到0-255或者-127-127的范围
第三步:修改配置文件quant_policy参数为4,表示打开KVCache的开关
可以解决20%的显存,性能有时候还有提升。
量化相当于引入了轻微的噪声,有可能会起到一定的正则化作用;同时量化后的模型可能刚好适配某个数据集
W4A16量化
A16表示Activation保持FP16,只对权重参数进行4bit量化
总结
本文主要介绍了模型量化和LMDeploy的基本应用,并实现了几个部署的demo
</article>