推理量化精度调优流程
本章节主要介绍大模型量化精度调优的整体思路和标准流程,包含各种量化场景(如W8A8、W8A16和稀疏量化)下的通用策略及特定场景的调优方法,具体请参见量化场景。
量化场景

不同的调优参数在各类模型上的表现可能存在差异,但总体的调优方向保持一致。因此,在实际操作中,建议充分考虑模型特性与任务需求,灵活调整量化参数,并通过多次实验对比不同配置的表现,确定最适合的优化方案。
- 权重量化场景
- W8A16场景下,msModelSlim支持多种权重量化方式,可以通过QuantConfig中的w_method进行配置,可选值为“MinMax”、“HQQ”、“GPTQ”。大部分模型采用基础的MinMax算法即可实现0.5%以下的精度损失。
- 若需要更少的精度损失,可以按照量化耗时从少到多(MinMax → HQQ → GPTQ)的顺序逐步尝试,找到更适合的权重量化方式。API接口的使用情况请参见Python-API接口说明,具体代码示例如下。
quant_config = QuantConfig( a_bit=16, w_bit=8, disable_names=disable_names, dev_type='npu', dev_id=device_id, act_method=3, w_method='MinMax', pr=1.0, w_sym=True, mm_tensor=False )
- 稀疏量化场景
稀疏量化场景利用了300I DUO硬件解压缩功能,通过稀疏化并压缩权重,可以得到更轻量的模型和更高的推理性能。
- 大模型稀疏量化场景需要指定w_bit=4,a_bit=8,推荐将QuantConfig中的is_lowbit设置为True,开启稀疏量化下的low bit算法,设置do_smooth=True,开启lowbit模式下的离群值抑制方法,平滑激活值。
- 可以通过微调fraction或use_sigma参数,限制离群值的保护范围,API接口的使用情况请参见Python-API接口说明,具体代码示例如下。
- 在msModelSlim工具中通过QuantConfig来配置fraction参数,建议在0.01~0.1之间调整,如需减少精度损失可适度调大。
- 在QuantConfig中设置use_sigma为True,调整sigma_factor,可根据正态分布数值特点进行离群值保护,建议在3.0~4.0之间调整,如需减少精度损失可适度调小。
quant_config = QuantConfig( a_bit=8, w_bit=4, # 大模型稀疏量化场景需要指定w_bit=4,a_bit=8 disable_names=disable_names,# 回退层配置 dev_type='npu', # 运行量化的设备 dev_id=device_id, # 运行量化的设备ID,使用npu时需要指定 is_lowbit=args.is_lowbit, # 是否启用lowbit模式 fraction=args.fraction, # 控制稀疏率 do_smooth=args.do_smooth, # True则可以启用lowbit模式的离群值抑制 use_sigma=args.use_sigma # True则可以启用lowbit模式中基于高斯分布的离群值保护 )
- 其他量化场景
除上述两类场景的额外特殊处理外,所有量化场景均可按图1进行精度调优。
通用量化精度调优流程
- 调整离群值抑制算法。
量化工具通过使用AntiOutlierConfig生成离群值抑制配置,启用离群值抑制功能。该功能通过不同的算法对量化过程中的离群值进行抑制,进而提升量化模型的精度。
在AntiOutlierConfig配置中,可调整的参数为anti_method,具体请参见表1,具体代码示例如下。
anti_config = AntiOutlierConfig(anti_method="m2", dev_type="npu", dev_id=device_id) anti_outlier = AntiOutlier(model, calib_data=dataset_calib , cfg=anti_config) anti_outlier.process()
表1 anti_method配置说明 参数
算法名称
m1
SmoothQuant算法。
m2
Outlier Suppression Plus算法。
m3
AWQ算法。
m4
Iterativate Smooth算法。
说明:对down层、o层离群值处理。
m5
CBQ算法。
m6
FlexSmoothQuant算法。
说明:支持自动搜索算法中的alpha/beta超参。
- 对于仅权重量化的场景(如W8A16),anti_method需配置为m3。
- 对于激活量化的场景,需根据实际场景从m1~m6中逐步尝试,以找到最适合的算法。
- 切换激活量化算法。msModelSlim量化工具通过QuantConfig提供量化配置功能,其中激活量化算法中可优化的参数对应字段为act_method。具体请参见表2。
表2 act_method配置说明 act_method取值
说明
1
表示使用min-max量化方式。
说明:act_method默认值为1。
2
表示使用histogram量化方式。
3
表示采用min-max和histogram自动混合量化方式。
说明:开启lowbit稀疏量化功能时,不支持选择值3。
quant_config = QuantConfig( a_bit=8, w_bit=8, disable_names=disable_names, dev_type='npu', dev_id=device_id, act_method=3, pr=1.0, w_sym=True, mm_tensor=False )
- 调整校准集。
在实际应用中,应结合业务场景和大模型特性,合理选择校准数据规模,具体请参见表3。
表3 调整校准集的方法 问题场景
解决办法
算法层面无法进一步提升精度。
可以尝试增大校准数据集的规模(通常建议在10~50条样本之间)。
说明:正常情况下,适当增加数据量可以帮助提升模型精度,但当数据量达到一定规模后,继续增加数据对精度的影响有限。
某些特殊场景下(例如长文本数据场景)。
减少校准数据集规模。
对任务类型需调整校准数据集。
- 中文模型使用中文输入。
- 英文模型使用英文输入。
- 代码生成模型使用代码相关数据。
- 中英文兼顾的模型则采用中英文混合数据作为校准集。
- 数学场景下需要数学相关的校准集。
涉及多个数据集。
可以从各数据集中抽取部分数据,混合组成一个新的校准数据集,平衡不同数据分布的影响,从而提升整体精度。
部分数据校准后导致模型精度较低。
尝试替换这些数据,选取更能代表模型分布的数据,减少量化精度损失。
- 增加量化回退。
某些网络层对于量化比较敏感,量化后会带来较大的精度损失,这些层并不适合进行量化,应该使用浮点权重进行计算,这个过程被称之为回退,量化工具支持自动回退和手动回退两种回退方式。
- 手动回退:量化工具通过QuantConfig提供了量化配置的选择功能,可通过设定disable_names手动控制哪些层被回退。
quant_config = QuantConfig( a_bit=8, w_bit=8, disable_names=disable_names, # disable_names=[]:[]里添加回退层名称,如果不添加则为不回退 dev_type='npu', dev_id=device_id, act_method=3, pr=1.0, w_sym=True, mm_tensor=False )
disable_names参数可按以下顺序逐步增加回退层:
- 回退down_proj层(精度敏感)
- 回退o_proj层(通常精度敏感)
- 根据理论经验和日志找出量化敏感层进行回退。
disable_names = [] for ids in range(config.num_hidden_layers): disable_names.append("model.layers." + str(ids) + ".mlp.down_proj") # 以回退down_proj层为例
- 自动回退:量化工具通过Calibrator类提供了自动回退选择功能,用户可通过设置参数disable_level来指定自动回退的层数。
calibrator = Calibrator( model, quant_config, calib_data=dataset_calib, disable_level='L0' # disable_level='LN',N为自动回退的linear层数量,会在终端显示回退的层名称,disable_level='L0'即为不进行回退,若 N 的值超过模型总层数,则触发全部回退,且不会报错。W8A16量化场景不推荐使用自动回退功能 )
- 手动回退:量化工具通过QuantConfig提供了量化配置的选择功能,可通过设定disable_names手动控制哪些层被回退。