配置量化
量化算法
MLC-LLM 中使用的默认量化算法是分组量化方法,该方法在论文 The case for 4-bit precision: k-bit Inference Scaling Laws 和 LUT-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 等)。
目前可用的选项有:q0f16
、q0f32
、q3f16_1
、q4f16_1
、q4f32_1
和 q4f16_awq
(不稳定)。
对于权重-激活量化,目前 MLC-LLM 支持在 CUDA 上进行 FP8 量化。可用的选项有:e4m3_e4m3_f16
和 e5m2_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>