MLC LLM量化推理#

MLC LLM 是一个专为大语言模型设计的机器学习编译器和高性能部署引擎。其使命是让每个人都能够在自己的平台上本地开发、优化和部署 AI 模型。

MLC LLM 支持直接加载由 AutoAWQ 导出的真实量化模型。由于 LLMCAutoAWQ 已无缝集成,AutoAWQ 作为 LLMCMLC LLM 之间的桥梁,极大简化了量化模型的加载与部署流程。

1.1 环境准备#

要使用 MLC LLM 进行量化推理,首先需要安装并配置 MLC LLM 环境,以CUDA 12.2为例:

python -m pip install --pre -U -f https://mlc.ai/wheels mlc-llm-nightly-cu122 mlc-ai-nightly-cu122

1.2 量化格式#

AutoAWQ 相同。

1.3 使用LLMC量化模型#

1.3.1 校准数据#

在本章节中,我们使用PilevalWikitext两个学术数据集作为校准数据,有关于校准数据的下载和预处理请参考章节

在实际使用中,建议应使用真实部署场景的数据进行离线量化校准。

1.3.2 量化算法的选择#

W4A16

在 W4A16 的量化设置下,我们建议使用 LLMC 中的 AWQ 算法。

具体实现可以参考 AWQ W4A16 的权重量化 配置文件

# configs/quantization/backend/mlcllm/awq_w4a16.yml
quant:
    method: Awq
    weight:
        bit: 4
        symmetric: True
        granularity: per_group
        group_size: 128
        pack_version: gemm_pack
    special:
        trans: True
        trans_version: v2
        weight_clip: True
    quant_out: True  

请注意,此步骤中需要将 pack_version 参数设置为 gemm_pack,它表示将 int4 数据打包成 torch.int32MLC LLM 支持加载由 AutoAWQGEMM 内核格式对应的整型权重。

此外,如果 AWQ 无法满足精度需求,还可以尝试其他算法,例如 GPTQ。同时,我们建议使用此章节中介绍的 AWQ+OmniQuant 组合算法,以进一步提升精度。我们也提供了相应的配置文件供参考。

1.3.3 真实量化模型导出#

save:
    save_mlcllm: True
    save_path: /path/to/save_for_mlcllm_awq_w4/

请注意,务必将 save_mlcllm 设置为 True。对于 W4A16 的量化设置,LLMC 会将权重打包为 torch.int32 形式导出,便于 MLC LLM 直接加载,并且会同时导出量化参数。

1.3.4 运行LLMC#

修改运行脚本中的配置文件路径并运行:

# scripts/run_llmc.sh
llmc=llmc_path
export PYTHONPATH=$llmc:$PYTHONPATH

task_name=awq_for_mlcllm
config=${llmc}/configs/quantization/backend/mlcllm/awq_w4a16.yml

等LLMC运行结束后,真实量化的模型就会存储在save.save_path路径

1.4 使用MLC LLM推理模型#

1.4.1 生成 MLC 配置#

第一步是生成 MLC LLM 的配置文件。

export LOCAL_MODEL_PATH=/path/to/llama2-7b-chat/   # 本地模型存放路径
export MLC_MODEL_PATH=./dist/llama2-7b-chat-MLC/  # 处理后模型的 MLC 存放路径
export QUANTIZATION=q4f16_autoawq            # 量化选项, LLMC目前只支持q4f16_autoawq格式的量化
export CONV_TEMPLATE=llama-2            # 对话模板选项


mlc_llm gen_config $LOCAL_MODEL_PATH \
    --quantization $QUANTIZATION \
    --conv-template $CONV_TEMPLATE \
    -o $MLC_MODEL_PATH

配置生成命令接收本地模型路径、MLC LLM 输出的目标路径、MLC LLM 中的对话模板名称以及量化格式。这里的量化选项 q4f16_autoawq 表示使用 AutoAWQ 中的 w4a16 量化格式,而对话模板 llama-2MLC LLMLlama-2 模型的模板。

1.4.2 编译模型库#

以下是在 MLC LLM 中编译模型库的示例命令:

export MODEL_LIB=$MLC_MODEL_PATH/lib.so
mlc_llm compile $MLC_MODEL_PATH -o $MODEL_LIB

1.4.3 转换模型权重#

在这一步,我们将模型权重转换为 MLC LLM 格式。

export LLMC_MODEL_PATH=/path/to/save_for_mlcllm_awq_w4/ #LLMC导出的真实量化模型
mlc_llm convert_weight $LOCAL_MODEL_PATH \
  --quantization $QUANTIZATION \
  -o $MLC_MODEL_PATH \
  --source-format awq \
  --source $LLMC_MODEL_PATH/mlcllm_quant_model/model.safetensors

在上述模型转换过程中,将 $LLMC_MODEL_PATH 替换为 save.save_path--source-format 表示 LLMC 传递给 MLC LLM 的是 AutoAWQ 格式的权重,而 --source 指的是 LLMC 导出的真实量化张量,即存储在 save.save_path 的权重张量。转换完成后的结果将存放在 MLC LLM 使用 -o 指定的输出路径,之后即可直接用于 MLC LLM 的推理。

1.4.4 运行MLC LLM引擎#

我们提供了一个运行 MLC LLM 引擎进行推理的示例

示例中的 model_path 替换为MLC LLM 的输出路径,然后运行以下命令即可完成推理:

cd examples/backend/mlcllm

python infer_with_mlcllm.py