已合并
fix: INT8_MINMAX_WEIGHT_QUANT_CFG 增加 skip_layers lm_head 适配大词表模型 #215
fix: INT8_MINMAX_WEIGHT_QUANT_CFG 增加 skip_layers lm_head 适配大词表模型 #215
已合并
fujun19创建于 7月13日
fujun19成员
7月13日

问题描述

Issue: https://gitcode.com/cann/amct/issues/157

minmax 量化示例文档建议使用 Qwen2-7B / Qwen3-8B 模型,但 NPU 算子 aclnnWeightQuantBatchMatmulV2 的 k/n 参数有 65535 上限限制。Qwen2 系列模型词表大小约 152K(远超 65535),导致量化后 PPL 评估阶段在 lm_head 层调用该算子时必然失败。

内置量化配置 INT8_MINMAX_WEIGHT_QUANT_CFG 缺少 skip_layers: lm_head,而文档未提及此限制,用户按文档指引运行 Qwen2 示例无法成功。

修复内容

1. config.py: 为 INT8_MINMAX_WEIGHT_QUANT_CFG 添加 skip_layers

INT8_MINMAX_WEIGHT_QUANT_CFG 中增加 "skip_layers": {"lm_head"},与所有其他内置量化配置保持一致,确保 lm_head 层默认不被量化。

2. parser.py: 添加 NPU 算子维度限制自动检测

check_quant_op_constraint 函数中增加对 NPU 量化算子 aclnnWeightQuantBatchMatmulV2 维度上限(65535)的通用检查。当 Linear 层的 weight 维度(k 或 n)超过此限制时,自动跳过该层的量化并输出日志提示,作为防御性保护。

3. README.md: 补充 NPU 算子维度限制说明

在 minmax 示例文档中增加关于 NPU 算子维度限制的说明,告知用户大词表模型(如 Qwen2-7B、Qwen3-8B)需要将 lm_head 加入 skip_layers。

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 fujun19 的贡献)
Ffujun19成员
7月13日 关联了issue:[Bug-Report|缺陷反馈]: 文档指引运行minmax Qwen2 量化示例无法成功
atomgit-bot
atomgit-bot
7月13日 评论:

变更摘要

此 PR 主要解决大词表模型(如 Qwen2、Qwen3 系列)在使用 INT8_MINMAX_WEIGHT_QUANT_CFG 量化配置时,因 NPU 算子 aclnnWeightQuantBatchMatmulV2 存在 65535 维度上限而导致 lm_head 层量化失败的问题。通过在默认配置中为 lm_head 添加跳过策略、在解析器中增加自动维度上限检测,以及更新文档说明,确保大词表模型能正常完成量化与评估。

主要改动

  • INT8_MINMAX_WEIGHT_QUANT_CFG 默认跳过 lm_head:在 config.py 中为该内置量化配置新增 "skip_layers": {"lm_head"},使大词表模型的 lm_head 层默认不被量化,与其他内置量化配置行为保持一致。
  • check_quant_op_constraint 增加 NPU 算子维度上限自动检测:在 parser.py 中新增对 aclnnWeightQuantBatchMatmulV2 算子 65535 维度限制的通用检查逻辑,当 Linear 层权重任一维度(k 或 n)超出上限时自动跳过量化并输出日志,作为防御性保护。
  • README 文档补充 NPU 算子限制说明:在 minmax 示例文档中增加对大词表模型需将 lm_head 加入 skip_layers 的说明,告知用户该限制及规避方式。
likedislike
atomgit-bot
atomgit-bot
7月13日 评论:

代码审查

我已经完成了对所有三个变更文件的全面审查。让我总结一下发现。


审查总结

变更文件审查结果:

  1. amct_pytorch/common/config/config.py — 无问题

    • INT8_MINMAX_WEIGHT_QUANT_CFG 添加 'skip_layers': {'lm_head'},与其他所有内置量化配置(INT4_AWQ_WEIGHT_QUANT_CFGINT4_GPTQ_WEIGHT_QUANT_CFGINT8_SMOOTHQUANT_CFG 等)保持一致。变更正确,无副作用。
    • HIFP8_SMOOTHQUANT_CFG 末尾仅新增了换行符,无功能变更。
  2. amct_pytorch/common/config/parser.py — 无问题

    • check_quant_op_constraint 函数中新增的 NPU 算子维度上限检查(65535)逻辑正确:对 nn.Linear 层的 weight.shape[0](n/输出特征维度)和 weight.shape[1](k/输入特征维度)进行 > 65535 边界判断,超出限制时返回 False 跳过量化并记录日志。
    • 边界条件处理正确:使用 >(不含等号),上限 65535 本身可通过;shape 维度始终为非负整数,不存在负数/零值的异常路径。
    • 调用链安全:唯一的生产调用者 _check_layer_constraints 在调用前已通过 mod_type != 'Linear' 的早期返回保护了非 Linear 模块,nn.Linear 始终具有 weight 属性,不会出现 AttributeError
    • 该检查作为防御性保护,位于所有 dtype 特定检查之前,优先级合理。
  3. examples/algorithms/minmax/README.md — 无问题

    • 新增的 NPU 算子维度限制说明文档准确描述了问题根因(Qwen2 系列词表 ~152K > 65535 上限)、影响范围(PPL 评估阶段 lm_head 层)以及应对方案(内置配置默认跳过 + 自动检测)。
    • 文档中不包含任何危险命令、不安全配置或误导性操作指引。

总体风险评估:低风险

此变更是一个针对性的缺陷修复,三处改动均围绕同一问题(大词表模型 lm_head 层超出 NPU 算子维度上限导致量化失败),变更范围紧凑、逻辑清晰,未引入新的正确性、安全性或可靠性问题。

  • P0: 0
  • P1: 0
  • P2: 0
  • P3: 0

⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。

likedislike
CANN-robotCANN-robot成员
7月13日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
7月13日 评论:

CLA Signature Pass

fujun19, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
此处折叠了45条消息 查看更多
yaoguangxiu成员
7月14日 评论:

/lgtm

likedislike
zhuliangying成员
7月14日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
7月14日 添加了label:lgtmapproved
CANN-robotCANN-robot成员
7月14日 关闭了关联的issue
CANN-robotCANN-robot成员
7月14日 合入了pull request