OpenMMLab 书生·浦语大模型实战 笔记/作业5 量化部署

目录

1模型部署

2部署的挑战

3减少显存占用的几种常用方式

3.1剪枝

3.2知识蒸馏 

3.3量化

LMDeploy

实践

使用LMDeploy与模型对话

​编辑

LMDeploy模型量化  lmdeploy lite

LMDeploy服务(serve)

python代码集成


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输出不对,具体原因就未知了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值