1. 创建环境
conda create -n lmdeploy -y python=3.10
conda activate lmdeploy
pip install lmdeploy[all]==0.3.0
pip install einops
2. 使用LMDeploy与模型对话
# lmdeploy chat [HF格式模型路径/TurboMind格式模型路径]
lmdeploy chat /root/internlm2-chat-1_8b
启动后就可以与InternLM2-Chat-1.8B大模型对话了,输入问题,然后需要按两下回车键(这里得注意,之前没注意还以为卡住了这么慢),速度确实比之前使用Transformer库来运行模型的速度快。
3. LMDeploy模型量化
量化是一种以参数或计算中间结果精度下降换空间节省(以及同时带来的性能提升)的策略。
- 计算密集(compute-bound): 指推理过程中,绝大部分时间消耗在数值计算上;针对计算密集型场景,可以通过使用更快的硬件计算单元来提升计算速度。
- 访存密集(memory-bound): 指推理过程中,绝大部分时间消耗在数据读取上;针对访存密集型场景,一般通过减少访存次数、提高计算访存比或降低访存量来优化。
常见的 LLM 模型由于 Decoder Only 架构的特性,实际推理时大多数的时间都消耗在了逐 Token 生成阶段(Decoding 阶段),是典型的访存密集型场景。可以使用KV8量化和W4A16量化。
- KV8量化是指将逐 Token(Decoding)生成过程中的上下文 K 和 V 中间结果进行 INT8 量化(计算时再反量化),以降低生成过程中的显存占用。
- W4A16 量化,将 FP16 的模型权重量化为 INT4,Kernel 计算时,访存量直接降为 FP16 模型的 1/4,大幅降低了访存成本。Weight Only 是指仅量化权重,数值计算依然采用 FP16(需要将 INT4 权重反量化)。
3.1 KV Cache
KV Cache是一种缓存技术,通过存储键值对的形式来复用计算结果,以达到提高性能和降低内存消耗的目的。在大规模训练和推理中,KV Cache可以显著减少重复计算量,从而提升模型的推理速度。LMDeploy的KV Cache管理器可以通过设置--cache-max-entry-count
参数,控制KV缓存占用剩余显存的最大比例。默认的比例为0.8。
lmdeploy chat /root/internlm2-chat-1_8b
改变--cache-max-entry-count
参数,设为0.5
lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.5
再设置为0.01,约等于禁止KV Cache占用显存:
lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.01
可以看到随着KV Cache的降低,显存占用也在逐渐降低
3.2 W4A16量化
LMDeploy使用AWQ算法,实现模型4bit权重量化。推理引擎TurboMind提供了非常高效的4bit推理cuda kernel,性能是FP16的2.4倍以上。
执行以下命令:
lmdeploy lite auto_awq \
/root/models/Shanghai_AI_Laboratory/internlm2-chat-1_8b \
--calib-dataset 'ptb' \
--calib-samples 128 \
--calib-seqlen 1024 \
--w-bits 4 \
--w-group-size 128 \
--work-dir /root/models/internlm2-chat-1_8b-4bit
量化工作结束后,新的HF模型被保存到