昇腾社区首页
中文
注册

推理量化精度调优流程

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

量化场景

不同的调优参数在各类模型上的表现可能存在差异,但总体的调优方向保持一致。因此,在实际操作中,建议充分考虑模型特性与任务需求,灵活调整量化参数,并通过多次实验对比不同配置的表现,最终确定最适合的优化方案。

  • 权重量化场景
    1. W8A16场景下,msModelSlim支持多种权重量化方式,可以通过QuantConfig中的w_method进行配置,可选值为'MinMax'、'HQQ'、'GPTQ'。大部分模型采用基础的MinMax算法即可实现0.5%以下的精度损失。
    2. 若需要更少的精度损失,可以按照量化耗时从少到多(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硬件解压缩功能,通过稀疏化并压缩权重,可以得到更轻量的模型和更高的推理性能。

    1. 当w_bit=4,a_bit=8且为大模型稀疏量化场景时,推荐将QuantConfig中的is_lowbit设置为True,开启稀疏量化下的low bit算法,设置do_smooth=True,开启lowbit模式下的离群值抑制方法,平滑激活值。
    2. 可以通过微调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进行精度调优。
    图1 通用量化精度调优流程

通用量化精度调优流程

  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

    Iter Smooth Quant算法。

    说明:

    对down层、o层离群值处理。

    m5

    CBQ算法。

    m6

    Flex Smooth算法。

    说明:

    支持自动搜索算法中的alpha/beta超参。

    • 对于权重量化的场景(如W8A16),anti_method需配置为m3。
    • 对于激活量化的场景,需根据实际场景从m1~m6中逐步尝试,以找到最适合的算法。
  2. 切换激活量化算法。
    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

    表3 调整校准集的方法

    问题场景

    解决办法

    算法层面无法进一步提升精度。

    可以尝试增大校准数据集的规模(通常建议在10~50条样本之间)。

    说明:

    正常情况下,适当增加数据量可以帮助提升模型精度,但当数据量达到一定规模后,继续增加数据对精度的影响有限。

    某些特殊场景下,例如长文本数据场景。

    减少校准数据集规模。

    对任务类型需调整校准数据集。

    • 中文模型使用中文输入。
    • 英文模型使用英文输入。
    • 代码生成模型使用代码相关数据。
    • 中英文兼顾的模型则采用中英文混合数据作为校准集。
    • 数学场景下需要数学相关的校准集。

    涉及多个数据集。

    可以从各数据集中抽取部分数据,混合组成一个新的校准数据集,平衡不同数据分布的影响,从而提升整体精度。

    部分数据校准后导致模型精度较低。

    尝试替换这些数据,选取更能代表模型分布的数据,减少量化精度损失。

  4. 增加量化回退。

    某些网络层对于量化比较敏感,量化后会带来较大的精度损失,这些层并不适合进行量化,应该使用浮点权重进行计算,这个过程被称之为回退,量化工具支持自动回退和手动回退两种回退方式。

    • 手动回退:量化工具通过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参数可按以下顺序逐步增加回退层:

      1. 回退down_proj层(精度敏感)。
      2. 回退o_proj层(通常精度敏感)。
      3. 根据理论经验和日志找出量化敏感层进行回退。
      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量化场景不推荐使用自动回退功能
      )