
AMCT 大模型压缩实战LongCat-Flash-Lite / LongCat-Next 系列适配与量化完整指南【免费下载链接】amctAMCT是CANN提供的昇腾AI处理器亲和的模型压缩工具仓。项目地址: https://gitcode.com/cann/amct本篇基于 CANN AMCT昇腾 AI 处理器亲和的模型压缩工具仓的模型适配案例库完整讲解 LongCat 系列LongCat-Flash-Lite、LongCat-Next在 AMCT 中的适配与量化实践。LongCat 是一类结构高度自定义的 MoE 大模型输入路径为ngram_embeddings每个 decoder block 内含双 self-attn 分支、双 dense MLP 分支以及一条 packed MoE shortcut且顶层 modeling 不在 transformers 包内需要trust_remote_code。读完本文你将掌握该类自定义结构模型在 AMCT 中的 adapter 复用思路、三步闭环验证方法、直转量化含 a8w8-int8 / a4w4 / MXFP的精度结论以及ActivationQuantizer、text-only backbone 切换等关键陷阱的排查路径。LongCat 系列是什么结构概览LongCat 系列当前在案例库中已覆盖两个模型LongCat-Flash-Lite与LongCat-Next。其典型结构特点可以概括为三点详见 LongCat 系列总览输入路径特殊不使用普通 token embedding而是依赖ngram_embeddings输入路径decoder block 拓扑特殊每个 block 双self_attn分支 双 densemlp分支 一条 packed MoE shortcut 路径顶层 modeling 自定义architectures不在 transformers 包内需trust_remote_code加载自定义 modeling 代码。由于结构和输入路径都与常规 LLM 差异显著该系列在 AMCT 中不能直接套用默认的attn mlp单分支 block 工作流必须在 adapter 层做模型专属映射而 workflow 与 solver 保持不动。从适配难度上LongCat 属于两个结构家族叠加的典型案例可参考 结构家族陷阱 L2MoE 类存在 routed experts、gate/routercheckpoint 以mlp.experts.i.*逐 expert 展开接非 transformers 自定义 modeling 类architectures类不在当前 transformers 版本内需要trust_remote_code并自行完成 PreTrainedModel 化接入。同时所有跨网络通用的适配/量化陷阱跨网络通用陷阱 L1也全部适用例如 checkpoint 才是唯一事实源、BF16 blockwise baseline 优先、PPL 异常先查 mask/pos 传递链等。仓库中的适配实现从 BaseModel 到 LongcatLiteLongCat 系列的全部适配逻辑收敛在amct_pytorch/common/models/llm/longcat/目录下遵循 AMCT 的模型专属逻辑收口原则除非模型结构无法在amct_pytorch/common/models/llm中表达否则不修改 workflow 或 solver参见 BaseModel 基类。复用组件与新增组件该系列最大化复用了 AMCT 的通用组件只新增了 LongCat 专属的少量模块类别组件说明复用BaseModel公共 blockwise 工作流基类承载 embedding 捕获、逐层 forward、PTQ 参数加载等骨架逻辑复用PtqUnitPTQ 单元抽象attn→self_attn_0/1、mlp→mlp_0/1、moe→expert_i的拆分路由复用QuantLinear线性层量化模块quant_linear.py复用QuantGatedMLP门控 MLP 量化封装quant_apply.py新增QuantLongcatMLALongCat 专属 MLA 注意力量化封装新增LongcatPackedExperts/LongcatPackedExpertViewpacked expert 的量化与视图封装新增LongCat 专属 embedding 加载与 expert 重组逻辑ngram_embeddings加载、逐 expert checkpoint 重组为 packed 张量LongcatLite首个 ngram 输入 adapterLongcatLite注册于MODEL_REGISTRY是 LongCat 系列的第一个 adapterlongcat_lite.py适配时参考了 Qwen 的 dense/MoE wrapper 与公共BaseModelblockwise 工作流。关键实现点包括安全 attention backend 固定在构造时通过_set_safe_attn_impl()将config._attn_implementation固定为eagerlongcat_lite.py。这是因为 LongCat 的qk/v head dim不对称固定到更稳的eagerbackend 可以避免兼容性问题。双分支量化替换build_quant_block()按quant_target分别处理——attn-linear/attn-cache时把decoder_layer.self_attn替换为QuantLongcatMLA列表mlp时替换mlps为QuantLongcatMLP列表moe时通过find_moe_module定位 MoE 模块并把experts替换为QuantLongcatExpertslongcat_lite.py。ngram embedding 加载get_embed_load_specs()在基类embed_tokens/norm/lm_head的基础上扩展了model.ngram_embeddings.embedders.与model.ngram_embeddings.post_projs.两组加载规格longcat_lite.py。expert 权重重组checkpoint 中专家权重是逐 expert 展开的mlp.experts.i.{gate,up,down}_proj而运行时期望 packed 张量。_pack_expert_weights()按n_routed_experts zero_expert_num的总数把gate_proj/up_proj沿 dim 0 拼接为gate_up_proj把down_proj单独打包为down_projlongcat_lite.py。PTQ 单元拆分与 hook 路由iter_ptq_units()对attn输出self_attn_0/1两个单元input_nameattn_0/attn_1、对mlp输出mlp_0/1两个单元、对moe按expert_i输出逐专家单元register_block_forward_hooks()中通过name_map把input_layernorm.0/1映射到attn_0/attn_1、把post_attention_layernorm.0/1映射到moe或mlp_0/1longcat_lite.py。PTQ 输入按 unit 缓存load_unit_inputs()支持按block_{layer_idx}_{input_name}_in.pkl的命名约定读取每个 PTQ 单元的校准输入与_save_ptq_inputs()的保存逻辑对称。LongcatNext仅 override 一个方法的复用范本LongcatNext(LongcatLite)是整个系列中复用度最高的范本拓扑与 Lite 完全相同唯一 delta 是empty_weights_model其余 forward/PTQ/deploy 方法逐方法复用 Lite全部通过显式super()透传longcat_next.py。empty_weights_model()的实现要点longcat_next.py通过get_class_from_dynamic_module从模型目录动态加载modeling_longcat_ngram.LongcatFlashNgramForCausalLM—— 这是text-only backbone避开顶层多模态入口在init_empty_weights()上下文内空载构造模型并转bfloat16lm_head形状对齐text_vocab_plus_multimodal_special_token_size含多模态特殊 token 的完整词表否则会与 checkpoint 中lm_head.weight形状不一致。这种做法的直接收益是blockwise PTQ 只需要 text-only backbone完全不需要加载顶层多模态模型及其flash_attn运行时依赖。量化模块QuantLongcatMLA / QuantLongcatMLP / packed expertLongCat 专属量化模块位于 longcat_lite/quant_module.py 与 moe_common.pyQuantLongcatMLP(QuantGatedMLP)直接复用QuantGatedMLP的实现只做类名区分用于双 dense MLP 分支的量化。QuantLongcatMLA(LongcatFlashMLA)LongCat 专属 MLA 注意力封装。从源码结构看它按 bit policy 把q_proj或 MLA 分解的q_a_proj/q_b_proj、kv_a_proj_with_mqa、kv_b_proj、o_proj分别替换为QuantLinear或保持PlainLinear并新增qk_matmul/pv_matmul两个QuantizedMatmul支持 cache 量化路径attn-cache同时支持通过build_algorithms_by_target(..., structure)构建 structure transformquant_module.py。LongcatPackedExpertView/LongcatUnpackedExperts提供 packed 张量的惰性视图gate_up_proj切分为 gate/up 两个视图以及按nn.Identity补齐 zero expert 的 unpacked 模块列表前向按 top-k 路由逐 expert 计算并index_add_回填quant_module.py。QuantLongcatExpertspacked-expert 的 PTQ 友好封装运行路径保持轻量视图materializeFalsePTQ 路径通过build_ptq_expert_module(materializeTrue)把专家权重实体化为注册参数随module.to(device)一起迁移moe_common.py。这一点与 L2 中packed-expert PTQ 的 device 迁移陷阱的处理思路一致——实体化是避免 PTQ 训练时 weight 停留在 CPU 的关键。三步闭环验证源码公式重放 逐层 stepwise 校验由于输入路径与拓扑特殊LongCat 系列在适配后必须做严格的逐层对齐验证而不能只依赖端到端 PPL。验证结论来自 LongCat 个案LongCat-Flash-Lite三步闭环通过ngram_embeddings源码公式重放与逐层 blockwise 输出对齐 through 整个 decoder stack含norm lm_headlogits。这意味着从自定义输入路径到最后一层 headAMCT blockwise 路径与官方 modeling 的逐层输出完全一致量化替换不会引入结构性偏差。LongCat-Next LongcatLite唯一 delta empty_weights_model三步闭环通过关闭量化后 attn/mlp/moe 代表层max_abs0完全对齐layer0/mlp_0最小 PTQ smokeflatquant 1-epoch回载max_abs0打通。验证口径与纪律继承 L1 通用经验先做 BF16 blockwise baseline确认 chunk0 loss 回到合理量级再看全量 PPLPPL 离谱高/低/quant 反优第一件事查 blockwise mask/pos/position_embeddings 传递链跨网络通用陷阱。LongCat 系列在 blockwise 路径中同样依赖 embedding 阶段捕获的position_ids/position_embeddings/attention_mask显式传入每层do_block_forward。关键陷阱与排查路径int activation quant 的 is_act / signed clampLite 首遇现象首个 MLP block 的weight_quant()收到 activation tensor触发 shape 断言。根因ActivationQuantizer实例化时漏传is_actTrue导致激活被当成 weight 处理同时dynamic_per_token_quant()误用了只适用于非负数的 clamp把带符号的激活值当纯正数处理。处理activation quant 必须传is_actTrue并去掉 signed activation quant 的正数 clamp。这也是 L1 中登记的通用陷阱之一见 L1 · 量化通用首次在 LongCat-Flash-Lite 上遇到并固化进经验库。排查口诀int 直转量化一开始就报错、或激活行为明显异常时优先检查ActivationQuantizer是否传了is_actTrue以及 activation quant 是否错误地把带符号值当成纯正数处理。trust_remote_code 顶层走多模态切 text-only backboneNext 首遇现象from_config(..., trust_remote_codeTrue)被flash_attn阻塞顶层模型无法直接空载。根因LongCat-Next 的architectures顶层入口是带flash_attn依赖的多模态模型而 blockwise PTQ 只需要 text-only backbone。处理在 adapter 内通过get_class_from_dynamic_module直接实例化动态模块里的文本模型类modeling_longcat_ngram.LongcatFlashNgramForCausalLM并修正lm_head使其对齐text_vocab_plus_multimodal_special_token_size其余 forward/PTQ/deploy 与 Lite 完全一致见上文LongcatNext.empty_weights_model。该处理同时也是 L2 · 接非 transformers 自定义 modeling 家族条目的登记案例。排查口诀LongCat-Next 顶层模型不能直接空载时检查是否误走了带flash_attn依赖的顶层多模态模型而没有切到 text-only 的modeling_longcat_ngram路径。关联通用陷阱L1/L2 体系LongCat 作为 MoE 自定义 modeling 的双家族成员还受以下通用条目约束expert 磁盘展开 vs 运行时 packedcheckpoint 逐 expertmlp.experts.i.{gate,up,down}_proj运行时期望 packedgate_up_proj/down_proj须在 adapter 内重组L2 · MoE 类MoE activation capture 误命中 gatecapture 时不能用宽泛的hook_namemlp同时匹配mlp.gategate 返回 tuple 会触发AttributeError要用真实 hidden states 过 gate、选实际命中的 expert 单元packed-expert PTQ 的 device 迁移只做materializeFalse的惰性视图会导致 PTQ 权重滞留 CPU必须复用带build_ptq_expert_module(materializeTrue)实体化路径的 experts 类QuantLongcatExperts已按此实现评测/加载纪律eval 与 deploy 加载 PTQ 参数时必须带与 PTQ 训练一致的--algos否则load_module会因缺少weight_quantizer.algorithms.algo子模块报KeyErrorPTQ 前先确认所选算法在 LLM new-path 的ALGO_REGISTRY中当前为autoround / lac / lwc / let不要只认 classic 图量化路径的名册。量化结论与精度速查表核心结论LongCat-Flash-Litemlpmoe的a8w8-int8 直转即可达标——ppl_bf1614.6243、ppl_quant14.8006、delta0.1763≤ 0.2 为默认接受阈值无需 PTQ。这是该系列首推的最简方案。LongCat-Next目前只完成了 model-adapter 闭环量化方案还没有正式归档在判断精度之前先确认 Ascend 运行时环境和 activation quant dtype 接线没有问题。精度速查表PPL 口径为Wikitextseq_len4096。口径敏感2048→4096后 PPL 反而变差对比/复现必须固定seq_len4096与相同的 transformers 版本。MXFP 双值为两次评测口径 a/b。数据来自 LongCat 个案精度表。LongCat-Flash-LiteBF16 基线 14.6133数据类型量化配置量化算法pplBF16无无14.6133INTA4w4: mlp, moe, attn-linear无1053.832INTA8w4: mlp, moe, attn-linear无13.1681INTA8w8: mlp, moe, attn-linear无14.0334MXFPA4w4: mlp, moe, attn-linear无13.2715/12.283MXFPA8w4: mlp, moe, attn-linear无10.4672/10.061MXFPA8w8: mlp, moe, attn-linear无14.8785/15.091LongCat-NextBF16 基线 17.518数据类型量化配置量化算法pplBF16无无17.518INTA4w4: mlp, moe, attn-linear无3302.094INTA8w4: mlp, moe, attn-linear无24.8581INTA8w8: mlp, moe, attn-linear无15.718MXFPA4w4: mlp, moe, attn-linear无19.0125/18.266MXFPA8w4: mlp, moe, attn-linear无17.5067/16.899MXFPA8w8: mlp, moe, attn-linear无18.3902/19.2从表中可以观察到的规律基于案例库记录的数值两个模型在INT A4w4上 PPL 都严重劣化1053.832 / 3302.094说明 4-bit weight 对该系列结构极不友好INT A8w8与A8w4均可维持接近或优于 BF16 的 PPLMXFP 的 A8w4 在 Lite 上取得最低 PPL10.4672/10.061。这些数据对后续同系列模型的量化档位选择有直接参考价值。性能注意prefill 阶段MoE per-expert 动态量化通常为负收益平均路由M_eff≈seq*topk/experts偏小单 expertdynamic_quant 头开销 BF16 matmul每层 ×experts 放大MLP 是唯一明显正收益、attention 几乎无损益MoE 是否进量化首先要看精度 delta 下游 infer 路径覆盖最终性能必须用 infer 侧 packedMoEGMM实测确认decode M1 的 weight-bound 场景可能翻正。下次同系列/同结构的适配建议案例库沉淀了明确的适配方法论LongCat 个案 · 适配建议先参考LongCat 本案 LongCat 系列总览通用部分叠加阅读 L1 与 L2先做什么先验证自定义输入路径ngram_embeddings源码公式重放→ 逐层 block 等价stepwise 对齐→ 再直转LongCat-Next这类同拓扑模型先看能否复用 Lite block 拓扑兼容逻辑收在 adapter 内不建议在最简方案已近无损如 Lite 的mlpmoea8w8-int8 直转delta0.1763之前急上 PTQ也不要直接空载顶层多模态模型flash_attn依赖会阻塞。同时遵循案例库通用纪律上游 modeling 文件原样保留、模型专属逻辑收在amct_pytorch/common/models/llm/vendor/...、量化方案先直转再 PTQ、delta 0.2为默认接受阈值、评测口径统一 Wikitext PPLseq_len4096跨网络通用陷阱。常见问题速查问题优先排查项int 直转量化一开始就报错或激活行为明显异常ActivationQuantizer是否传了is_actTrueactivation quant 是否错误地把带符号值当成纯正数处理LongCat-Next 顶层模型不能直接空载是否误走了带flash_attn依赖的顶层多模态模型而没有切到 text-only 的modeling_longcat_ngram路径checkpoint 与默认 config 构造的lm_head形状不一致在 adapter 内做最小 patchlm_head对齐text_vocab_plus_multimodal_special_token_size不要把兼容逻辑扩散到 workflowqk/v head dim不对称导致的 attention 兼容问题优先固定到更稳的eagerattention backend_set_safe_attn_impl延伸阅读LongCat 系列总览默认参考路径与通用经验LongCat 个案适配验证结论与精度速查表跨网络通用陷阱 L1结构家族陷阱 L2MoE 类 / 自定义 modeling 类LongcatLite adapter 源码LongcatNext adapter 源码LongCat 量化模块源码MLA / packed expertQuantLongcatExperts 源码BaseModel / PtqUnit 基类【免费下载链接】amctAMCT是CANN提供的昇腾AI处理器亲和的模型压缩工具仓。项目地址: https://gitcode.com/cann/amct创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考