LMDeploy终极量化指南:如何集成自定义算法优化大模型部署
LMDeploy终极量化指南:如何集成自定义算法优化大模型部署
LMDeploy是一款强大的大模型压缩、部署和服务工具包,能够帮助开发者高效地处理大模型部署过程中的量化问题。本文将为你详细介绍LMDeploy的量化功能,包括如何使用内置的量化算法以及如何集成自定义算法来优化大模型部署。
一、LMDeploy量化基础
LMDeploy TurboMind引擎支持多种量化方法,目前主要支持由AWQ和GPTQ两种量化方法量化的4bit模型的推理。然而,LMDeploy量化模块目前仅支持AWQ量化算法。可用于AWQ/GPTQ INT4推理的NVIDIA GPU包括V100、Turing系列、Ampere系列和Ada Lovelace系列等。
在进行量化和推理之前,请确保按照安装指南安装了lmdeploy。
二、快速上手:使用LMDeploy内置量化算法
2.1 一键量化模型
仅需执行一条命令,就可以完成模型量化工作。量化结束后,权重文件存放在$WORK_DIR下。
export HF_MODEL=internlm/internlm2_5-7b-chat
export WORK_DIR=internlm/internlm2_5-7b-chat-4bit
lmdeploy lite auto_awq \
$HF_MODEL \
--calib-dataset 'wikitext2' \
--calib-samples 128 \
--calib-seqlen 2048 \
--w-bits 4 \
--w-group-size 128 \
--batch-size 1 \
--work-dir $WORK_DIR
绝大多数情况下,可选参数可不用填写,使用默认值即可。比如量化internlm/internlm2_5-7b-chat模型,命令可以简化为:
lmdeploy lite auto_awq internlm/internlm2_5-7b-chat --work-dir internlm2_5-7b-chat-4bit
注意:
- 建议
--work-dir参数带有模型名字,这样在推理时不用指定对话模板,推理接口会以模糊搜索方式选出和--work-dir近似的对话模板。- 如果量化模型精度有损,建议开启
--search-scale重新量化,并调大--batch-size,比如8。search_scale开启后量化过程会比较耗时,--batch-size会影响内存占用量,可以根据实际情况酌情调整。
2.2 验证量化效果
量化后的模型,可以用一些工具快速验证对话效果。比如,直接在控制台和模型对话:
lmdeploy chat ./internlm2_5-7b-chat-4bit --model-format awq
2.3 模型推理
量化后的模型,通过以下几行简单的代码,可以实现离线推理:
from lmdeploy import pipeline, TurbomindEngineConfig
engine_config = TurbomindEngineConfig(model_format='awq')
pipe = pipeline("./internlm2_5-7b-chat-4bit", backend_config=engine_config)
response = pipe(["Hi, pls intro yourself", "Shanghai is"])
print(response)
关于pipeline的详细介绍,请参考这里。
除了推理本地量化模型外,LMDeploy还支持直接推理huggingface hub上的通过AWQ量化的4bit权重模型,比如lmdeploy空间和TheBloke空间下的模型。
2.4 推理服务
LMDeploy api_server支持把模型一键封装为服务,对外提供的RESTful API兼容openai的接口。以下为服务启动的示例:
lmdeploy serve api_server ./internlm2_5-7b-chat-4bit --backend turbomind --model-format awq
服务默认端口是23333。在server启动后,可以在终端通过api_client与server进行对话:
lmdeploy serve api_client http://0.0.0.0:23333
还可以通过Swagger UI http://0.0.0.0:23333在线阅读和试用api_server的各接口,也可直接查阅文档,了解各接口的定义和使用方法。
2.5 推理性能
在NVIDIA GeForce RTX 4090上分别测试了4-bit Llama-2-7B-chat和Llama-2-13B-chat模型的token生成速度。测试配置为batch size = 1,(prompt_tokens, completion_tokens) = (1, 512)。
| model | llm-awq | mlc-llm | turbomind |
|---|---|---|---|
| Llama-2-7B-chat | 112.9 | 159.4 | 206.4 |
| Llama-2-13B-chat | N/A | 90.7 | 115.8 |
LMDeploy批处理内存使用情况示意图,展示了高效的内存管理能力
三、高级技巧:集成自定义量化算法
虽然LMDeploy目前主要支持AWQ算法,但它的架构设计允许集成自定义量化算法。下面介绍如何集成自定义量化算法。
3.1 了解LMDeploy量化架构
LMDeploy的量化模块位于lmdeploy/lite/quantization/目录下。其中,awq.py文件实现了AWQ量化算法,包含了权重量化、平滑层等关键函数。
3.2 自定义量化算法集成步骤
-
创建自定义量化类:在lmdeploy/lite/quantization/modules/目录下创建自定义量化模块的实现文件,例如
my_quant.py。 -
实现量化逻辑:参考
awq.py中的quant_weights函数,实现自定义的权重量化逻辑。主要包括:- 权重的伪量化(pseudo quantization)
- 量化参数(scales和zeros)的计算
- 量化后权重的存储和加载
-
注册量化方法:在lmdeploy/lite/quantization/init.py中注册新的量化方法,以便在命令行中使用。
-
实现平滑层逻辑:如果自定义算法需要对层进行平滑处理,参考
awq.py中的smooth_ln_fcs和smooth_fc_fcs函数,实现相应的平滑逻辑。 -
测试自定义算法:编写测试用例,验证自定义量化算法的正确性和性能。可以参考tests/test_lmdeploy/test_lite/目录下的现有测试。
3.3 自定义量化算法示例
以下是一个简单的自定义量化算法框架示例:
# lmdeploy/lite/quantization/my_quant.py
import torch
def my_quantize_tensor(w, bits=4, group_size=-1):
# 实现自定义的张量量化逻辑
pass
def my_quant_weights(model, fcs, bits, group_size=-1, device='cuda'):
from lmdeploy.lite.quantization import WeightQuantizer
from lmdeploy.lite.quantization.modules import WeightOnlyQLinear
from lmdeploy.lite.utils import QParams
for name, fc in fcs.items():
# 实现自定义的权重量化逻辑
pass
四、常见问题与解决方案
4.1 量化时出现Out of Memory显存不够
可以通过减小传参--calib-seqlen,增大传参--calib-samples,并使用--batch-size为1。
4.2 量化时无法链接huggingface并下载数据集
可以尝试使用镜像,export HF_ENDPOINT=https://hf-mirror.com。
4.3 如何评估量化模型的性能
我们使用OpenCompass评测量化模型在各个维度上的能力。方法请参考此处。
五、总结
LMDeploy提供了强大而灵活的大模型量化功能,既可以通过简单的命令快速实现模型量化,也支持高级用户集成自定义量化算法。通过合理使用LMDeploy的量化工具,可以显著降低大模型的部署成本,提高推理性能。
无论是科研人员还是工程人员,都可以通过LMDeploy轻松实现大模型的高效量化和部署。希望本文能够帮助你更好地理解和使用LMDeploy的量化功能,为你的大模型部署工作带来便利。
如果你有任何问题或建议,欢迎参与LMDeploy项目的开发和讨论,一起推动大模型部署技术的发展。
更多推荐




所有评论(0)