量化适配指南¶
本文档提供与 ModelSlim 相关的量化算法和模型适配指南。
量化功能介绍¶
量化推理流程¶
当前在 vLLM Ascend 中注册和获取量化方法的流程如下:

vLLM Ascend 注册了自定义的 Ascend 量化方法。通过配置 --quantization ascend 参数(或离线场景下 quantization="ascend"),即可启用量化功能。在构建 quant_config 时,会初始化已注册的 AscendModelSlimConfig,并调用 get_quant_method 获取每个权重部分对应的量化方法,存储在 quant_method 属性中。
当前支持的量化方法包括 AscendLinearMethod、AscendFusedMoEMethod、AscendEmbeddingMethod,以及它们对应的非量化方法:

vLLM 定义的量化方法基类以及量化方法的整体调用流程如下:

embedding 方法通常不针对量化进行实现,仅关注其他三个方法。
create_weights 方法用于权重初始化;process_weights_after_loading 方法用于权重后处理,例如转置、格式转换、数据类型转换等;apply 方法用于在前向过程中执行激活量化和量化矩阵乘法计算。
我们需要针对不同层(attention、mlp、MoE(Mixture of Experts))实现 create_weights、process_weights_after_loading 和 apply 方法。
补充:加载模型时,需要读取量化模型的描述文件 quant_model_description.json。该文件描述了模型权重各部分的量化配置和参数,例如:
{
"model.layers.0.linear_attn.dt_bias": "FLOAT",
"model.layers.0.linear_attn.A_log": "FLOAT",
"model.layers.0.linear_attn.conv1d.weight": "FLOAT",
"model.layers.0.linear_attn.in_proj_qkvz.weight": "W8A8_DYNAMIC",
"model.layers.0.linear_attn.in_proj_qkvz.weight_scale": "W8A8_DYNAMIC",
"model.layers.0.linear_attn.in_proj_qkvz.weight_offset": "W8A8_DYNAMIC",
"model.layers.0.linear_attn.in_proj_ba.weight": "FLOAT",
"model.layers.0.linear_attn.norm.weight": "FLOAT",
"model.layers.0.linear_attn.out_proj.weight": "FLOAT",
"model.layers.0.mlp.gate.weight": "FLOAT",
"model.layers.0.mlp.experts.0.gate_proj.weight": "W8A8_DYNAMIC",
"model.layers.0.mlp.experts.0.gate_proj.weight_scale": "W8A8_DYNAMIC",
"model.layers.0.mlp.experts.0.gate_proj.weight_offset": "W8A8_DYNAMIC"
}
基于以上内容,我们简要介绍量化算法和量化模型的适配流程。
量化算法适配¶
- 步骤 1:算法设计。定义算法 ID(例如
W4A8_DYNAMIC),确定支持的层(linear、moe、attention),并设计量化方案(静态/动态,按张量/按通道/按组)。 - 步骤 2:注册。使用
vllm_ascend/quantization/methods/registry.py中的@register_scheme装饰器注册你的量化方案类。
from vllm_ascend.quantization.methods import register_scheme, AscendMoEScheme
@register_scheme("W4A8_DYNAMIC", "moe")
class AscendW4A8DynamicFusedMoEMethod(AscendMoEScheme):
...
- 步骤 3:实现。创建算法实现文件,例如
vllm_ascend/quantization/methods/w4a8/w4a8.py,并实现方法类和逻辑。 - 步骤 4:测试。使用你的算法生成量化配置,并在目标模型和硬件上验证正确性和性能。
量化模型适配¶
适配新的量化模型需要确保以下三点:
- 原始模型已在
vLLM Ascend中成功适配。 - 融合模块映射:如果上游 vLLM 模型的
packed_modules_mapping未覆盖所需的融合模块,请将模型的model_type添加到vllm_ascend/quantization/configs/modelslim_config.py中的UPDATED_PACKED_MODULES_MAPPING。专家分片映射会从量化描述中自动发现。 - 量化模型使用的所有限量化算法均已集成到
quantization模块中。
当前支持的量化算法¶
vLLM Ascend 支持多种量化算法。下表基于 vllm_ascend.quantization 模块中的实现,概述了每种量化算法:
| 算法 | 权重 | 激活 | 权重粒度 | 激活粒度 | 类型 | 描述 |
|---|---|---|---|---|---|---|
W4A16 |
INT4 | FP16/BF16 | 按组 | 按张量 | 静态 | 4 位权重量化,16 位激活精度,专为 MoE 模型专家层设计,支持 int32 格式权重打包 |
W8A16 |
INT8 | FP16/BF16 | 按通道 | 按张量 | 静态 | 8 位权重量化,16 位激活精度,兼顾精度与性能,适用于线性层 |
| 算法 | 权重 | 激活 | 权重粒度 | 激活粒度 | 类型 | 描述 |
|---|---|---|---|---|---|---|
W8A8 |
INT8 | INT8 | 逐通道 | 逐张量 | 静态 | 静态激活量化,适用于需要高精度的场景 |
W8A8_DYNAMIC |
INT8 | INT8 | 逐通道 | 逐 Token | 动态 | 动态激活量化,按 Token 计算缩放因子 |
W4A8_DYNAMIC |
INT4 | INT8 | 逐通道 | 逐 Token | 动态 | 4 位逐通道权重量化,8 位动态逐 Token 激活,支持 MoE 层的 msModelSlim 和 LLM-Compressor 权重格式 |
W4A4_FLATQUANT_DYNAMIC |
INT4 | INT4 | 逐通道 | 逐 Token | 动态 | 在 4 位动态量化前使用 FlatQuant 对激活分布进行平滑,并通过额外的矩阵乘法保持精度 |
W8A8_MIX |
INT8 | INT8 | 逐通道 | 逐张量/逐 Token | 混合 | 我们支持两种部署模式:PD 同置(P 和 D 均使用动态量化)和 PD 分离(P 使用动态量化,D 使用静态量化) |
静态与动态: 静态量化使用预计算的缩放因子,性能更好;动态量化会为每个 Token/激活张量实时计算缩放因子,精度更高。
粒度: 指缩放因子计算的范围(例如:逐张量、逐通道、逐组)。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 vl/vllm-ascend