AWQ/GPTQ#

LMDeploy TurboMind 引擎支持推理由 AWQGPTQ 量化的 4bit 量化模型,但其量化模块仅支持 AWQ 量化算法。

以下NVIDIA GPU可用于AWQ/GPTQ INT4推理:

  • V100(sm70): V100

  • 图灵(sm75):20系列,T4

  • 安培(sm80,sm86): 30系列, A10, A16, A30, A100

  • 艾达·洛夫莱斯(sm89): 40系列

在进行量化和推理之前,请确保按照安装指南安装了lmdeploy。

本文的其余部分分为以下几个部分:

量化#

只需执行一个命令即可量化模型。量化后的权重随后存储在$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 'ptb' \
  --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参数,包括模型名称,如上例所示。这有助于LMDeploy在模糊匹配–work-dir与适当的内置聊天模板时。否则,您将不得不在推理期间指定聊天模板。

  • 如果量化模型的准确性受到影响,建议启用–search-scale进行重新量化,并增加–batch-size,例如增加到8。当启用search_scale时,量化过程将需要更多时间。–batch-size影响使用的内存量,可以根据实际需要调整。

完成量化后,您可以使用各种方便的工具高效地与模型互动。 例如,您可以通过命令行启动与它的对话:

lmdeploy chat ./internlm2_5-7b-chat-4bit --model-format awq

或者,您可以通过网页启动gradio服务器并与模型进行交互,网址为http://{ip_addr}:{port

lmdeploy serve gradio ./internlm2_5-7b-chat-4bit --server_name {ip_addr} --server_port {port} --model-format awq

评估#

请参考OpenCompass关于使用LMDeploy进行模型评估的内容。这里是指南

推理#

尝试以下代码,您可以使用量化模型执行批量离线推理:

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)

有关管道参数的更多信息,请参考这里

除了在本地主机上使用量化模型进行推理外,LMDeploy还可以执行从Huggingface Hub上可用的AWQ算法派生的4bit量化模型的推理,例如来自lmdeploy空间TheBloke空间的模型

# inference with models from lmdeploy space
from lmdeploy import pipeline, TurbomindEngineConfig
pipe = pipeline("lmdeploy/llama2-chat-70b-4bit",
                backend_config=TurbomindEngineConfig(model_format='awq', tp=4))
response = pipe(["Hi, pls intro yourself", "Shanghai is"])
print(response)

# inference with models from thebloke space
from lmdeploy import pipeline, TurbomindEngineConfig, ChatTemplateConfig
pipe = pipeline("TheBloke/LLaMA2-13B-Tiefighter-AWQ",
                backend_config=TurbomindEngineConfig(model_format='awq'),
                chat_template_config=ChatTemplateConfig(model_name='llama2')
                )
response = pipe(["Hi, pls intro yourself", "Shanghai is"])
print(response)

服务#

LMDeploy的api_server使得模型可以通过一个命令轻松打包成服务。提供的RESTful API与OpenAI的接口兼容。以下是服务启动的示例:

lmdeploy serve api_server ./internlm2_5-7b-chat-4bit --backend turbomind --model-format awq

api_server 的默认端口是 23333。服务器启动后,您可以通过 api_client 在终端与服务器进行通信:

lmdeploy serve api_client http://0.0.0.0:23333

您可以通过Swagger UI在线概览和试用api_server API,网址为http://0.0.0.0:23333,或者您也可以从这里阅读API规范。

性能#

我们在NVIDIA GeForce RTX 4090上使用profile_generation.py对Llama-2-7B-chat和Llama-2-13B-chat模型进行了4位量化的基准测试。我们通过设置单个提示令牌并生成512个令牌来测量令牌生成吞吐量(tokens/s)。所有结果均为单批次推理的测量结果。

模型

llm-awq

mlc-llm

turbomind

Llama-2-7B-chat

112.9

159.4

206.4

Llama-2-13B-chat

不适用

90.7

115.8

常见问题解答#

  1. 在量化过程中由于GPU内存不足导致的Out of Memory错误:可以通过减少参数--calib-seqlen,增加参数--calib-samples,并将--batch-size设置为1来解决。