配置量化

量化算法

MLC-LLM 中使用的默认量化算法是分组量化方法,该方法在论文 The case for 4-bit precision: k-bit Inference Scaling LawsLUT-GEMM: Quantized Matrix Multiplication based on LUTs for Efficient Inference in Large-Scale Generative Language Models 中讨论过。

量化模式

在 MLC-LLM 中,使用简短的代码来表示要使用的量化模式。MLC-LLM 支持仅权重量化和权重-激活量化。

对于仅权重量化,代码的格式为 qAfB(_id),其中 A 表示存储权重的位数,B 表示存储激活的位数。_id 是整数标识符,用于区分不同的量化算法(例如对称量化、非对称量化、AWQ 等)。

目前可用的选项有:q0f16q0f32q3f16_1q4f16_1q4f32_1q4f16_awq (不稳定)。

对于权重-激活量化,目前 MLC-LLM 支持在 CUDA 上进行 FP8 量化。可用的选项有:e4m3_e4m3_f16e5m2_e5m2_f16。在这些模式下,权重和激活都被量化为 FP8 格式。每一层的输出以更高的精度(FP16)计算,然后重新量化为 FP8。

校准

对于 e4m3_e4m3_f16 量化,需要校准激活的量化参数。校准过程通过运行以下命令完成:

1. 编译校准模型

使用相同的编译工作流程来编译校准模式下的模型。唯一的区别是需要将量化模式指定为 e4m3_e4m3_f16_calibrate

mlc_llm gen_config \
    <model-path> \
    --quantization e4m3_e4m3_f16_max_calibrate \
    --output <output-path>

mlc_llm convert_weights \
    <model-path> \
    --quantization e4m3_e4m3_f16_max_calibrate \
    --output <output-path>

mlc_llm compile \
    <config-path> \
    --output <output-path>

2. 运行校准模型

将在 ShareGPT 等数据集上运行校准模型,以收集激活的统计数据。校准模型将就地更新权重文件中的量化参数。关闭了 cuda graph,因为在校准过程中尚未支持该功能。

mlc_llm calibrate \
    <model-path> \
    --model-lib <model-lib-path> \
    --dataset <dataset-path> \
    --num-calibration-samples <num-samples> \
    --opt "cudagraph=0"
    --output <output-path>

3. 编译量化模型以进行推理。

在校准过程之后,可以编译模型以进行推理。在此步骤中,只需要使用所需的量化格式生成配置文件并编译模型。权重已经在之前的步骤中量化和校准,无需再次转换。

mlc_llm gen_config \
    <model-path> \
    --quantization e4m3_e4m3_f16 \
    --output <output-path>
mlc_llm compile \
    <config-path> \
    --output <output-path>