赞
踩
第五节 LMDeploy大模型量化部署实践
本文介绍大模型部署的背景知识,并介绍LMDeploy工具,并实现一个部署demo
显存开销大:7B的模型就需要14G显存
自回归需要缓存大量的kv,显存开销大
shape是动态的:请求数量不固定,token逐个生成
设备:难以应对巨大的存储开销
推理:token的生成如何加速;动态的shape如何解决;如何有效管理和利用内存
服务:提升系统的整体吞吐量,降低平均响应时间
模型并行
低比特量化
…
LLM在英伟达设备上的部署方案,包含模型轻量化、推理和服务
推理性能:
静态(固定batch和输出输入的token数目):小batch下性能是fp16的两倍,batch越大加速效果越不明显
动态(输入输出不定长):精度优于vLLM框架
量化的目的:减小显存占用,提升运行速度
推理的两种该情况:计算密集和访存密集
解决计算密集:采用更快的硬件计算单元提升速度,如量化
解决访存密集:提高计算访存比
Weight Only的量化可以一举两得的起到解决现存和提升推理速度的作用,内部的核心算法是AWQ算法
持续批处理:
不必batch中的所有样本都处理完才进行下一个batch
有状态的推理:
请求不带历史记录,历史记录在推理测缓存中
blocked k/vcache:
block有三种状态:Free,Activate,Cache
计算过程中动态的调整显存
高性能的cuda kernel:
不断更新最新的优化方法
通过api启动服务
创建环境
/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
在线转换模型权重,直接读取本地的模型权重
(也支持读取huggingface上的模型权重)
lmdeploy chat turbomind /share/temp/model_repos/internlm-chat-7b/ --model-name internlm-chat-7b
运行上述命令会在终端直接创建一个对话窗口
与在线转换的区别在于需要首先将模型转换为TurboMind格式
转换后就可以实现tensor并行
创建一个lmdeploy文件夹,并利用官方提供的模型文件进行离线转换
mkdir lmdeploy
cd lmdeploy
lmdeploy convert internlm-chat-7b /root/share/temp/model_repos/internlm-chat-7b/
转换后会在当前文件夹下生成一个workspace文件夹
随后使用lmdeploy chat turbomind ./workspace
即可启动基于TurboMind推理引擎的本地对话
可以发现同样的指令,两次生成的故事是不一样的,并且基于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
再启动一个终端,在新终端中运行
lmdeploy serve api_client http://localhost:23333
这样就可以启动刚刚创建的API服务,不需要加载模型,速度更快
打开本地终端,输入以下指令
ssh -CNg -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p <你的ssh端口号>
即可在本地打开http://localhost:23333
可以通过在页面上修改传入API的参数,实现对话
发现这里的模型似乎有点奇怪,问他是谁他竟然说自己是程序员哈哈
可以使用TurboMind服务作为后端或者直接用TurboMind推理作为后端
以TurboMind推理作为后端:
lmdeploy serve gradio ./workspace
此时本地需要映射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
再用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
完成后打开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)
LLM是访存密集型,量化可以降低显存,提高效率
资源足够的时候可以不需要量化,只有CPU或者文本长度很长的时候,就需要量化
将KV变成int8
第一步:计算minmax
第二步:线性映射到0-255或者-127-127的范围
第三步:修改配置文件quant_policy参数为4,表示打开KVCache的开关
可以解决20%的显存,性能有时候还有提升。
量化相当于引入了轻微的噪声,有可能会起到一定的正则化作用;同时量化后的模型可能刚好适配某个数据集
A16表示Activation保持FP16,只对权重参数进行4bit量化
本文主要介绍了模型量化和LMDeploy的基本应用,并实现了几个部署的demo
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。