MPK:把张量程序编译成持久化大内核(OSDI 2026)

原题:MPK: A Compiler and Runtime for Mega-Kernelizing Tensor Programs

一句话总结:传统 kernel-per-operator 执行在算子边界引入启动和同步气泡;MPK 用 SM 粒度的 tGraph 和内核内调度器把整个推理过程融合成一次 mega-kernel,在五个模型、A100/H100/B200 上相对 vLLM/SGLang 获得 1.0–1.7× 吞吐提升,并将 Qwen3-8B 的单 token kernel 启动开销从约 0.2–1.1 ms 消除。

问题与动机

LLM 推理通常把每个张量算子交给独立 GPU kernel。即使使用 CUDA Graphs,这种模型仍在 kernel 之间形成全局屏障:依赖算子只能在前一个算子完全结束后启动,计算和通信难以细粒度重叠,数百个 kernel 的启动也会增加每 token 延迟。CUDA Graphs 还偏静态,动态 batch、控制流和依赖变化会削弱其收益。

MPK 试图自动化手写 persistent kernel 的工作。输入仍是 PyTorch 张量程序,但编译器将算子拆成 SM 级任务,运行时在一个持久化 kernel 中调度计算与通信。目标是保留 PyTorch 编程接口,同时获得跨算子流水、通信重叠和较低调度开销。

关键观察 / 隐含假设

  • 观察 1:MatMul 后的 AllReduce 中,每个通信 tile 只依赖部分 MatMul 输出;算子级屏障因此过早同步。图 3、§3 展示了这种依赖关系。
    • 依赖假设:任务能够按输出 tile 正确切分,且设备内存中的事件同步成本低于隐藏通信延迟带来的收益。
    • 可能失效场景:算子依赖高度稠密、任务过小,或跨节点网络延迟和抖动主导执行时,事件和调度开销可能抵消重叠收益。
  • 观察 2:推理包含动态 batch 和数据相关执行时间,尤其是 attention 与 MoE 路由。静态任务分配会造成 SM 负载不均(§5.2、§6.4)。
    • 应对假设:用 JIT 调度处理不均衡算子,用 AOT 预排队稳定算子,且编译时生成的代表性 batch-size tGraph 足以覆盖实际负载。
  • 假设 3:目标模型具有足够“深”的算子链。论文观察到归一化在评测模型中几乎不增加开销,因为融合后的图很少出现宽的 fork/join(§6.7)。这一结论对分支密集或控制流更动态的 DNN 仍属中等强度证据。

核心方法

MPK 的中间表示 tGraph 在 SM 粒度表达任务和事件。任务执行计算或通信,事件等待所有前驱完成后触发后继任务。生产者和消费者按张量区域的重叠关系建立事件,从而保留 tile 级依赖;这比 CUDA Graphs 的 kernel 级依赖暴露更多并行性。

编译器先分解算子,再做 successor-set / predecessor-set event fusion。随后用 tGraph normalization 把每个任务的事件 fan-in/fan-out 限制为至多一个,并用线性化把同一事件触发的任务放入连续索引区间。这样任务只需保存固定大小的事件 ID,事件只需保存首尾索引,减少设备端间接访问。

每个任务的实现由 Mirage superoptimizer 在 thread-block 粒度搜索并生成 CUDA device function,支持软件流水、寄存器复用和 shared-memory layout 优化。运行时把部分 SM 分配给 scheduler,其余分配给 worker;scheduler 传播事件,worker 执行任务,整个模型只启动一次 mega-kernel。

MPK 还引入分页 shared memory,使后续任务能在前一任务计算期间预取数据。JIT 适用于 attention 等执行时间不确定的算子,AOT 适用于稳定算子;二者由编译器按算子分类。MoE 中,路由、all-to-all、expert GEMM 和 combine 都统一成任务,并用运行时 token 元数据做混合负载均衡。

设计取舍

  • 调度开销与负载均衡:JIT 能适应长短序列,却需要 worker-scheduler 通信;AOT 更快,却依赖静态负载近似。混合策略用全局 barrier 作为重新平衡边界。
  • 通用性与特化:tGraph 按 batch size、GPU 架构生成,换形状或硬件需要额外编译;作为交换,任务切分和内存流水能针对目标设备优化。
  • 资源峰值:寄存器按所有任务类型的最大需求固定,可能压低 occupancy;shared memory 改为分页动态分配,但其单调释放约束限制了任务实现。
  • 工程复杂度:实现约 44K 行 C++、42K 行 CUDA 和 10K 行 Python,并依赖 NVSHMEM。论文未量化编译时间、调试成本和故障恢复行为。

实验与结果

  • 在 Qwen3-0.6B、Llama-3.2-1B-Instruct、Qwen3-1.7B、Qwen3-8B 和 Qwen3-30B-A3B 上,A100、H100、B200 单 batch 推理相对 vLLM/SGLang 提升 1.0–1.7×(图 9)。Qwen3-8B/A100 的 per-token latency 从 14.5 ms 降至 12.5 ms,论文估计硬件下界约 10 ms。
  • 8 张 H100 tensor parallel 下,MPK 相对 vLLM/SGLang 提升 1.1–1.4×,相对 PyTorch 最多提升 10×(图 11)。
  • Qwen3-8B 每 token 的 kernel 数为 293;B200 上 eager 启动开销约 1.1 ms,CUDA Graphs 约 0.2 ms。MPK runtime scheduler 仅占总运行时间 0.28%(§6.6)。
  • 跨任务流水使 Qwen3-8B 最后一层线性层加速 1.2–1.3×(图 12);细粒度计算—通信重叠使四张 H100 上的 Qwen3-1.7B 每轮延迟降低约 1.1×(图 13)。
  • event fusion 将 69,000–162,000 个生产者—消费者依赖压缩为 1,142–2,366 个事件;线性化使 Qwen3-8B 编码从 110,932 bytes 降至 18,928 bytes,即 5.9× 缩减(表 2)。

论断—证据表

论断证据评测边界置信度
单 batch serving 可明显降低延迟图 9;1.0–1.7× 相对提升五个 LLM,A100/H100/B200,batch 1–16
SM 级依赖能带来计算—通信重叠§6.6、图 13;约 1.1×Qwen3-1.7B,4× H100,tensor parallel
单次 kernel launch 能消除启动成本§6.6;293 次 launch、0.28% scheduler 开销Qwen3-8B,B200
编译式 mega-kernel 能处理动态 serving§6.4、图 9离线 batch,固定 64-token prompt 和 1024-token 输出

批判性分析

论证链条

论文的主要链条是闭合的:算子级屏障限制流水和重叠,tGraph 暴露 tile 依赖,内核内调度执行这些依赖,消融实验分别测到流水、重叠和启动削减收益。较大的端到端提升集中在小模型和新 GPU;这说明 MPK 主要收回固定开销,不代表所有计算密集型模型都能获得同等收益。

假设压力测试

评测采用离线 batched inference、固定 prompt 和输出长度,避免了在线到达间隔、取消、抢占和 SLO 约束。论文支持连续 batching,但没有给出真实 request trace 下的 P99 或 admission 控制结果。batch-size powers-of-two 的多 tGraph 方案也可能在形状组合更多时增加编译和缓存管理成本。跨节点通信只在概念上讨论,实验证据集中在 DGX 内部 H100。

实验可信度

基线包含经过高度优化的 vLLM 和 SGLang,且使用相同精度、paged attention 和 continuous batching,比较具有参考价值。实验覆盖三代 GPU、dense/MoE 和单/多 GPU;但主要指标是吞吐或平均 per-token 延迟,缺少在线 P99、显存占用、编译时间、能耗、恢复时间以及更多网络拓扑的测量。因此“接近硬件极限”的结论应限于给定模型和离线工作负载。

系统性缺陷

一个 mega-kernel 把模型执行、请求管理和通信耦合到同一设备内运行时,可能增加错误定位、升级单个算子和故障恢复的难度。论文未讨论单个通信任务失败、GPU hang、任务超时、租户隔离或动态模型加载。scheduler 固定占用四个 SM,在小模型或极小 batch 上的资源机会成本也需要独立测量。

局限与后续工作

  • 局限 1:动态性通过预编译多个代表性 batch-size tGraph 处理,而非任意形状的完全动态编译。
  • 局限 2:评测主要是离线推理,未覆盖在线服务的到达过程、P99、请求取消和多租户隔离。
  • 后续工作 1:在公开在线 trace 上比较 MPK、vLLM 和 SGLang 的 P50/P95/P99、编译缓存命中率及单位 token 能耗。
  • 后续工作 2:在跨节点 RDMA 拓扑上测量事件粒度、网络抖动和错误恢复对 mega-kernel 的影响。
  • 后续工作 3:研究 scheduler SM 数量、寄存器上限和任务粒度的自动调优,验证其对小模型与分支密集模型的适用性。

相关