CANN hy3-preview模型优化报告
hy3-preview 模型优化报告【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer生成时间2026-04-28 优化执行者model-infer-optimize 端到端优化流程1. 模型信息项目内容模型名称Hy3-previewTencent Hy Team模型架构MoE TransformerDense Sparse MoE with Shared Expert, GQA模型路径models/hy3_preview权重路径/data/models/hy3_preview硬件平台Atlas A3 (Ascend 910C), 16 die (8 卡 × 2 die/卡)单 die HBM64 GB, 总 1024 GB量化模式BF16 (16×64GB1024GB, 295B BF16 参数 590 GB 可行)执行模式ge_graph (图模式)参考模型qwen3-moe (GQAMoEShared Expert, 仓库内最接近的参考实现)1.1 模型结构概要Embedding (120832 × 4096, 495M params) └─ Transformer Block × 80 (layers 0-79) ├─ Pre-Attention RMSNorm (npu_add_rms_norm fused) ├─ Attention (GQA: 64Q heads, 8KV heads, head_dim128) │ ├─ QKV Projection: QKVParallelLinear (TP4) │ ├─ QK Norm: npu_rms_norm(128) per-head ★ 特殊模块 │ ├─ RoPE: npu_apply_rotary_pos_emb(layoutBSH) │ ├─ KV Cache: BSH [B,S,N_kv*D], scatter_update_(axis-2) │ ├─ Attention Core: FA v1 (eager) / torchair FA (ge_graph) │ └─ O Projection: RowParallelLinear (TP4) ├─ Post-Attention RMSNorm (npu_add_rms_norm fused) ├─ FFN / MoE │ ├─ Layer 0: Dense FFN (gate/up: 4096→13312, down: 13312→4096, SiLU) │ └─ Layers 1-79: MoE │ ├─ Router: npu_moe_gating_top_k(norm_type1) ★ sigmoid 非 softmax │ ├─ EP dispatch/combine: MC2 (ge_graph) / all_to_all manual (eager) │ ├─ Expert FFN × 12 per-rank (GMM: npu_grouped_matmul split_item2) │ └─ Shared Expert × 1 (gate/up: 4096→1536, down: 1536→4096) └─ Residual Connection (fused via npu_add_rms_norm) └─ Final RMSNorm (npu_rms_norm) └─ LM Head: ColumnParallelLinear(4096, 120832, no bias)1.2 关键参数参数值参数值总参数量295B (295,033,543,488)激活参数量~21B总层数80 (excl. MTP layer 80)Hidden Size4096Attention Heads64 (Q), 8 (KV)Head Dim128Dense FFN Intermediate13312 (layer 0)MoE Expert Intermediate1536专家总数192每 token 激活专家8 (top-8)Shared Expert1 per MoE layer词表大小120,832最大上下文262,144 (256K)RoPE Theta11,158,8401.3 特殊设计特点特性说明适配影响QK NormQ 和 K 在 RoPE 前各经 RMSNorm(128)已通过 npu_rms_norm 优化Sigmoid Router使用 sigmoid 而非 softmax已通过 npu_moe_gating_top_k(norm_type1) 融合Expert Biaslearnablee_score_correction_bias参与 routing scoringRouter Scalingtop-k weights × 2.826已通过 routed_scaling_factor 参数处理MTP Layerlayer 80 (~3.8B params)推理跳过_keys_to_ignore_on_load_unexpectedLarge Vocab120K tokensembed/lmhead 各 ~1 GB BF16embed_tp42. 性能基线指标值测试条件Prefill 耗时2,070 ms1024 tokens, 16 die A3, eager mode, batch4Decode 单步耗时293 ms/teager mode, 16 die A3显存占用~54.5 GB/dieBF16, 295B 参数 EPTP 分布后执行模式eager阶段 1 初始部署基线采集于阶段 1 并行化部署完成后 (2026-04-27)。后续所有性能对比以此为准。3. 阶段 1并行化改造3.1 并行策略参数值理由world_size16 die8 卡 × 2 die/卡attn_tp_size4N_kv8 约束, 均衡 Prefill/Decodedense_tp_size4与 attn_tp 对齐避免模块边界通信moe_tp_size1Expert intermediate1536 太小TP 导致碎矩阵moe_ep_size16全卡 EP192/1612 experts/rankembed_tp_size4大词表 120K 切分lmhead_tp_size4大词表切分3.2 关键实现通信组: attn/dense/embed/lmhead TP4 groups ×4, moe_ep16 groupEP 路由: 手动 all_to_all (eager) / MC2 dispatch/combine (ge_graph)权重加载: enable_online_split_weightTrue, 112 shards ~12spadding_idx: 全局 120002 → 每 rank 局部索引3.3 验收结果指标结果编译通过✓多卡推理无 crash✓吐字正常初始乱码 → QKV 权重加载修复后正常4. 阶段 2KVCache 静态化 FA 算子替换4.1 选型结果决策项选择理由KVCache 模式模式一连续缓存 (BSH)静态 batch, 无动态分配需求FA 算子FA v1 (npu_fused_infer_attention_score)GQA 无 MLA/量化需求KV Cache 写入scatter_update_(axis-2)BSH layout 标准写法LayoutBSH [B, S, N_kv*D]QK Norm per-head 兼容Prefill masksparse_mode3 ~tril boolDecoder-only causalDecode masksparse_mode0 None无需因果遮蔽4.2 验收结果指标结果KVCache 静态化✓ BSH 连续缓存, scatter_update_FA 算子替换✓ FA v1, Prefill/Decode 分支正确精度 (vs HF)✓ 输出正常文本5. 阶段 3融合算子优化5.1 实施项目P0 (零风险, 已实施)模块原实现替换为调用频率状态RMSNorm (all)Pythonpow(2).mean().rsqrt()npu_rms_norm321次/forward通过Residual RMSNormx yRMSNorm(y)分离npu_add_rms_norm160次/forward通过FFN SiLUF.silu(gate) * upnpu_swiglu80次/forward通过P1 (需精度验证, 已实施)模块原实现替换为调用频率状态MoE RouterPython sigmoidtopkgathernormscale (7 ops)npu_moe_gating_top_k(norm_type1)79次/forward通过P1 精度说明: Hy3-preview 的e_score_correction_bias在 sigmoid 后加仅影响 topk 选择而npu_moe_gating_top_k的 bias 在 sigmoid 内。该语义差异未造成可见输出质量退化。P2 (进阶, 待性能门槛验证)模块候选算子未实施原因Dense FFN 全融合npu_ffn(activationswiglu)需绕过并行 Linear, 性能门槛待 profilingExpert FFN 全融合npu_ffn(expert_tokens...)forward_ordered 适配, 性能门槛待 profiling不适配算子不适配原因npu_kv_rmsnorm_rope_cacheMLA 专用, Hy3-preview 为 GQA per-head QK Normnpu_mla_prolog_v3MLA absorb 模式专用npu_moe_distribute_combine_add_rms_norm需配合 dispatch_v2 使用, 且手动 EP 链路不匹配5.2 验收结果 (eager mode, P0P1)指标改造前改造后改善Prefill (1024t)2,070 ms1,041 ms50%Decode avg293 ms/t246 ms/t16%6. 阶段 4图模式适配6.1 实施方案项目方案说明图模式后端ge_graphtorchair CompilerConfigDecode 路由MC2 dispatch/combine GMM替代手动 all_to_all, 消除数据依赖 graph break专家计算npu_grouped_matmul(split_item2)替代 per-expert F.linear loopFA 接口torchair FA (ge_graph) / torch.ops.npu FA (eager Prefill)Prefill 禁止图模式SuperKernelenable_superkernelTrueDecode 层循环外包 superkernel_scopeCompile Cacheenable_cache_compileTrue持久化到 compile_cache/, 二次 warmup ~9s (10x)多流enable_multi_streamsTrue (已关闭)shared expert 太小无法 overlap, 代码保留6.2 关键修复GMM 权重 OOM 修复: 废弃_prepare_gmm_weights()的.transpose().contiguous()权重副本 (35.8 GB), 改为 inline.transpose(1,2)view, 不分配新内存QKV 权重加载修复: Checkpoint 分离的q/k/v_proj映射到merged_qkv_proj.weight, 修复静默跳过导致的随机初始化输出乱码6.3 验收结果指标eager (P0P1)ge_graph (最终)改善Prefill (1024t)1,041 ms1,408 ms*—Decode avg246 ms/t30.8 ms/t8.0xDecode warmup (首次)—91,151 ms—Decode warmup (cached)—8,016 ms10x*Prefill 在 ge_graph 模式下走 eager 路径 (图模式仅用于 Decode)性能波动在正常范围。7. 累计优化效果指标原始基线 (eager)最终 (ge_graph)累计改善Prefill 耗时 (1024t)2,070 ms1,452 ms1.4xDecode 单步耗时293 ms/t28.44 ms/t10.3xvs 目标 (100ms/t)—28.44 ms/t3.5x margin7.1 各阶段贡献阶段Decode 性能阶段增量累计改善阶段 1: 并行化 (eager 基线)293 ms/t—1.0x阶段 3: P0P1 融合算子246 ms/t1.19x1.19x阶段 4: ge_graph GMM33.3 ms/t7.4x8.8x阶段 4: compile cache31.5 ms/t1.06x9.3x阶段 4: SuperKernel30.8 ms/t1.02x9.5x最终重编译 (2026-04-28)28.44 ms/t1.08x10.3x8. 功能问题记录序号阶段问题描述影响范围处理方式状态F-11QKV 权重静默跳过 → 输出乱码全模型精度添加 q/k/v_proj → merged_qkv_proj 映射已修复F-21dist.broadcast(src0)导致 ranks 4-15 崩溃Decode 完全阻塞移除 broadcast, 依赖本地 argmax 一致性已修复F-34GMM_prepare_gmm_weights权重副本 OOMge_graph 编译改为 inline transpose view已修复F-44手动 EP all_to_all 数据依赖导致 fullgraph graph breakge_graph 编译实现 MC2 dispatch/combine 替代已修复F-54SuperKernel superkernel_scope 图捕获失败SuperKernel 启用移至 torch.compile 外部已修复F-64Multi-stream shared expert 性能退化 (32.0→30.8ms/t)Decode 性能enable_multi_streamsFalse, 代码保留已关闭9. 性能问题记录序号瓶颈描述优化措施优化前优化后增益P-1Python RMSNorm 小算子 (321次/forward)npu_rms_norm——含在 P0 整体P-2ResidualNorm 分离操作 (160次/forward)npu_add_rms_norm——含在 P0 整体P-3FFN SiLUMul 分离 (80次/forward)npu_swiglu——含在 P0 整体P-4MoE Router Python 多步 (7 ops × 79层)npu_moe_gating_top_k246 ms/t—含在 P0P1 整体P-5Per-expert F.linear loop all_to_all graph breakMC2 dispatch/combine GMM246 ms/t33.3 ms/t7.4xP-6ge_graph warmup 每次 91scompile cache 持久化91,151 ms8,016 ms11.4xwarmupP-7Decode 层循环 Python overheadSuperKernel31.5 ms/t30.8 ms/t2%10. 遗留问题与后续建议10.1 P2 融合算子最终评估 (2026-04-28)候选结论阻塞原因npu_ffn(expert_tokens...)不可行API 硬约束swiglu 模式不接受 expert_tokensnpu_ffn(activationswiglu)Dense不可行API 硬约束swiglu 仅支持 float16 (Hy3-preview 用 bf16)npu_moe_distribute_combine_add_rms_norm不可行数学不等价API 计算norm(ABres)vs Hy3-preview deferred residualnorm(A)rescombine_v2 shared_expert_x已回退SuperKernel 编译失败融合链过长超过 2-stream 限制 (CANN 8.5.0)。代码已还原待 CANN 更新后可重新启用10.2 已验证最终性能 (2026-04-28 实际推理)指标数值备注Prefill (1024t)1,452 msge_graph compile cacheDecode avg28.44 ms/trange: 27.4-29.4, 32 tokensvs 原始 eager (293ms/t)10.3x 加速vs 目标 (100ms/t)3.5x margin输出质量正常The output is a weighted sum of the values...10.2 性能分析当前 Decode 30.8ms/t 已远超 100ms/t 目标 (3.2x margin)。Prefill 1408ms (1024t) 仍有优化空间但 Prefill 非主要瓶颈 (单次推理仅执行 1 次 Prefill N 次 Decode)。10.3 已知限制Multi-stream: shared expert 计算量太小 (1536 intermediate), 无法有效 overlap。若未来模型升级增大 intermediate 可重新评估长序列 (128K): KV Cache 增长到 ~10.7 GB/卡 (attn_tp4), 余量减少。若扩展到 256K 需评估 KVP 叠加W8A8 量化: 若未来减至 8 卡部署, 需 W8A8 量化 (~295 GB int8)11. Skill 反馈序号类型涉及环节描述S-1流程缺失阶段推进当前 skill 的阶段推进依赖手动调用 archive_progress.py, 缺乏自动化。建议在 skill 中明确归档触发条件和脚本路径S-2描述不清阶段 2 与阶段 1KVCacheFA 在框架适配 (migrator) 阶段就可能实施, 与阶段 2 职责重叠。建议明确: migrator 只做最小可运行适配, KVCache/FA 留给阶段 2S-3描述不清阶段 3 审查implementer 自验证检查中参考 skill字段指向 /model-infer-fusion, 但 implementer 被要求使用该 skill, 形成循环引用S-4参考过时阶段 3 融合算子npu_moe_distribute_combine_add_rms_norm文档标注仅 Atlas A3 支持, 但本模型已在 A3 上运行此约束可移除, 可重新评估该算子S-5约束缺失阶段 3 融合算子npu_moe_distribute_combine_v2的shared_expert_x参数在 CANN 8.5.0 下与 SuperKernel 不兼容融合链涉及 2 streamsAPI 文档未记录此限制。实测验证发现 SuperKernel compile failed: super kernel do not support more than 2 real stream【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考