一、环境配置见:https://github.com/InternLM/Tutorial/blob/camp3/docs/L2/LMDeploy/readme.md
验证LMDeploy启动InternLM2_5-7b-chat
conda activate lmdeploy
lmdeploy chat /root/models/internlm2_5-7b-chat
二、量化显存计算
参数计算:
LMDeploy 提供了权重量化和 k/v cache两种策略。
k/v cache
InternLM2.5正常运行时占用显存23G:
1、在 BF16 精度下,7B模型权重占用14GB:70×10^9 parameters×2 Bytes/parameter=14GB
2、kv cache占用8GB:剩余显存24-14=10GB,kv cache默认占用80%,即10*0.8=8GB
3、其他项1GB
是故23GB=权重占用14GB+kv cache占用8GB+其它项1GB
lmdeploy chat /root/models/internlm2_5-7b-chat --cache-max-entry-count 0.4 这个参数是控制kv缓存占用剩余显存的最大比例。默认的比例为0.8,设置缓存的最大条目数量为 0.4 。缓存的作用通常是为了提高数据的访问速度,减少重复计算或读取数据的时间。通过设置这个参数,可以控制缓存的大小和使用效率,以平衡性能和资源消耗。
修改kv cache占用之后的显存占用情况(19GB, 减少4G):
1、与减少KV chache之前一样,在 BF16 精度下,7B模型权重占用14GB
2、kv cache占用4GB:剩余显存24-14=10GB,kv cache修改为占用40%,即100.4=4GB
3、其他项1GB
是故19GB=权重占用14GB+kv cache占用4GB+其它项1GB
而此刻减少的4GB显存占用就是从10GB0.8-10GB*0.4=4GB
在线量化
由于都使用BF16精度下的internlm2.5 7B模型,故剩余显存均为10GB,且 cache-max-entry-count 均为0.4,这意味着LMDeploy将分配40%的剩余显存用于kv cache,即10GB*0.4=4GB。但quant-policy 设置为4时,意味着使用int4精度进行量化。因此,LMDeploy将会使用int4精度提前开辟4GB的kv cache。
相比使用BF16精度的kv cache,int4的Cache可以在相同4GB的显存下只需要4位来存储一个数值,而BF16需要16位。这意味着int4的Cache可以存储的元素数量是BF16的四倍。
int4 的cache采用auto_awq方法进行量化:
lmdeploy lite auto_awq \/root/models/internlm2_5-7b-chat \--calib-dataset 'ptb' \--calib-samples 128 \--calib-seqlen 2048 \--w-bits 4 \--w-group-size 128 \--batch-size 1 \--search-scale False \--work-dir /root/models/internlm2_5-7b-chat-w4a16-4bit
W4:这通常表示权重量化为4位整数(int4)。这意味着模型中的权重参数将从它们原始的浮点表示(例如FP32、BF16或FP16,Internlm2.5精度为BF16)转换为4位的整数表示。这样做可以显著减少模型的大小。
A16:这表示激活(或输入/输出)仍然保持在16位浮点数(例如FP16或BF16)。激活是在神经网络中传播的数据,通常在每层运算之后产生。
因此,W4A16的量化配置意味着:
权重被量化为4位整数。
激活保持为16位浮点数。
命令解释:
lmdeploy lite auto_awq: lite这是LMDeploy的命令,用于启动量化过程,而auto_awq代表自动权重量化(auto-weight-quantization)。
/root/models/internlm2_5-7b-chat: 模型文件的路径。
–calib-dataset ‘ptb’: 这个参数指定了一个校准数据集,这里使用的是’ptb’(Penn Treebank,一个常用的语言模型数据集)。
–calib-samples 128: 这指定了用于校准的样本数量—128个样本
–calib-seqlen 2048: 这指定了校准过程中使用的序列长度—2048
–w-bits 4: 这表示权重(weights)的位数将被量化为4位。
–work-dir /root/models/internlm2_5-7b-chat-w4a16-4bit: 这是工作目录的路径,用于存储量化后的模型和中间结果。
基础任务
使用结合W4A16量化与kv cache量化的internlm2_5-7b-chat模型封装本地API并与大模型进行一次对话:
使用Function call功能让大模型完成一次简单的"加"与"乘"函数调用,作业截图需包括大模型回复的工具调用情况: