本文档基于 arXiv 2609.13585(mKernel,2026-09-11 提交,UC Berkeley)论文
1. 论文与背景速览
mKernel是面向多 GPU、多节点的融合 kernel 库:把"计算 + 机内 NVLink 通信 + 机间 RDMA"三者放进同一个 kernel,在tile 粒度上重叠执行。
- 问题:MoE 训练中通信占 forward pass 43.6%、端到端训练 32%;设备间通信最高占执行时间 47%。算力增速快于网络带宽(GB300 NVL72 机架 720 PFLOP/s,每 GPU 出机架仅单 NIC 400–800 Gb/s)。
- 现状:现有融合 kernel(Flux、Comet、TileLink 等)几乎都局限在单 NVLink 域;双流stream重叠只在 kernel/chunk 边界释放数据,粒度粗。
- 答案:mKernel 在 2×8 H200 集群上,GEMM+AllReduce 最高1.72x、Ring Attention 最高1.88x(对比 cuBLAS/FlashAttention+NCCL 未融合基线)。
- 反直觉发现:GPUDirect Async(IBGDA)相对 host-assisted GPU-initiated 通信几乎无吞吐增益。
来源:arXiv 2609.13585 / HTML 全文
2. 实现细节拆解
2.1 硬件层级(论文 Table 1)
| 层级 | 链路 | 带宽(每 GPU) | SM 角色 | 传输机制 |
|---|---|---|---|---|
| 片内 | HBM3e | 4.8 TB/s | compute | loads/stores、TMA |
| 节点内 | NVLink + NVSwitch | 450 GB/s | 本地通信 | TMA、NVSwitch |
| 机间(IB) | ConnectX-7 | 50 GB/s | send/receive | NIC RDMA |
| 机间(EFA) | AWS EFA SRD | 50 GB/s | send/receive | NIC RDMA |
机间带宽只有 NVLink 的约1/9—— 这是"不能把两层同等对待"的物理前提。
2.2 运行时架构(论文 Figure 2)
每 GPU 一个持久 kernel,thread block 按角色划分:
Compute 块 → 写完成 tile + readiness flag → Intra-node 块 → NVSwitch 交换/广播(同节点 8 GPU) → Inter-node send 块 → host 内存 ring buffer 发布 48B 命令 → host proxy 线程 → 批量提交 NIC(libibverbs,最多 8 命令/批) → NIC RDMA → rail peer(同索引 GPU) → 接收端 arrival flag → receive 块消费数据 ↑ 可选 on-GPU controller:读进度计数器 → 发布目标通信 block 数2.3 三层粒度解耦(tile / chunk / batch)
- tile:计算与机内传输粒度(128 行、16 token 等,随 kernel 而定);
- network chunk:机间传输粒度,独立定长。GEMM+AllReduce 将 4 个本地归约 tile 组成256 KiBchunk;per-chunk 计数器让最后完成的 tile 即发布就绪,不等整个 GEMM 结束;
- submission batch:proxy 每连接聚合至多8 条就绪命令一次提交,但保留每条命令独立的完成通知;用 bounded polling window 支持部分批量,避免稀疏到达被拖延。
接收端反向映射:Dispatch+GEMM 加载 token 前,检查与其字节范围相交的每个512 KiBchunk 是否到达。
2.4 SM 分区与运行时自适应
- 静态扫描 2–64 通信 SM:最差 AllReduce 分区比最优慢约25x;最优值跨负载从 2 到 64 SM 变化。
- 自适应 controller:每个 block 在任务边界检查共享"目标通信 block 数",不一致则切换角色。按 cycle counter 估算成本,将目标设为两角色预测完成时间相等:
n_s* = B · (R_s·C_s) / (R_p·C_p + R_s·C_s)- 数据依赖决定初始分配:通信供计算时,等待输入的 compute 块可临时协助通信。
- 效果:21 配置几何均值1.18xvs 静态最优固定分区(免逐形状调优)。
2.5 完成语义(跨平台的关键适配)
| 平台 | 保序性 | 通知路径 |
|---|---|---|
| ConnectX-7(IB RC) | 每连接有序 | data write → 同一连接 flag write;接收端 GPU 直接轮询 flag,无需接收端 proxy |
| AWS EFA(SRD) | 独立写无序 | RDMA write with immediate(immediate 值标识 chunk)→ 接收端 proxy 在 write 接收完成后发布 arrival flag |
原则:到达信号必须标识"完成的 payload",而非"已提交的请求"。
2.6 五个 kernel(论文 Table 3)
| Kernel | 并行 | 依赖 | 机内 | 机间 | chunk |
|---|---|---|---|---|---|
| AllGather+GEMM | TP | 通信→计算 | 每 shard 机内 multicast | 每 shard 每目的节点发一次 | 128 行 |
| GEMM+ReduceScatter | TP | 计算→通信 | TMA atomic add | 每节点部分和交换 | 2–32 tile |
| GEMM+AllReduce | TP | 计算→通信 | NVSwitch 归约+广播 | 每 GPU 发 1/8 输出 | 4 tile(256 KiB) |
| MoE Dispatch+GEMM | EP | 通信→计算 | TMA pull | token buffer 复制到 rail peer | 16 token / 512 KB |
| Ring Attention | SP | 步内独立 | TMA store KV | KV slice 每节点发一次 | 128 行 KV tile |
关键调度选择:① 机间传输尽早发起(AllGather+GEMM 启动即提交输入 shard);② NVSwitch 承担本地归约/复制;③ 计算 tile 按输入可用性排序(本地→同节点→远程)。
2.7 实验结果汇总
| 指标 | 结果 |
|---|---|
| GEMM+AllReduce | 最高 1.72x(CX7)/ 1.53x(EFA) |
| Ring Attention | 最高 1.88x(CX7)/ 1.78x(EFA) |
| AllGather+GEMM | 1.34x(CX7)/ 1.41x(EFA),全尺寸胜出 |
| MoE Dispatch+GEMM | EFA 上 3.1–4.5x;胜过 DeepEP+DeepGEMM |
| 自适应 SM 分区 | 21 配置几何均值 1.18x vs 静态最优 |
| IBGDA vs host-assisted | 几乎无增益(fence+doorbell 开销所致) |
3. 创新点提炼(4+1)
- SM 专业化(SM specialization):同一持久 kernel 内 thread block 分四类角色(compute/intra-node/inter-node send/receive),角色实现与资源分配解耦——调 SM 预算即重平衡,不改计算块 warp 布局。
- 层级化数据移动(hierarchical data movement):rail-optimized 拓扑下机间只交换 rail peer,NVSwitch 承担本地归约/广播,使走机间慢速网络的数据最小化;三层粒度(tile/chunk/batch)独立定长,兼顾"尽早传输"与"摊薄开销"。
- 可移植 host-assisted GPU-initiated 通信:GPU 产命令 + host proxy 提交,直接 libibverbs 实现(不依赖 NCCL/NVSHMEM),同一 kernel 可跑 InfiniBand 与 AWS EFA——把"传输层差异"封装在完成语义适配器中。
- 运行时动态 SM 分区:on-GPU controller 用实测进度 + 剩余工作实时调分配,免去逐 kernel/逐形状的静态调优。
- (发现性创新)IBGDA 增益甚微:GPU 直驱 NIC 需每 chunk 一次 system-scoped fence + doorbell,被 proxy 的"重叠提交 + 批量"抵消——挑战了"GPUDirect 一定更好"的默认假设。
4. API 与编程模型下的定义
mKernel 没有公开发布通用 API,但论文设计隐含了一套可形式化的多节点融合 kernel 编程模型。下面把它的原语与最小接口显式定义出来——这是把它移植到其他芯片(昇腾)的前提。
4.1 抽象出的编程原语
| 原语 | 语义 | mKernel 实现 | |||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
sm_role(block_id) ∈ {COMPUTE, INTRA, SEND, RECV} | 角色化 block 分配 | block index 静态分配 / 任务边界动态切换 | |||||||||||||||||||||||||||||||||||||||||||||||||||
ready_flag(tile_id) | tile 就绪发布 | GPU 内存 flag + 内存序 | |||||||||||||||||||||||||||||||||||||||||||||||||||
chunk(ids, size) | 机间传输聚合单元 | 4 tile→256 KiB 等 | |||||||||||||||||||||||||||||||||||||||||||||||||||
rail_peer(gpu_idx) | 机间交换对象 | 相同本地索引的远程 GPU | |||||||||||||||||||||||||||||||||||||||||||||||||||
command{peer, offset, len, chunk_id} | 传输命令 | 48B、host 内存 ring buffer | |||||||||||||||||||||||||||||||||||||||||||||||||||
completion_adaptor(transport) | 完成语义适配 | IB:>4.2 最小接口定义(示意伪代码,非论文原文)4.3 与现有编程模型的定位关系
一句话定义:mKernel 的编程模型 =持久 kernel + 角色化 SM 预算 + 三层粒度解耦 + 传输无关的完成语义适配。 5. 昇腾芯片落地可行性分析5.1 硬件层级映射(对照论文 Table 1)
5.2 逐创新点可行性评估
|