ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AMCT 量化适配 Qwen3.5-3.6 实战:混合 Attention MoE 直转、Qwen3.6 零改动复用与 27B Dense 的 A4W4 MXFP4

AMCT 量化适配 Qwen3.5-3.6 实战:混合 Attention MoE 直转、Qwen3.6 零改动复用与 27B Dense 的 A4W4 MXFP4 AMCT 量化适配 Qwen3.5-3.6 实战混合 Attention MoE 直转、Qwen3.6 零改动复用与 27B Dense 的 A4W4 MXFP4【免费下载链接】amctAMCT是CANN提供的昇腾AI处理器亲和的模型压缩工具仓。项目地址: https://gitcode.com/cann/amct本文基于 AMCT 仓库内部案例库中的 Qwen3.5-35B-A3B / Qwen3.6-35B / Qwen3.6-27B 适配个案系统讲解这类线性 全量混合 Attention Packed MoE模型的量化适配路径如何识别模型触发信号、如何用三步闭环验证 adapter 正确性、如何规避 DeepSeek MLA 接口误用等家族专属陷阱并给出经 PPL 验证的 W8A8-int / A4W4 MXFP4 量化结论与完整精度速查表帮助你在同系列新模型上快速复用已有 adapter。结构特征与触发信号Qwen3.5-35B-A3B 与 Qwen3.6-35B 属于同一结构家族其核心结构特征决定了适配路径的选择混合 AttentionQwen3_5Moe的 40 层 decoder 中layer_types按linear×3 full的模式重复排布即每 3 层linear_attentionGatedDeltaNet类门控线性注意力后接 1 层full_attention。两种 attention 形态不能套用同一条量化路径。Checkpoint experts 已 packed与Qwen3-235B一类需要在 adapter 内把展开的 per-expert 权重重组为 packedgate_up_proj/down_proj不同35B-A3B 的 checkpoint 上 experts 已经是 packed 布局无需重组加载时只需做 key 对齐即可。Qwen3.6 Qwen3.5 纯子类Qwen3_6Moe(Qwen3_5Moe): pass—— 3.6 与 3.5 结构完全相同零 override仅注册名与权重不同。仓库源码 qwen3_6_moe.py 可以印证这一点整个文件除 license 头外只有注册装饰器和一个空子类。Qwen3.6-27B 是 Densemodel_typeqwen3_5、architecturesQwen3_5ForConditionalGeneration64 层 decoder复用qwen3_5adapter与 MoE 分支无关。触发信号拿到新 checkpoint 时先对照config 的layer_types同时含linear_attention与full_attentioncheckpoint experts 已 packed即为 35B MoE 这一支model_typeqwen3_5且为 Dense 架构则是 27B 这一支。这两个信号的判别逻辑与 结构家族陷阱库 L2 中MoE 类和混合 attention 类的触发信号一致跨模型通用经验见 L1 跨模型陷阱。模型 adapter 的复用链与量化路由三条 adapter 及其继承关系Qwen 系列在 amct_pytorch/common/models/llm/qwen/ 下按结构分支组织 adapter本案涉及的复用链为BaseModelblockwise PPL / 校准 / deploy 公共能力 └── Qwen3_5 # qwen3_5.pydense 27B 直接用 └── Qwen3_5Moe # qwen3_5_moe.py35B-A3B └── Qwen3_6Moe: pass # qwen3_6_moe.py35B-A3B(3.6)Qwen3_5adapter 在 qwen3_5.py 中以MODEL_REGISTRY.register(nameqwen3_5, ...)注册__init__中通过self.textconfig(**self.config.text_config.to_dict())把多模态顶层 config 还原为 text config再读取num_hidden_layers确定层数。其build_quant_block()负责按quant_target路由量化def build_quant_block(self, layer_idx): decoder_layer self.block(layer_idx) if attn-linear in self.quant_target or attn-cache in self.quant_target: self.apply_quant_attn(decoder_layer) if mlp in self.quant_target: self.apply_quant_moe_mlp(decoder_layer) return decoder_layer而apply_quant_attn()内部再按decoder_layer.layer_type二次路由qwen3_5.pydef apply_quant_attn(self, decoder_layer): layer_type decoder_layer.layer_type if layer_type linear_attention: attn_cls QuantQwen35LinearAttn quant_attn getattr(decoder_layer, linear_attn, None) quant_attn.config self.config else: attn_cls QuantQwen35Attn return apply_quant_to_attn(self.args, decoder_layer, attn_cls)这就是linear / full 分开处理的落地点linear_attention层走QuantQwen35LinearAttn继承官方Qwen3_5GatedDeltaNet仅将其中的in_proj_qkv、in_proj_z、in_proj_b、in_proj_a、out_proj五个投影 Linear 替换为QuantLinear见 quant_module.pyfull_attention层走QuantQwen35Attn。注意attn-linear只量化投影 Linear线性注意力 kernel 本身在量化未就绪时保持 BF16——这是本案例的既定策略而不是缺陷。MoE 分支的 experts 量化与 deploy 绑定Qwen3_5Moe的build_quant_block()覆写了 MoE 侧路由qwen3_5_moe.pyif moe in self.quant_target: quant_moe find_moe_module(decoder_layer) if quant_moe is not None: experts getattr(quant_moe, experts, None) if experts is not None and is_packed_experts(experts): quant_moe.experts QuantGatedExperts( self.args, experts, groupmoe.routed ) shared_expert getattr(quant_moe, shared_expert, None) if shared_expert is not None and not isinstance( shared_expert, QuantQwen35MLP ): shared_expert_args build_no_algo_args(self.args) quant_moe.shared_expert QuantQwen35MLP( shared_expert_args, shared_expert, groupmoe.shared )三个值得展开的实现细节is_packed_experts前置检查只有确认 checkpoint experts 是 packed 布局时才包裹QuantGatedExperts这与先确认 experts packed/展开的适配建议一一对应QuantGatedExpertsmoe_common.py内部用GatedExpertView(materializeFalse)惰性视图切分 packed 张量并在需要时通过build_ptq_expert_module实体化为真Parameter供 PTQ 训练避免惰性视图在 NPU 迁移后 weight 仍留 CPU 的经典坑。shared_expert 用build_no_algo_argsshared expert 密集激活直接量化即可不需要 PTQ 算法这与 L2 陷阱库 中shared_experts PTQ 策略必须两层一致的设计约束吻合。deploy 时逐 expert 展开绑定由于运行时模块挂在mlp.experts.expert_modules.i.proj而 checkpoint key 是mlp.experts.i.proj.weightiter_deploy_bindings()qwen3_5_moe.py对 expert 模块做了名称重映射其余模块走默认的{weight_prefix}{name}.weight规则。三步闭环adapter 适配的验证方法本案例验证了可复制的三步闭环流程且三个模型35B-A3B ×3.5、35B-A3B ×3.6、27B Dense均走通该流程BF16 baseline用 blockwise PPL 拿基线口径seq_len4096关闭量化等价验证用 bf16.yaml空配置 全 16-bit跑量化 wrapperPPL 应≈BF16证明 rebuilt wrapper 前向语义正确最小 PTQ smokeextract_ptq_data采 16 样本 →ptq --algos autoround→ 确认目标 unit 的参数文件落盘打通校准输入 → 训练 → 参数导出链路。Qwen3.5-35B-A3B三步闭环通过关闭量化验证中attn(层 3/19/39) 数值接近 BF16、moe(层 0/20/39) 对齐layer0/shared_expert最小 PTQ smoke 打通。Qwen3.6-35B复测通过使用真实权重/mnt/data/models/Qwen/Qwen3.6-35B-A3B系统 python复测BF16 baseline6.2731与精度表 6.2799 同量级口径/版本微差关闭量化等价attn-linearmoebf16.yaml空配置 全 16-bit6.2751≈ BF16 → rebuilt wrapper 前向语义正确最小 PTQ smokeextract_ptq_data16 样本 →ptq --algos autoround→ 落盘layer_0_linear_attn.ptattn-linear的linear_attn投影单元✓。运行注记环境问题非模型缺陷linear_attention在缺少flash-linear-attention包时走 torch fallback功能正常autoround 触发No module named triton缺包非致命PTQ 参数已落盘。复现该流程前建议先补齐这两个可选依赖避免被误导为模型问题。Qwen3.6-27B DensePTQ calibrationPileValnsamples16seq_len1024PPL evaluationWikiText2 testseq_len4096attn-linear与mlp的 Direct、LWC、LAC、LWCLAC、OmniQuant、AutoRound、FlatQuant 均完成 Deploy 与 clean reload无缺失键、非预期键、形状不匹配或加载错误clean reload 识别attn-linear304 个量化模块第 0 层 5 个、mlp192 个量化模块第 0 层 3 个Vision 分支和lm_head未被错误量化。第 0 层 5 个attn-linear模块恰好对应QuantQwen35LinearAttn中的in_proj_qkv/in_proj_z/in_proj_b/in_proj_a/out_proj五个投影与源码结构互相印证Vision 分支未被量化则验证了Qwen3_5adapter 将 weight prefix 固定在model.language_model.layers.i.qwen3_5.py的正确性。关键陷阱L3 模型/家族专属误用 DeepSeek 的 MLA 接口现象进 quant block 构建即调到不存在的apply_quant_mla()报错根因qwen3_5moe继承Qwen3_5应复用 Qwen 公共接口而非 DeepSeek MLA 专用入口apply_quant_mla是 MLA 类模型的专属路由见 L2 · MLA 类处理统一收回apply_quant_attn()/apply_quant_moe_mlp()两条公共入口教训Qwen 分支先看 dense adapter 公共接口勿直接用 DeepSeek MLA 入口。跨模型层面的通用教训见 L1 跨模型陷阱。混合 attention 的 causal mask 路由linear与full必须分开处理linear_attentionkernel 量化未就绪时先留 BF16但其投影 Linear 仍可量化3.6 smoke 已验证该单元可 PTQ。另一类相关坑是若 layer0 恰好是linear_attentionembedding 阶段捕获到的 mask可能为None不能直接复用给后续full_attention层否则 BF16 PPL 会低得离谱相当于看到后文处理方式是 adapter 内显式维护 full-attn causal mask详见 L2 · 混合 attention 类 与qwen3-next个案。量化策略结论35B MoE 首推attn-linear moeW8A8-int8 直转3.5/3.6 均 delta 小达标linear_attentionkernel 量化未就绪时先留 BF16仅量化其投影 Linear27B Denseattn-linear与mlp走 A4W4 MXFP4各算法的完整结果见下文精度表FlatQuant 在两处均为最优算法不建议Qwen 分支误用 DeepSeek MLA 入口linear/fullattention 一把梭套同一路径。精度速查表ppl 口径seq_len4096。MXFP 双值为两次评测口径 a/b。Qwen3.5-35B-A3BBF16 6.2486数据类型量化配置量化算法pplBF16无无6.2486INTA4w4: moe, attn-linear无3839.2734INTA8w4: moe, attn-linear无7.1928INTA8w8: moe, attn-linear无6.3781MXFPA4w4: moe, attn-linear无6.9814/6.826MXFPA8w4: moe, attn-linear无6.508/6.436MXFPA8w8: moe, attn-linear无6.3168/6.285Qwen3.6-35BBF16 6.2799 / 复测 6.2731数据类型量化配置量化算法pplBF16无无6.2799INTA4w4: moe, attn-linear无3962.8643INTA8w4: moe, attn-linear无7.3586INTA8w8: moe, attn-linear无6.3788MXFPA4w4: moe, attn-linear无7.024/6.931MXFPA8w4: moe, attn-linear无6.599/6.536MXFPA8w8: moe, attn-linear无6.3168/6.308Qwen3.6-27BBF16 7.8214数据类型量化配置量化算法pplBF16无无7.8214MXFPA4w4: attn-linear无8.0828MXFPA4w4: attn-linearlwc8.0008MXFPA4w4: attn-linearlac7.6261MXFPA4w4: attn-linearlwc lac7.5939MXFPA4w4: attn-linearomniquant7.8375MXFPA4w4: attn-linearautoround8.1834MXFPA4w4: attn-linearflatquant7.2257MXFPA4w4: mlp无7.9196MXFPA4w4: mlplwc8.0670MXFPA4w4: mlplac7.8648MXFPA4w4: mlplwc lac8.0103MXFPA4w4: mlpomniquant7.8741MXFPA4w4: mlpautoround7.9661MXFPA4w4: mlpflatquant7.7327表中规律与量化结论一致A4W4-int 直转完全不可用ppl 数千而 W8A8-int 直转 delta ≤ 0.1是最省事的起点MXFP4 下 27B 的算法空间里attn-linear最优是 LWCLAC7.5939、mlp最优是 FlatQuant7.7327均优于无算法直转。同系列新模型的复用清单下次遇到 Qwen3.5/3.6 同结构layer_types混合 packed experts模型时先参考本案例 qwen3-next同为混合 attention MoE见 qwen3_next.py Qwen 系列总览起步文件直接从 qwen3_5_moe.py 起步复制 adapterQwen3.6 的空子类证明了结构相同只换注册名的成本下限先做什么先确认 checkpoint experts 是 packed 还是展开决定是否需要 repackBF16 PPL 离谱先查混合 attention mask 路由不建议Qwen 分支误用 DeepSeek MLA 入口linear/fullattention 一把梭默认复用抽象BaseModel、PtqUnit、QuantLinear、apply_quant_attn、apply_quant_moe_mlp把模型特有逻辑留在amct_pytorch/common/models/llm/qwen/...内不要先改 workflow、solver 和 quant module。延伸阅读个案原文qwen3.5-3.6.md位于仓库内部案例库含完整验证记录Qwen 家族其它个案Qwen3-dense、Qwen3-moe、Qwen3-Next-80B-A3B-InstructQwen3.6 模型示例文档Qwen3.6-Moe.md、Qwen3.6-Moe-Pruning.md量化模块实现quant_module.pyQuantQwen35MLP/QuantQwen35Attn/QuantQwen35LinearAttnPPL 评测与 PTQ 流程入口cli/llm/ptq.py、cli/llm/extract_ptq_data.py【免费下载链接】amctAMCT是CANN提供的昇腾AI处理器亲和的模型压缩工具仓。项目地址: https://gitcode.com/cann/amct创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表