目录
1模型部署
模型部署需要将训练好的模型运行在特定的环境里如:CPU/NPU,移动端等,对不同的平台可能还需要考虑硬件性能并做一些相关的优化
2部署的挑战
但是部署面临很多挑战,如:计算量大,内存开销大,访问瓶颈等
前向推理计算量公式:c=2*模型参数量+2*模型层数*上下文长度*注意力维度 FLOPs/Token
fp16 20B模型需要40G显存,推理过程中需要缓存KV cache提高速度,占用更多显存
kv cache 显存占用 M=4*batch-size*模型层数*注意力维度*(输入序列长度+输出序列长度) 字节
模型前向运行时速度的主要瓶颈在访存,因为访存速度慢于计算速度,同时请求的并发量和到来时间都不确定,生成的token数量也不确定
3减少显存占用的几种常用方式
3.1剪枝
移除模型中的一部分,非结构化剪枝 移除个别参数不影响整体模型结构
结构化剪枝 移除一部分层,保持整体网络结构但是降低复杂性
3.2知识蒸馏
教师模型训练学生模型
3.3量化
浮点数降低精度,减少内存占用,可以训练时量化或训练后量化
一般就是通过最大值最小值范围的缩放实现量化,涉及缩放系数S和零值ZP
ZP=(min+max)/2 (看情况有时候可以是0的) , S=(max-min)/255 (不一定非得是255 看具体几位量化了),量化 q=round((f-ZP)/S),反量化 f=q*S+ZP
LMDeploy
高效推理,量化,服务,支持多模态大模型,听说速度比vLLm快,具体等我体验过后再来评价
实践
先说结论,实践下来感觉虽然速度快了,但是非A100的GPU上模型的输出不正常,量化与否都和直接pytorch运行不一样
modelscope下载模型:
#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('Shanghai_AI_Laboratory/internlm2-1_8b')
安装lmdeploy : pip install lmdeploy[all]即可, 测试时发现 lmdeploy 使用 torch = 2.0出现coredump
使用LMDeploy与模型对话
下载的模型路径在这:./internlm2-1_8b 直接执行 lmdeploy chat ./internlm2-1_8b 即可
在远程的A100服务器上,输出是正常的
在本地的 3080 机器上运行时输出不正常,lmdeploy版本是一样的0.3.0,模型可能不是一个版本这是modelscope下载的,从输出看到好像本地运行时没有对话模板,不知道对话模板是从哪里加载的
不知道是不是因为对话模板的缘故,模型的输出感觉不太正常:
LMDeploy模型量化 lmdeploy lite
执行这个命令会自动下载数据集进行训练后量化:
lmdeploy lite auto_awq ./internlm2-1_8b/ --calib-dataset 'ptb' --calib-samples 128 --calib-seqlen 1024 --w-bits 4 --w-group-size 128 --work-dir ./internlm2-chat-1_8b-4bit
量化完成后,加载模型同时设置KV cache比例
lmdeploy chat ./internlm2-chat-1_8b-4bit --model-format awq --cache-max-entry-count 0.4
速度是快不少显存占用也有明显的下降,但是感觉输出更加奇怪了,不知道什么毛病啊,用户体验不太好,是我打开方式不对吗?:
LMDeploy服务(serve)
lmdeploy自带api server, 直接启动即可:
lmdeploy serve api_server \
./internlm2-1_8b/ \
--model-format hf \
--quant-policy 0 \
--server-name 0.0.0.0 \
--server-port 23333 \
--tp 1
它还贴心地自带了一个client可以用来测试用,反正输出就是不太正常:
lmdeploy serve api_client http://localhost:23333
感觉命令行客户端太简陋也有自带的gradio前端就是版本有点老:
lmdeploy serve gradio http://localhost:23333 \ --server-name 0.0.0.0 \ --server-port 6006
emm,输出感觉不对,然后速度巨慢,我感觉这里有什么bug吧
python代码集成
除了用server也可以用python代码运行模型
from lmdeploy import pipeline
pipe = pipeline('./internlm2-1_8b')
response = pipe(['哈喽', '讲个小故事吧'])
print(response)
反正体验下来 觉得lmdeploy 虽然速度快,但是模型输出和原来的pytorch运行不一样,开始我以为是 chat-template 没设置的原因,但是模型能正常输出说明不是 chat-template的原因,我怀疑里面有bug导致模型的某些layer输出不对,具体原因就未知了