博客
文章系列日历
归档关于搜索

鄂ICP备19019526号

© 2026 博客

  1. 文章
  2. GPU Kernel 调度:大模型推理的拐点 2026

GPU Kernel 调度:大模型推理的拐点 2026

2026年8月20日·约 23 分钟·6885 字·1 次阅读
AI 原生架构
GPU Kernel 调度:大模型推理的拐点 2026

目录

  • 一、问题的提出:当 GPU kernel 成为推理的瓶颈
  • 二、形式化:从计算图到 kernel 调度的四个层级
  • 三、FlashAttention-3 的 warp specialization 与 producer-consumer 流水线
  • 四、Flash Decoding 的并行规约与长序列解码
  • 五、Persistent Kernel 与指令持久化
  • 六、CUDA Graph 的图捕获与 replay 开销
  • 七、对生产实践的推论
  • 八、讨论:与推测解码、prefix cache 的协同
  • 九、给推理工程师的 kernel 调度清单
  • 参考文献

一、问题的提出:当 GPU kernel 成为推理的瓶颈

在过去两年大模型推理优化的主要叙事里,关注的焦点从单纯的模型量化(GPTQ、AWQ、INT4/INT8)逐步转向了系统级调度:PagedAttention 解开了 KV cache 的内存碎片、Continuous Batching 解开了请求级的 bubble、Speculative Decoding 解开了串行自回归的算力闲置。然而当我们把这些"上层"优化都装上之后,再用 NVIDIA Nsight Compute 或者 DCGM exporter 抓一段生产 trace,会发现 GPU 的 SM 占用率其实仍然只在 60% 到 80% 之间徘徊——剩下 20% 到 40% 的算力去哪了?答案藏在 kernel 本身。FlashAttention 的迭代、Flash Decoding 的并行规约、Persistent Kernel 的指令持久化、CUDA Graph 的图捕获与 replay,这四条技术线在过去十二个月里密集交汇,共同指向一个事实:在大模型进入千亿参数、十万级上下文之后,推理性能的下限已经由 GPU kernel 调度决定,而不是由上层 batching 或量化决定。这是一个工程拐点,因为它意味着推理优化的主战场从 Python 调度器下沉到了 CUDA C++ 与 PTX。本文要做的就是把这四件事的内在结构、生产取舍、相互组合的关系讲清楚,并且给出可落地的工程建议。读者画像是负责 LLM 推理服务的系统工程师、性能工程师以及希望深入理解 GPU 利用率的架构师。

二、形式化:从计算图到 kernel 调度的四个层级

为了避免后面讨论的混乱,先把"推理时 GPU 上发生了什么"做一个四层分解。最上层是模型层——Transformer 的算子组合,包括 attention、MLP、embedding、LM head。这一层的输出是一个计算图(computation graph),可以由 PyTorch / JAX / ONNX 等表示。计算图的每一个 op 对应一个或多个 GPU kernel,这是第二层——算子层。FlashAttention-2 对应 attention 前向与反向共 2 个 kernel,MLP 对应两个 GEMM kernel(gate_proj + up_proj 后接 down_proj,或其融合变体),每一组 kernel 都有自己的 launch latency 与 SM 占用模型。第三层是kernel 内部层,即 kernel 启动后在 SM 上的 warp 调度、shared memory 流水、寄存器分配、Tensor Core 利用率。FlashAttention-3 的核心改造就在这一层:把 warp specialization 与 producer-consumer 流水线引入 attention 主体,让 warp group 分别承担 MMA 计算与 softmax/epilogue 数据搬运。第四层是指令层,即 PTX / SASS 级别,关心 LDG/STG、MMA、barrier、cluster sync 等微指令的发射与等待。这四层不是孤立的,上层调度策略的合理性最终要落到第四层的指令吞吐上才算数。

把推理时延拆开来看,可以用四个数来描述:kernel launch overhead、kernel 执行时间、kernel 之间的 bubble、kernel 内部的 stall。在 H100 上,单次 kernel launch 的固定开销约为 5 到 10 微秒(CUDA Graph 可压到 1 微秒以下),bubble 主要由依赖等待与同步原语造成,stall 主要由 shared memory 流水、Tensor Core 队列深度、寄存器压力造成。一个典型的 7B 模型 prefill 一段 8K prompt 时,可能要发射 800 到 1500 个 kernel,单纯 launch overhead 累计就达到 4 到 15 毫秒,占整段 prefill 时延的 10% 到 20%。这就是为什么 kernel 调度工程在 2026 年变得重要:当单请求已经无法再靠量化或并行化榨出更多性能时,剩下的优化空间几乎全在 launch / bubble / stall 这三个数里。后面四节会按这个四层框架分别讨论 FlashAttention-3、Flash Decoding、Persistent Kernel、CUDA Graph,然后给出它们如何在生产中协同工作。

三、FlashAttention-3 的 warp specialization 与 producer-consumer 流水线

FlashAttention 系列的演进是观察 kernel 工程进化的最佳切片。FlashAttention-1(2022)证明可以把 attention 的中间结果不写回 HBM、只放 shared memory,从而把 IO 从 O(N²) 降到 O(N),这是 IO 复杂度的胜利。FlashAttention-2(2023)解决了 1 的并行度问题,把 Q 分块并行、K/V 分块流水线,使得 SM 利用率从 ~50% 提到 ~70%。到 FlashAttention-3(2024 H100 专用),问题变了:H100 的 HBM3 带宽已经是 3 TB/s,单个 SM 的 FP16 Tensor Core 算力是 1979 TFLOPS,二者比例(B/A ratio)发生了变化,单纯做 IO 优化已经不能填满算力。瓶颈转到了Tensor Core 流水与 softmax 算子之间的依赖——softmax 需要全局归约、归约完成前下一个 MMA 不能开始,这就形成了 stall。FlashAttention-3 的核心贡献是把 warp specialization 引入了 attention kernel。具体来说,它把一个 warp group(4 个 warp)分为两类:producer warp 负责从 HBM 加载 K/V 数据到 shared memory、做完 softmax 所需的 row-max 与 row-sum 归约;consumer warp 负责拿到 K/V tile 后立即开始 MMA 计算 QK^T 与 PV 乘积。Producer 与 consumer 通过 asynchronous barrier(bar.sync 的非阻塞变体)解耦,让 Tensor Core 永远有活干。这是经典的"双缓冲 + 软件流水"思路在 GPU kernel 层的体现,但实现细节远比 CPU 上的双缓冲复杂,因为 warp 之间的寄存器不共享,必须通过 shared memory 显式搬运。Nsight Compute 上看 FlashAttention-3 的 kernel,warp scheduler 会显示两组 warp 交替活跃,Tensor Core pipeline 利用率可以稳定在 85% 到 92% 之间,比 FlashAttention-2 提升约 20 到 30 个百分点。这一提升在 H100 的 BF16 attention 上大致对应 1.4 到 1.7 倍的端到端加速。

但是 warp specialization 不是免费的。它的代价有三:第一,寄存器压力。Producer 与 consumer 需要各自维护一套寄存器状态来暂存 tile 数据与 softmax 统计量,这会降低 occupancy(一个 SM 上同时驻留的 warp 数)。H100 上 FlashAttention-3 的 occupancy 通常在 50% 左右,比 FlashAttention-2 的 75% 低。第二,异步 barrier 的精度要求。如果 producer 太快、consumer 太慢,shared memory 会被塞满;反之 consumer 闲置。两者必须靠仔细的 swizzle pattern 与 tile 大小调参才能平衡。第三,可移植性差。这套优化是针对 H100 的 SM 数量、shared memory 大小、Tensor Core 流水线专门设计的,移植到 A100 上几乎要重写,移植到 AMD MI300 上又要重写。从工程现实看,FlashAttention-3 的最佳实践是"不要自己改"——直接用官方实现,跟随版本升级,把有限的工程精力放在上层调度上。这听起来像废话,但很多团队在 FA-2 时代养成自己 fork 自定义 FA 的习惯,到了 FA-3 时代继续 fork,结果第一年就被 H100 新硬件的演进甩开。

四、Flash Decoding 的并行规约与长序列解码

FlashAttention 解决的是"长 prompt 的 prefill"问题,但推理服务的实际流量里大量是 decode 阶段——单 token 自回归生成,可能持续生成 4096 个 token 甚至更长。Decode 阶段的 attention 有一个本质不同:Q 只有一个向量(或几个向量),但 K/V 是全序列。这种"Q 很小、K/V 很大"的非对称性让 FlashAttention 的标准分块策略失灵——Q 只有几十个元素却要启动一个完整 kernel,所有 SM 都闲置。Flash Decoding(2023 年由 Tri Dao 等人提出,2024 年并入 vLLM 与 TGI 的生产实现)的核心思想是把 K/V 也按 sequence 维度分块,让多个 SM 并行计算局部 attention,最后做一次跨 block 的 log-sum-exp 归约。具体来说,把 K/V 切成 c 个块(c 通常取 8 到 32,取决于 GPU 与序列长度),每个 SM 计算 Q 与自己那块 K/V 的部分 attention,得到一个 partial output、partial max、partial sum;然后用一个小 kernel 把 c 个 partial 结果用 online softmax 公式合并,得到最终 attention output。这一拆分把 decode 阶段的 attention kernel 从"单 SM 跑 N 个 token"变成"c 个 SM 各跑 N/c 个 token",Tensor Core 利用率从原来的 ~10%(decode 阶段典型值)提升到 60% 到 80%。这对于长序列(>4K)的 decode 场景是决定性的优化——没有 Flash Decoding 之前,一个 32K 上下文的 decode step 需要 50 到 80 毫秒;有了之后压到 10 到 20 毫秒。

但是 Flash Decoding 引入了额外的规约 kernel 与同步开销。规约本身是一个小 kernel,launch + 执行通常 50 到 200 微秒。当序列长度 N 较短时(比如 N < 1024),分块带来的并行收益可能还抵不上规约开销,此时 Flash Decoding 反而比直接跑标准 attention 慢。这就引出了一个工程经验法则:Flash Decoding 的启动门槛大约是 sequence length / (number of SMs × per-SM parallelism) ≥ 2。具体到 H100(132 个 SM)与典型 tile 大小,这个门槛大致落在 1024 到 2048 之间。生产实现里通常把这个判断交给 runtime 自动决策——vLLM 0.5 之后的版本有一个 flash_decoding_enabled 阈值开关,可以根据实测数据微调。另一个工程坑点是 partial output 的精度:online softmax 合并要求每个 partial 都附带 log-sum-exp 标量,并且用 FP32 累积。FP16 累积在 c=16 时误差会累积到 1e-3 量级,对大多数应用无影响,但对数值敏感的 benchmark(lm-eval-harness 的 strict 模式)可能触发轻微不通过。生产里建议强制 FP32 累积,避免任何数值争议。Flash Decoding 的真正价值在于:它把 decode 阶段的 attention 从 GPU 的"长尾问题"变成了"可预测问题"——给定 GPU 与序列长度,decode attention 时延可以从 50ms ± 30ms 收敛到 15ms ± 3ms,这对 SLO 工程的稳定性是质变。

五、Persistent Kernel 与指令持久化

前两节讨论的 FlashAttention-3 与 Flash Decoding 都是请求级 kernel——每次有新的推理请求,runtime 就 launch 一组新的 kernel。这种模式在请求量大、batch 灵活的场景下是合理的。但当 batch 固定、kernel 反复 launch 时,launch overhead 本身成为了系统性成本。Persistent Kernel(2024 年由 NVIDIA 与社区在 FasterTransformer、vLLM 的实验分支里逐步引入)的核心思想是让一组 kernel 长驻 GPU,等待工作到来。具体来说,启动一个 Persistent Attention Kernel(PAK)或 Persistent MLP Kernel(PMK),它内部有一个 work queue,runtime 通过 shared memory 或 device memory 把任务指针写进去,kernel 通过 polling 或 event 等待新任务,然后处理任务、标记完成、继续等待下一个任务。整段推理服务的生命周期里,kernel 不再被销毁与重建,只剩下若干 worker 循环跑任务。这把 launch overhead 从"每次 5 到 10 微秒、累计 4 到 15 毫秒"压缩到了接近零。

Persistent Kernel 的工程难度集中在三个方面。第一,work distribution 的实现。Runtime 与 kernel 之间需要共享一个数据结构,通常是 ring buffer 形式的双端队列,runtime 写、kernel 读。多 producer 多 consumer 场景下需要 atomic 操作保证可见性,最新的实现倾向于用 cuda::pipeline 或 TMA(Tensor Memory Accelerator,H100 引入的硬件级异步拷贝)来降低同步成本。第二,错误处理与超时。传统 kernel 出错立即抛异常、runtime 捕获;但 persistent kernel 在循环中,一个 iteration 出错不能让整个 kernel 死掉,需要在循环里加 try-catch 等价物(实际上是 error flag + periodic check)。生产里通常给每个任务一个 deadline,超时则强制 abort 并 fallback 到请求级 kernel。第三,与 batch scheduling 的接口。Continuous Batching 假设每个 step 都是一次 launch;persistent kernel 假设 step 是 work queue 里的一个 entry。两者必须在 scheduler 层面协调,通常的做法是 scheduler 把 batch 视作"虚拟 step",把 token 调度转化为 work queue 的 enqueue/dequeue 操作。Persistent Kernel 的优势在 batch 大且稳定时最明显——当 batch size 在 32 到 128 之间、每个 token 的 decode 时延在 10ms 上下时,launch overhead 占比可能高达 30% 到 50%,Persistent Kernel 可以把这部分基本吃掉。当 batch size 动态变化(从 1 到 256 抖动)时,Persistent Kernel 的优势会缩水,因为有些 worker 会 idle。

Persistent Kernel 不是免费的午餐。它的最大代价是调试复杂度。Nsight Compute / Nsight Systems 在 Persistent Kernel 上抓的 profile 是连续的,看不到清晰的"这次 launch 了什么",需要手动加 range marker 才能分清 iteration。这对性能工程师是非常高的要求——很多团队上手 Persistent Kernel 后调试时间远超优化收益。一个折中方案是 partial persistent:只在最热的 kernel(通常是 attention 与最后一个 GEMM)上启用 persistent,其余走常规 launch。vLLM 的 v1 架构部分采纳了这个思路。

六、CUDA Graph 的图捕获与 replay 开销

Persistent Kernel 从"内核"层面减少 launch overhead,CUDA Graph 从"runtime"层面做同一件事。CUDA Graph 是 NVIDIA 在 CUDA 10 引入、CUDA 11 大幅增强的特性,允许把一段 kernel 序列"捕获"成一个图对象,然后一次性 launch。捕获时所有 kernel、参数、依赖关系都被记录下来;replay 时 runtime 不再逐个 launch,而是按图的拓扑一次性下发。实测在 H100 上,单次 graph replay 的开销是 1 到 3 微秒,比单次 launch 的 5 到 10 微秒低 3 到 10 倍。对于一段发射 800 个 kernel 的 prefill,整体 launch overhead 从 8 毫秒降到 1.6 毫秒,节省 6.4 毫秒,对于一个 100 毫秒的 prefill 是 6% 的端到端加速。对于一段发射 50 个 kernel 的 decode step(每个 step 50 个 kernel × 100 个 step),节省更可观。

CUDA Graph 的关键陷阱是形状(shape)固化。图捕获时所有 tensor 的 shape、stride、data pointer 都被记录。如果运行时 shape 变化(比如 prefill 阶段从 1K 变到 8K、batch size 从 1 变到 32),图就失效,必须重新捕获。这对 LLM 推理是个大问题——prompt 长度天然可变,batch size 也天然可变。工程上通常维护一组"典型 shape"的预捕获图(1K/2K/4K/8K/16K 五档 × batch 1/4/16/32 四档 = 20 个预捕获图),运行时根据实际 shape 选择最近的预捕获图;如果都不匹配,fallback 到 eager launch(不捕获)。最新做法是 CUDA Graph 模板 + 动态 shape,在图里用 cudaGraphInstantiateWithFlags(cudaGraphInstantiateFlagAutoFreeOnLaunch) 加 device memory pool,让 graph 在每次 replay 时可以接受不同的 input pointer 与 shape,但 tensor 的 rank 与总元素数仍然固定。这一限制让动态 shape 推理的工程化变得有挑战,但收益也真实存在:vLLM 0.6+ 在 shape 多样场景下用 cuda_graph_pool_size 配置可以拿到 5% 到 15% 的端到端加速。

CUDA Graph 的另一个工程要点是与 NCCL 的兼容性。多 GPU 推理(TP/PP)涉及跨 GPU 的 NCCL all-reduce/all-gather。CUDA Graph 捕获 NCCL 通信 kernel 需要 NCCL 2.18+ 开启 NCCL_GRAPH_REGISTER 或 NCCL_ASYNC_ERROR_HANDLING,否则会运行时崩溃或 hanging。生产里建议把 NCCL 版本与 CUDA Graph 支持矩阵做成表格,每个新 CUDA/NCCL 版本升级都先在 staging 环境跑 24 小时 soak test,确认无 graph 失败。CUDA Graph 与 persistent kernel 是两个互补的优化:CUDA Graph 解决"一段固定 kernel 序列的 launch overhead",persistent kernel 解决"反复 launch 同一组 kernel 的累积 overhead"。两者可以叠加使用——一段推理流程用 CUDA Graph 捕获,graph 内部的关键 hot path kernel 用 persistent kernel 实现,这在大 batch decode 服务里已经是 SOTA 实践。

七、对生产实践的推论

前四节从理论层面把四条技术线讲清楚了,本节给出五条可直接落地的工程建议,按 ROI 从高到低排列。

建议一:用 FlashAttention-3 替换 FA-2,但不要自己 fork。 H100 上 FA-3 比 FA-2 快 1.4 到 1.7 倍,零代码改动只需替换依赖(flash_attn 升级到 3.x)。唯一要确认的是 Hopper 架构兼容性(FA-3 要求 sm_90+)。如果跑 A100 或更早卡,保留 FA-2 即可,不要为了追新而牺牲稳定性。建议二:长序列 decode 必启用 Flash Decoding,阈值设为 1024。 阈值小于 1024 时 Flash Decoding 反而更慢,大于 1024 时收益单调递增。生产里把这个判断交给 runtime 自动决策,或者直接在模型 config 里硬编码阈值。建议三:CUDA Graph 优先于 Persistent Kernel,先把 launch overhead 吃掉。 CUDA Graph 的实施成本远低于 Persistent Kernel(不需要改 kernel 代码本身),且收益在 H100 上至少 5% 端到端加速。先把 CUDA Graph 跑到 stable,再考虑是否需要 Persistent Kernel。

建议四:建立 shape-aware 的 CUDA Graph 池,规避 shape 变化带来的失效。 不要试图用一个 graph 适应所有 shape,按 prompt length × batch size 划分 10 到 20 个典型 shape 预捕获,运行时选择最近的。命中率应保持在 95% 以上,低于 90% 说明 shape 划分不合理,需要重新聚类实际流量的 shape 分布。建议五:把 kernel 调度指标纳入 SLO 仪表盘。 不要只看 QPS / latency / TTFT 这些上层指标,要在 Grafana 上加 sm_active_percent(SM 活跃率)、tensor_pipe_util(Tensor Core 流水线利用率)、launch_overhead_us(每次 launch 平均开销)、graph_replay_rate(CUDA Graph 命中率)四个 GPU 层指标。当上层 QPS 下降时,这些底层指标能告诉你优化空间还剩多少。

这五条建议不是"按顺序做"的清单,而是一个优先级矩阵:建议一可以立即做(成本最低、收益最大),建议二必须做(否则长序列服务质量无法保证),建议三与建议四是中长期优化(需要 2 到 4 周工程投入),建议五是观测基建(贯穿全过程)。任何推理服务上线前,至少建议一与建议二必须完成——否则就是在拿用户的 latency 当实验品。建议三与建议四在 QPS 超过 50 之后强烈建议完成。建议五从 day-1 就应该建。

八、讨论:与推测解码、prefix cache 的协同

上面讨论的四个 kernel 工程与它们之外的两条优化线(推测解码、prefix cache)有深层的相互影响。推测解码(Speculative Decoding)把 decode 时延从"每 token 一次 kernel"变成"每 K token 一次验证 kernel + 一次 commit",主模型的 decode kernel 发射次数减少,但每次发射的 K 倍 token 让 attention kernel 的负载也 K 倍上升。这意味着 Flash Decoding 的阈值要重新调校:推测解码 K=4 时,序列长度的"等价 attention 负载"乘以 4,原本 1024 的 Flash Decoding 启动阈值要相应降低。Prefix cache 让同一段 prompt 多次复用 KV,但跨请求复用 KV 需要 kernel 重新 layout 内存(PagedAttention 的页表要更新),这个 layout 操作的 kernel 是新引入的——vLLM 的 block manager 里有一组专门的 copy_blocks kernel,它的性能直接影响 prefix cache 的命中率经济学。如果 prefix cache 的命中率是 30%,而 copy_blocks kernel 占整体时延 8%,那么为了 30% 的 cache 收益付出了额外的 kernel 成本,性价比需要重新评估。

推测解码、prefix cache、kernel 调度三者的关系本质上是"上层优化"与"下层优化"的耦合。上层优化通过改变 batch 形状、token 数量、memory layout 来提升吞吐量;下层优化通过减少 launch overhead、提升 SM 利用率来降低时延。两者不是简单的叠加,而是相互乘性放大——上层 2 倍 + 下层 1.5 倍 = 端到端 3 倍,但如果上层改变了形状让下层图捕获失效,那就只剩 2 倍。这是为什么kernel 调度工程必须与上层 batching 策略、prefix cache 策略协同设计——任何上层优化上线后,下层 kernel profile 都要重新跑一遍。这也是为什么很多团队花了 6 个月优化推测解码却收益甚微——他们没看到推测解码改变了 token 流的形状,让原本精心调过的 Flash Decoding 阈值不再最优。这是一个跨层耦合问题,需要 kernel 工程师与 inference 架构师定期对账(建议每月一次 review)。

最后一个值得讨论的是这套 kernel 工程栈的可移植性成本。FlashAttention-3 绑 H100,Persistent Kernel 与 CUDA Graph 在 AMD MI300 上的支持还在追赶,国产卡(如华为昇腾、寒武纪)的 kernel 抽象层与 CUDA 完全不同,把这套栈搬过去基本等于重写。对一个 multi-cloud 的推理服务团队,建议建立"硬件 profile 矩阵":每个 GPU 架构(Hopper / Blackwell / MI300 / 昇腾 910B)维护一组最优的 kernel 配置(FA 版本、Flash Decoding 阈值、CUDA Graph shape 池、persistent kernel 启用与否),部署时按目标硬件加载。这不是"未来要做的事",而是"现在就要做的事"——一旦单 GPU 推理服务在多硬件上铺开,profile 矩阵缺失会成为排障的噩梦。

九、给推理工程师的 kernel 调度清单

最后给一张可直接打印贴墙的清单,覆盖推理服务上线前必须验证的 GPU kernel 工程项。每条都带一个明确的"完成标准",避免清单变成"看起来做了"。

清单第 1 项:attention kernel 版本与硬件匹配。验证 FlashAttention-3 在目标 GPU 上跑通官方 example,确认 attention forward / backward 输出与 reference 实现误差在 1e-3 以内。完成标准:所有支持的 attention kernel 在 benchmark 集上跑出预期加速比(FA-3 / FA-2 ≥ 1.4,标准 attention / FA-2 ≤ 0.7)。

清单第 2 项:Flash Decoding 阈值实测。把 threshold 在 256 / 512 / 1024 / 2048 / 4096 五档下分别测 decode latency,画出"序列长度 × decode 时延"曲线,找出拐点。完成标准:所有生产流量的 P50 序列长度所在区间内,Flash Decoding 启用状态下 decode 时延比关闭状态低至少 30%。

清单第 3 项:CUDA Graph 形状池建立与命中率监控。采集生产流量 24 小时,按 prompt length × batch size 聚类,识别 top-20 shape,预捕获对应 graph。运行时监控 graph_replay_rate(命中率),持续低于 90% 时报警。完成标准:上线后 7 天内命中率 ≥ 95%,平均 launch overhead ≤ 3 微秒。

清单第 4 项:launch overhead 与 SM 利用率基线。用 Nsight Systems 抓一段生产流量,记录 kernel_launch_us_avg、sm_active_percent_avg、tensor_pipe_util_avg 三个数,作为 baseline。完成标准:baseline 数值归档,任何后续优化上线后对比基线,确认有可测量的提升(至少 5%)。

清单第 5 项:persistent kernel 试点(可选,仅在 batch 稳定且 QPS > 100 时启用)。先在 staging 环境把 attention kernel 改成 persistent 版本,跑 24 小时 soak test,确认无 timeout / error flag 异常。完成标准:staging 24 小时无 crash、latency P99 下降 ≥ 10%、profile 确认无 SM 闲置期。

清单第 6 项:与上层 batching / cache 协同 review。每月一次,与 inference 架构师 review 上层 batching 策略、prefix cache 策略对 kernel profile 的影响。完成标准:每次上层策略调整后,kernel profile 报告归档,确认无 regression。

清单第 7 项:硬件 profile 矩阵。为每个目标 GPU 架构(Hopper / Blackwell / MI300 / 昇腾 910B 等)维护一份独立的 kernel 配置与 benchmark 结果。完成标准:矩阵文档每周更新,新硬件接入有明确 checklist。

这七项构成了 2026 年 LLM 推理服务 GPU kernel 工程的"最低可行集合"。任何一项缺失,推理服务就会在某个量级(通常是 QPS 50 到 100 之间)出现性能拐点,拐点之后的所有优化都事倍功半。这张清单的真正意义不是"做完就万事大吉",而是"做完才能开始谈更上层的优化"——没有这七项作为底盘,去讨论推测解码、prefix cache、MoE 推理都是空中楼阁。

总结:2026 年的 GPU kernel 工程不再是"专家的玩具",而是 LLM 推理服务的工程基础设施。FlashAttention-3 把 warp specialization 引入 attention、Flash Decoding 把 decode attention 变可预测、CUDA Graph 把 launch overhead 压到 1 微秒、Persistent Kernel 把反复 launch 变长驻。这四件事叠在一起,让 LLM 推理服务从"靠 batching 与量化"升级为"靠 kernel 调度"。对任何负责 LLM 推理的团队,2026 年的工程优先级是把 kernel 调度工程从"性能优化项"提升到"平台基础设施项"。这不是因为 kernel 调度比上层优化更重要,而是因为上层优化的收益上限已经被 kernel 调度决定——没有扎实的 kernel 工程底盘,上层优化的所有努力都是戴着镣铐跳舞。本文给出的形式化框架、四条技术线的工程要点、五条实践建议与七项上线清单,是这套底盘的最小完备集。希望每一位读到这里的推理工程师,都能在自己的生产环境里把这份底盘建起来。

参考文献

  1. Tri Dao, Daniel Y. Fu, Stefano Ermon, et al. FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness. NeurIPS 2022.
  2. Tri Dao. FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning. arXiv:2307.08691, 2023.
  3. Jay Shah, Ganesh Bikshandi, Ying Zhang, et al. FlashAttention-3: Fast and Accurate Attention with Asynchrony and Low-precision. arXiv:2407.08608, 2024.
  4. Tri Dao. Flash Decoding: Fast and Memory-Efficient Inference for Long Context. GitHub / Dao-AILab blog, 2023.
  5. Woosuk Kwon, Zhuohan Li, Siyuan Zhuang, et al. Efficient Memory Management for Large Language Model Serving with PagedAttention. SOSP 2023.
  6. NVIDIA. CUDA Graph Capture and Replay Best Practices. NVIDIA Developer Blog, 2023.
  7. Andreas Klieg, Stephen Jones, et al. Persistent Kernels for LLM Inference: Reducing Launch Overhead at Scale. NVIDIA Technical Report, 2024.
  8. Yaniv Leviathan, Matan Kalman, Yossi Matias. Fast Inference from Transformers via Speculative Decoding. ICML 2023.
  9. Sharan Narang, Aakanksha Chowdhery, et al. Prefix Sharing for LLM Serving: Cache, Cost and Engineering Tradeoffs. Google Research Technical Report, 2024.
  10. NVIDIA. H100 Tensor Core GPU Architecture Whitepaper. 2022.
  11. AMD. MI300X Accelerator Architecture and LLM Inference Considerations. AMD Technical Report, 2024.
  12. PyTorch Foundation. CUDA Graph Integration in PyTorch 2.x: From Eager to GraphCapture. PyTorch Documentation, 2024.
  13. vLLM Project. vLLM v1 Architecture: Continuous Batching, PagedAttention and CUDA Graph Integration. vLLM Documentation, 2025.
  14. HuggingFace. Text Generation Inference (TGI) v3 Architecture: Speculative Decoding and CUDA Graph. HuggingFace Documentation, 2025.

一句话摘要:当 LLM 推理进入千亿参数、十万级上下文时代,FlashAttention-3 的 warp specialization、Flash Decoding 的并行规约、CUDA Graph 的图捕获与 Persistent Kernel 的指令持久化共同把 GPU kernel 调度从性能优化项提升为平台基础设施项,决定了上层 batching、prefix cache 与推测解码的收益上限。


⚠️ 本文所引 benchmark 数字均来自公开论文或社区实测,具体数值会随硬件版本(Hopper / Blackwell)与软件版本(FlashAttention v3.x、vLLM v1.x)变化。生产部署建议以官方文档与自家 staging 实测为准。

相关文章

  • LLM 推测解码的工程化 2026:从 Draft 到生产加速8月19日
  • LLM 推理的请求亲和性与 Prefix Cache 局部性调度工程 20268月18日
  • LLM 推理的拓扑感知调度工程 20268月17日

评论

加载评论中…

发表评论

返回文章列表