LLM 学习日志 #6 巨型内核:MegaKernel

这是最近笔者很感兴趣的一个新技术,因此对其进行了一些论文的阅读了解。在此整理为一篇简短的日志,以备忘和供读者参考和了解相关的技术。

什么是MegaKernel

MegaKernel(巨型内核) 是一种 GPU 推理优化技术,其核心思想是把整个LLM的推理过程,包括所有计算、跨 GPU 通信融合(fuse)进一个单独的 GPU kernel 中执行,而不是像传统方式那样把每个算子(operator)启动成一个独立的 kernel。

它在某种程度上和 CUDA Graph 在思想上有相似性(减少launch开销),但比 CUDA Graph 的录制-重放方案激进的多也彻底的多,当然也因此被施加了更明显的限制和工程复杂性。

传统 LLM 推理通常依赖一长串 GPU kernel launch 和外部通信调用,这导致硬件利用率不足。巨型内核通过端到端的 GPU 融合方式,把跨多层、多迭代、多 GPU 的操作全部融合进一个 kernel,从而消除启动开销,实现细粒度的软件流水线,并让计算与通信重叠。

最近Megakernel也开始逐渐被用于训练的生产环境,这是一个值得注意的进展。

值得关注的社区进展

虽然说是新技术,其实也不是很新了。它是在2025年由几个团队几乎同期推动起来的方向。具体而言又分为两条方向的线索:

1. 斯坦福 Hazy Research 团队(Tri Dao 等人所在组)

2025 年 3 月发布了 ThunderMLA,这是一个针对 DeepSeek MLA 解码的融合 megakernel,在多种工作负载下比 DeepSeek 的 FlashMLA 快 20–35%。随后在 5 月发布了著名的 "No Bubbles" 博客《Designing a Low-Latency Megakernel for Llama-1B》,指出 vLLM、SGLang 等主流推理引擎在 H100 上跑 Llama-3.2-1B 单序列时,GPU 带宽利用率最多只有 50%,而 megakernel 方法可以大幅突破这个瓶颈。这部分工作主要注重开发手工设计的高性能megakernel。

2. CMU 贾志豪(Zhihao Jia)团队

主要开发的是Mirage Persistent Kernel (MPK),注重系统性的自动化编译器路线。该项目由 CMU、UW、Berkeley、NVIDIA、清华的联合团队开发,2025 年 6 月开源,核心成员包括 Xinhao Cheng、Mengdi Wu、Xupeng Miao、陈天奇(Tianqi Chen)、贾志豪等等知名研究者。MPK 是首个能将多 GPU 模型推理自动转换为单个高性能 megakernel 的编译器和运行时系统,引入了 SM 级别(streaming multiprocessor)的图表示来捕获数据依赖,从而实现跨算子软件流水线、细粒度 kernel 重叠等以前不可行的 GPU 优化。

值得关注的论文:

《Mirage Persistent Kernel: A Compiler and Runtime for Mega-Kernelizing Tensor Programs》(arXiv:2512.22219)

《Mirage: A Multi-Level Superoptimizer for Tensor Programs》

《Event Tensor: A Unified Abstraction for Compiling Dynamic Megakernel》 Megakernel编译抽象

《UniEP: Unified Expert-Parallel MoE MegaKernel for LLM Training》(arXiv:2604.19241) 关于MoE+训练场景+MegaKernel

MegaKernel的核心抽象和核心优势

SM 级任务图(SM-level task graph)

MPK 最有标志性的抽象。众所周知传统编译器(PyTorch、TVM、Triton)的最小调度单位是整张 GPU 上的一个 kernel。MPK 提出在单个流式多处理器(SM)粒度上表示计算和 GPU 间通信,引入了一个叫 tGraph 的 SM 级图表示,节点是跑在单个 SM 上的任务,边是任务间的细粒度依赖。

这意味着调度器/编译器处理的粒度不再是类似"matmul - attention - matmul"的结构,而是"matmul 的第 5 个 tile 在 SM 17 完成 - attention 中依赖这个 tile 的任务现在可以在 SM 17 开始"这样的结构。它本身可以消除一部分jitter和流水线空泡,但是和下文的动态调度结合起来更有威力。

片上解释器(on-GPU interpreter)/持久内核

持久内核作为 GPU 性能优化概念已经被广泛认识和采用,但 MegaKernel 明显将其推进到进一步的高度。整个 megakernel 启动一次后,每个 SM 都初始化一个解释器,开始执行一串指令序列(序列在 launch 之前调度到每个 SM 的队列中)。解释器通过类似编译器的指令重排的方式进行流水线填充,从而消除操作之间的内存气泡。

静态和动态调度

该说不说,GPU 终于发展到了能让 CPU 失业的临界点。如果动态调度成为 GPU 的标配方案,CPU 可能基本上就会变成 GPU 的启动器。让我们观察它的未来发展。

静态调度 在编译期就把指令切分到每个 SM 的私有队列。好处是可以预取并把多条指令直接载入共享内存,取指开销极低;坏处是要求编译器提前静态划分指令,而指令的延迟是可变的,SM 之间还存在抖动(jitter),会造成负载不均。

动态调度 用一个全局指令队列让所有 SM 抢占式领取。取指开销更高(需要 global memory 往返加原子锁),但可以隐藏在上一条指令执行期间,不需要编译器提前分配指令。当一个 SM 准备好时,从全局队列中取出一条指令执行。这个方案的好处是自然对 jitter 自适应,快的 SM 得到更多工作,因此具有负反馈的自均衡特性。当静态调度的空泡累积的较多的时候,优势就会很明显。

MegaKernel的发展前景

这套机制的代价主要是工程复杂度和动态性支持。现代 LLM 服务负载本身是动态和不可预测的,因此需要 continuous batching 甚至变长输入之类的方案。要在单个 megakernel 里支持这些动态形状,常常需要为每种可能的形状重新生成或重新编译 kernel,启动延迟会变得不可接受,甚至当形状空间过大时根本做不到。现有的 megakernel 框架目前主要面向 single-batch 推理,在动态形状或数据相关负载下还不能与通用推理系统公平对比。这被认为是未来一两年这个方向的研究重点。