当前位置: 首页 > news >正文

华为昇腾笔记之Mindspeed-LLM 中 MoE 实现机制与重写逻辑总览

🧩 Mindspeed-LLM 的 MoE 实现机制与重写逻辑总览

Mindspeed-LLM 基于 Megatron-Core 的 MoE 框架,在运行前通过一系列 Monkey Patch / Wrapper 注册 将 Megatron 的核心 MoE 模块(Experts 层、Router 路由层、通信调度层) 替换为华为自研的 高效异步 + 通信重叠 + TP/EP 扩展版本


I. Experts 层(GroupedMLP / SequentialMLP / TEGroupedMLP)

展示 Experts 模块(GroupedMLP / SequentialMLP / TEGroupedMLP)在 Mindspeed 中的替换逻辑与最终调用流向

                 ┌──────────────────────────────────────────────┐
                │         Megatron 原始 Experts 模块           │
                │ (megatron.core.transformer.moe.experts)     │
                └──────────────────┬────────────────────────────┘
                                  │
                                  ▼
                ┌──────────────────────────────────────────────┐
                │         Mindspeed Patch 注册逻辑             │
                │   (在 patch_core_transformers 中注册)     │
                └──────────────────┬────────────────────────────┘
                                  │
      ┌────────────────────────────────────────────────────────────────┐
      │                   被替换函数映射一览                           │
      └────────────────────────────────────────────────────────────────┘
            │
            ├──► GroupedMLP.__init__   ───────────────► groupedmlp_init_wrapper
            │
            ├──► GroupedMLP.forward   ───────────────► groupedmlp_forward
            │                               │
            │                               ├─(当 overlap on)──► group_mlp_forward
            │                               └─(当 overlap off)─► groupedmlp_forward
            │
            ├──► SequentialMLP.forward ─────► sequential_mlp_forward
            │           (仅当 dispatcher == alltoall)
            │
            └──► grouped_gemm_util.* ──────► Ops / grouped_gemm_is_available / assert_grouped_gemm_is_available (自定义替换)
           
            (注:TEGroupedMLP 保持原状,不参与替换)

      ┌────────────────────────────────────────────────────────────────┐
      │                 GroupedMLP 前向主流程图                       │
      └────────────────────────────────────────────────────────────────┘
                      │
                      ▼
      ┌────────────────────────────────────────────┐
      │ (1) permuted_local_hidden_states 输入     │
      │ (2) 权重 reshape:                         │
      │     w1: [num_local_experts, hidden, *]   │
      │     w2: [num_local_experts, *, hidden]   │
      ├────────────────────────────────────────────┤
      │ (3) 根据 overlap / moe_bmm_mc2 / recompute │
      │     三种情况选择路径:                   │
      │                                           │
      │   ├ overlap on → group_mlp_forward         │
      │   │     → grouped_mlp_with_comp_and_comm_overlap_all2all/allgather │
      │   ├ overlap off → groupedmlp_forward       │
      │   │     → gg.ops.gmm 或 fused_alltoall_gather_bmm               │
      │   └ recompute on → CheckpointWithoutOutput 管理激活重计算         │
      ├────────────────────────────────────────────┤
      │ (4) 输出 fc2_output                       │
      └────────────────────────────────────────────┘

      ┌────────────────────────────────────────────────────────────────┐
      │               SequentialMLP 前向主流程图                     │
      └────────────────────────────────────────────────────────────────┘
                      │
                      ▼
      ┌────────────────────────────────────────────┐
      │ (1) 根据 tokens_per_expert 累积偏移       │
      │ (2) 逐专家执行 forward                     │
      │ (3) 若 TP>1 → COMM_STREAM + all_gather_last_dim │
      │ (4) 输出拼接                             │
      └────────────────────────────────────────────┘

      ┌────────────────────────────────────────────────────────────────┐
      │                   实际运行函数路径一览                       │
      └────────────────────────────────────────────────────────────────┘
            GroupedMLP.__init__ → groupedmlp_init_wrapper
            │
            └─► GroupedMLP.forward
                ├─ overlap on → group_mlp_forward
                │     ├─ grouped_mlp_with_comp_and_comm_overlap_all2all
                │     └─ grouped_mlp_with_comp_and_comm_overlap_allgather
                └─ overlap off → groupedmlp_forward
                        ├─ gg.ops.gmm
                        ├─ fused_alltoall_gather_bmm
                        └─ fused_bmm_reducescatter_alltoall

            SequentialMLP.forward
                ├─ dispatcher==alltoall → sequential_mlp_forward
                │       └─ 内部 all_gather_last_dim
                └─ dispatcher==allgather → 原生 forward

            TEGroupedMLP → 保留原始实现 (无改动)

      ┌────────────────────────────────────────────────────────────────┐
      │                   被淘汰 / 不再调用的原函数                   │
      └────────────────────────────────────────────────────────────────┘
          ✗ GroupedMLP.__init__ (原版)
          ✗ GroupedMLP.forward (原版)
          ✗ SequentialMLP.forward (在 alltoall 模式下)
          ✗ grouped_gemm_util 默认实现 (替换为 Ops 等)
          ✓ TEGroupedMLP (保留原版)

🧠 一句话总结:

在 Mindspeed 中,GroupedMLP 的初始化与前向都被彻底接管; SequentialMLP 只在 dispatcher == alltoall 时改走新路径; 所有 overlap(AllGather / AllToAll)场景下统一进入 group_mlp_forward TEGroupedMLP 没动。

 

🔧 核心修改入口

patch_core_transformers() 中注册:

MegatronAdaptation.register('megatron.core.transformer.moe.experts.GroupedMLP.__init__',
                           groupedmlp_init_wrapper)
MegatronAdaptation.register('megatron.core.transformer.moe.experts.GroupedMLP.forward',
                           groupedmlp_forward group_mlp_forward)
MegatronAdaptation.register('megatron.core.transformer.moe.experts.SequentialMLP.forward',
                           sequential_mlp_forward)

🧠 逻辑核心

模块替换后函数触发条件功能概述
GroupedMLP.*init* groupedmlp_init_wrapper 总是生效 临时改 TP=1 初始化 GMM 权重,注册 gmm_weight 标记,若 GLU 激活→换为 fused_swiglu
GroupedMLP.forward groupedmlp_forward / group_mlp_forward overlap off / on - off:调用 gg.ops.gmmfused_alltoall_gather_bmm - on:走通信重叠核 (grouped_mlp_with_comp_and_comm_overlap_alltoall/allgather)
SequentialMLP.forward sequential_mlp_forward dispatcher==alltoall 多专家串行执行 + TP all-gather 通信流优化
TEGroupedMLP 不变 保持原 TransformerEngine 路径

⚙️ 调用路径(概览)

GroupedMLP.__init__  →  groupedmlp_init_wrapper
GroupedMLP.forward   ├─ overlap on → group_mlp_forward
                    │                 └─ grouped_mlp_with_comp_and_comm_overlap_all2all/allgather
                    └─ overlap off → groupedmlp_forward
                                      ├─ gg.ops.gmm
                                      ├─ fused_alltoall_gather_bmm
                                      └─ fused_bmm_reducescatter_alltoall

SequentialMLP.forward ├─ dispatcher==alltoall → sequential_mlp_forward
                    │                         └─ COMM_STREAM + all_gather_last_dim
                    └─ dispatcher==allgather → 原生 forward

🗺️ Experts 模块字符示意图

┌────────────────────────────┐
│ Megatron 原始 Experts     │
│ (GroupedMLP / Sequential) │
└──────────┬────────────────┘
          │
          ▼
┌────────────────────────────┐
│ Mindspeed Patch 注册逻辑 │
│ (patch_core_transformers) │
└──────────┬────────────────┘
          │
┌──────────────────────────────────────────┐
│ 被替换函数一览                         │
├──────────────────────────────────────────┤
│ GroupedMLP.__init__ → groupedmlp_init_wrapper │
│ GroupedMLP.forward → groupedmlp_forward / group_mlp_forward │
│ SequentialMLP.forward → sequential_mlp_forward (仅 alltoall) │
│ grouped_gemm_util.* → 自定义 Ops 体系                 │
└──────────────────────────────────────────┘

              ↓
    实际执行路径(动态判定)
        overlap on → group_mlp_forward
        overlap off → groupedmlp_forward
        dispatcher=alltoall → sequential_mlp_forward
        dispatcher=allgather → 原生 forward

🧩 被淘汰函数

原始函数状态
GroupedMLP.__init__ ❌ 永久替换
GroupedMLP.forward ❌ 永久替换
SequentialMLP.forward ⚙️ alltoall 模式下替换
grouped_gemm_util 默认实现 ❌ 替换为自定义 Ops
TEGroupedMLP ✅ 保留原版

II. Router 层(TopKRouter)

下面示意图,展示 MoE Router 部分(TopKRouter)在 Mindspeed 中被替换后的整体调用与函数接管关系

                 ┌──────────────────────────────┐
                │     Megatron 原始 TopKRouter │
                │   (megatron.core.transformer │
                │       .moe.router.TopKRouter)│
                └─────────────┬────────────────┘
                              │
                              ▼
                ┌──────────────────────────────┐
                │       Mindspeed Patch       │
                │ MOERouter.register_patches │
                │ (from moe_router.py)       │
                └─────────────┬────────────────┘
                              │
      ┌─────────────────────────────────────────────────────────────┐
      │                   被替换函数映射一览                     │
      └─────────────────────────────────────────────────────────────┘
            │
            ├──► TopKRouter.__init__ ───────────────► topk_router_init_wrapper
            │
            ├──► TopKRouter.forward ────────────────► topk_router_forward
            │
            ├──► TopKRouter.gating   ────────────────► topk_router_gating_func
            │
            ├──► TopKRouter.routing ────────────────► topk_router_routing
            │
            └──► z_loss_func (moe_utils) ────────────► mindspeed 自定义 z_loss_func

      ┌─────────────────────────────────────────────────────────────┐
      │               topk_router_forward 主调用链               │
      └─────────────────────────────────────────────────────────────┘
                            │
                            ▼
                ┌──────────────────────────────┐
                │ apply_input_jitter (可选)   │
                ├──────────────────────────────┤
                │ topk_router_gating_func     │
                │   → 线性变换 (FP32/FP16 可选)│
                ├──────────────────────────────┤
                │ topk_router_routing         │
                │   → 根据 routing_type 分派: │
                │                             │
                │ ├ sinkhorn → sinkhorn_load_balancing
                │ ├ aux_loss → aux_loss_load_balancing
                │ ├ softmax_topk → softmax + topk
                │ ├ group_limited_greedy → group_limited_greedy_topKgating
                │ ├ pai_megatron_aux_loss → pai_megatron_aux_loss
                │ ├ sparsemixer_topk → sparsemixer_top2
                │ ├ none / noaux_tc → topk_softmax_with_capacity
                │                             │
                ├──────────────────────────────┤
                │ optional: apply_z_loss, gather_from_sequence_parallel_region │
                └──────────────────────────────┘

      ┌─────────────────────────────────────────────────────────────┐
      │             实际运行函数 (最终执行路径)                   │
      └─────────────────────────────────────────────────────────────┘
                TopKRouter.forward   → topk_router_forward
                ├─→ gating           → topk_router_gating_func
                ├─→ routing         → topk_router_routing
                │     ├ sinkhorn_load_balancing
                │     ├ aux_loss_load_balancing
                │     ├ topk_softmax_with_capacity
                │     ├ group_limited_greedy_topKgating
                │     ├ pai_megatron_aux_loss
                │     └ sparsemixer_top2
                └─→ apply_z_loss (替换版)

      ┌─────────────────────────────────────────────────────────────┐
      │             被淘汰 / 不再调用的原函数                     │
      └─────────────────────────────────────────────────────────────┘
            ✗ TopKRouter.__init__ (Megatron 原版)
            ✗ TopKRouter.forward
            ✗ TopKRouter.gating
            ✗ TopKRouter.routing
            ✗ moe_utils.topk_softmax_with_capacity (原版)

可总结为一句话:

原 Megatron TopKRouter 的四个核心方法全部被替换为 Mindspeed 对应 wrapper,最终所有 gating/routing 行为都经由 topk_router_forward → topk_router_routing 流程统一调度。

 

🔧 替换注册点

MOERouter.register_patches() 中:

MegatronAdaptation.register('megatron.core.transformer.moe.router.TopKRouter.__init__',
                           topk_router_init_wrapper)
MegatronAdaptation.register('megatron.core.transformer.moe.router.TopKRouter.forward',
                           topk_router_forward)
MegatronAdaptation.register('megatron.core.transformer.moe.router.TopKRouter.gating',
                           topk_router_gating_func)
MegatronAdaptation.register('megatron.core.transformer.moe.router.TopKRouter.routing',
                           topk_router_routing)
MegatronAdaptation.register('megatron.core.transformer.moe.moe_utils.topk_softmax_with_capacity',
                           topk_softmax_with_capacity)

🧠 TopKRouter 逻辑结构

模块替换后函数功能概述
TopKRouter.__init__ topk_router_init_wrapper 初始化 group / n_group / score_fn 等参数
TopKRouter.forward topk_router_forward 主入口:input jitter → gating → routing
TopKRouter.gating topk_router_gating_func logits 线性变换,控制激活方式
TopKRouter.routing topk_router_routing 调度多种路由算法分支
moe_utils.topk_softmax_with_capacity Mindspeed 实现 增强版 softmax+容量控制
(条件)aux_loss_load_balancing 自定义实现 支持异步 overlap / async log loss 等场景

🧮 路由算法分支

topk_router_routing 中,根据 --moe-router-load-balancing-type 分派到:

类型实际函数说明
sinkhorn sinkhorn_load_balancing Sinkhorn 约束分配
aux_loss aux_loss_load_balancing 含负载均衡损失
softmax_topk softmax + topk 普通 softmax 策略
group_limited_greedy group_limited_greedy_topKgating 先选组后选专家
pai_megatron_aux_loss pai_megatron_aux_loss PAI 风格 loss
sparsemixer_topk sparsemixer_top2 稀疏混合器路由
none/noaux_tc topk_softmax_with_capacity 无 loss 简化路由

⚙️ Router 调用主链

TopKRouter.forward
  ├─ topk_router_forward
  │     ├─ apply_input_jitter (可选)
  │     ├─ topk_router_gating_func
  │     ├─ topk_router_routing
  │     │     ├─ sinkhorn_load_balancing
  │     │     ├─ aux_loss_load_balancing
  │     │     ├─ group_limited_greedy_topKgating
  │     │     ├─ sparsemixer_top2
  │     │     ├─ pai_megatron_aux_loss
  │     │     └─ topk_softmax_with_capacity
  │     └─ apply_z_loss / gather_from_sequence_parallel_region (可选)

🗺️ Router 模块字符示意图

┌────────────────────────────┐
│ Megatron 原始 TopKRouter │
└──────────┬────────────────┘
          │
          ▼
┌────────────────────────────┐
│ Mindspeed Patch 注册逻辑 │
│ (MOERouter.register_patches) │
└──────────┬────────────────┘
          │
┌──────────────────────────────────────────┐
│ 被替换函数一览                         │
├──────────────────────────────────────────┤
│ TopKRouter.__init__ → topk_router_init_wrapper │
│ TopKRouter.forward   → topk_router_forward     │
│ TopKRouter.gating   → topk_router_gating_func │
│ TopKRouter.routing   → topk_router_routing     │
│ moe_utils.topk_softmax_with_capacity → 自定义版 │
│ (条件) TopKRouter.aux_loss_load_balancing → Mindspeed 版 │
└──────────────────────────────────────────┘

              ↓
      实际执行链
  topk_router_forward
    ├─ gating → topk_router_gating_func
    ├─ routing → topk_router_routing
    │     ├ sinkhorn_load_balancing
    │     ├ aux_loss_load_balancing
    │     ├ group_limited_greedy_topKgating
    │     ├ sparsemixer_top2
    │     ├ pai_megatron_aux_loss
    │     └ topk_softmax_with_capacity
    └─ apply_z_loss / gather_sequence_parallel (可选)

      被淘汰:
      ✗ TopKRouter.__init__ (原版)
      ✗ TopKRouter.forward
      ✗ TopKRouter.gating
      ✗ TopKRouter.routing
      ✗ 原版 topk_softmax_with_capacity

 

III. 🔩 总结:Mindspeed-LLM MoE 的总体演化逻辑

模块原 Megatron 功能Mindspeed 替换方案增强点
Experts (GroupedMLP) 多专家独立 GEMM 通信-计算重叠 / TP-EP 扩展 / fused_swiglu 提升并行效率、减通信瓶颈
SequentialMLP 串行专家推理 TP all-gather + 异步流重叠 支持多专家 alltoall 模式
Router (TopKRouter) softmax+topk 简单 gating 多种策略(Sinkhorn, SparseMixer, Greedy)+ 异步均衡 loss 路由更鲁棒、更灵活
通信核 普通 alltoall / allgather grouped_mlp_with_comp_and_comm_overlap_* 计算与通信异步融合
Checkpoint / 重计算 默认 PyTorch 机制 CheckpointWithoutOutput 自定义 精确控制激活保存与释放

一句话总结:

Mindspeed-LLM 的 MoE 实现在保持 Megatron 接口兼容的同时, 通过 Patch 替换实现了“专家层异步通信 + 重计算优化 + 多策略路由”的闭环体系。 核心思路:GroupedMLP/SequentialMLP 接管专家执行;TopKRouter 接管路由调度。 所有前向路径最终都经由 Mindspeed 自定义函数运行,原始 Megatron 版本仅保留结构壳体。

 
http://www.hskmm.com/?act=detail&tid=34235

相关文章:

  • 实时时序上下文推荐系统获KDD最佳论文奖
  • 题解:CF1010A Fly
  • 2025年精密磨床/CNC机械加工厂家推荐排行榜,覆盖铣床/车床/磨削/多轴/复合加工,专业非标定制服务首选!
  • 题解:CF1914F Programming Competition
  • 独立开发者找蓝海:新词引流实战
  • 使用云服务器搭建飞牛Frp 内网穿透服务
  • Luogu P14255 列车(train) 题解 [ 蓝 ] [ 线段树 ] [ 二维平面转化 ]
  • 使用VS2022和Unity时可能出现的问题总结
  • 2025年喷雾机器人,取件机器人,工业机器人厂家权威推荐榜单:智能高效与稳定性能的行业首选!
  • 2025年给汤机厂家推荐排行榜,高效节能/智能控制/稳定耐用的优质品牌选择!
  • 理想完美主义者的宣战:当一人面对整个时代的“合理”谎言
  • Java中的this关键字的用法
  • 网络安全威胁狩猎:主动防御的终极指南
  • C#在二合一平板电脑关于旋转模式相关设置
  • 2026 中考游记
  • MinIO 介绍(3)--MinIO 客户端 mc 管理员功能
  • 8.16
  • 2025-10-19
  • 一文读懂隔离见证
  • 12131
  • 关于火柴盒的记忆
  • PWN手的成长之路-19-int_overflow
  • FFmpeg开发笔记(八十四)使用国产的librestreaming实现RTMP直播
  • 2025 年闪测仪厂家企业品牌推荐排行榜,一键式闪测仪,卧式闪测仪,影像闪测仪,立式闪测仪,2D3D 混合式闪测仪,高精度闪测仪,大量程闪测仪,复合式闪测仪公司推荐
  • 2025 年耐火砖厂家企业品牌推荐排行榜,绝热,轻质,莫来石,保温,莫来石轻质,氧化铝泡沫,氧化铝空心球,抗渗碳,高温轻质莫来石,高温耐火砖公司推荐
  • 2025 年护栏板厂家企业品牌推荐排行榜,波形,高速,镀锌,二波,三波,喷塑,国标,绳索,公路护栏板,护栏板立柱公司推荐
  • 2025 年船用锅炉厂家企业品牌推荐排行榜,基于市场口碑,评选值得信赖的船用锅炉公司推荐
  • 2025 年反应釜厂家企业品牌推荐排行榜,实验室,高压,加氢,不锈钢,试验室,氢化,聚合,高温,钛材反应釜公司推荐
  • 2025 年铸铁闸门厂家企业品牌推荐排行榜,四川铸铁闸门,镶铜铸铁闸门,渠道铸铁闸门,圆形铸铁闸门,方形铸铁闸门公司推荐
  • 2025 年启闭机厂家企业品牌推荐排行榜,四川启闭机,四川卷扬启闭机,四川螺杆启闭机,固定卷扬启闭机,手电两用螺杆启闭机,电装启闭机公司推荐