推理引擎算子融合与 kernel 调优降本落地

日期:2026-09-07

一、项目背景

某业务推理量大且延迟敏感,白天高峰一波接一波。原推理框架用的是默认配置,GPU 利用率死活起不来,同样的卡,友商能跑更高吞吐,我们却早早被算力和账单压住。一开始大家都盯着模型层面,换更小的模型、调批大小,效果有但不解渴。

我们进场做性能剖析时才发现,瓶颈根本不在模型,在引擎层。大量的小算子各自 Launch,kernel launch 开销和显存搬运吃掉了一大半有效算力,GPU 大部分时间在等数据而不是算数据。模型再怎么调,底层这层不优化,吞吐也上不去。

二、落地场景

我们做的第一件事是算子融合,把相邻的逐元素、归一化、激活等小算子合并成一个大 kernel,减少 launch 次数和中间显存读写。算子融合是第一段,优先融合计算密度高、访存密集的相邻算子。kernel 重排与精度对齐是第二段,调整 kernel 执行顺序让显存访问更连续,同时校验融合后数值和原生一致,不引入精度回归。批处理窗口调优放第三段,把请求聚批的窗口调到延迟和吞吐的甜点。显存复用兜底,中间张量复用缓冲区,少申请少释放。

案例片段(已脱敏): 算子融合与 kernel 调优配置片段(示意):fusion:  fuse_elemwise: true  fuse_norm_act: true  precision_check: strict kernel:  reorder_for_coalesce: true batch_window_ms: 8 mem_reuse: true上线后单卡吞吐提升约 22%,P99 延迟反而降约 15%,GPU 利用率从约 55% 提到约 80%,单位推理成本下降约两成。

三、关键技术挑战与解决思路

第一个坑是融合后精度漂移。合并算子改变了计算顺序,浮点累加误差可能放大,某些敏感任务输出变了。我们做法是 strict 精度对齐,融合版和原生版跑同一批样本比对,差异超阈值就回退该融合项,不为了性能牺牲正确性。这一步比堆融合项重要,因为上线后输出悄悄变了的后果比慢更糟。

第二个难点是延迟和吞吐的权衡。批窗口拉大吞吐高但首字延迟涨,拉小反之。我们没有一刀切,按业务分两档:对延迟极敏感的交互类用短窗口,对吞吐敏感的后台批处理用长窗口,各自调优。这里有个取舍,要不要为每类业务单独维护配置,我们判断值得,因为两类诉求本来就冲突。

第三个点是显存复用引入的隐蔽 bug。缓冲复用如果生命周期没管好,会出现上一次的中间结果污染下一次。我们加了边界检查和隔离,复用只在确定无依赖的相邻算子间做,不贪多。

四、效果数据

单卡吞吐提升约 22%,P99 延迟降约 15%,GPU 利用率约 80%,单位推理成本下降约两成。同样的业务量,需要的卡少了,账单直接下来。我们复盘时有个意外:延迟降了之后,上游因为等待变短,把批大小也调大了,又叠了一层吞吐收益,是正向连锁。(数据均为脱敏示意值)

成本侧把优化数据接进了容量规划。每张卡的真实产能清楚了,扩容决策从感觉不够变成按吞吐算。我们也沉淀了一套融合和 kernel 调优的检查清单,新模型上线前先过一遍,避免重复踩坑。精度对齐的自动化脚本后来被多个团队复用,成了推理上线的标配门禁。

五、可复用经验总结

推理降本最容易被忽视的是引擎层,大家都去调模型、调批大小,没人看算子有没有融合,光做融合和 kernel 重排,同样延迟下吞吐提两成,成本直接下来。融合后必须 strict 精度对齐,输出悄悄变比慢更可怕。延迟和吞吐别一刀切,按业务分档调窗口。我后来判断,性能优化的第一现场永远是剖析数据,没做 profiling 就动手调模型,多半是在错误的方向上发力。

结语

我们后来把这套调优流程做成了上线前的标准动作,新模型不是训完就上,而是先过一轮 profiling,看算子融合和 kernel 有没有空间,有就调,没有就记录为什么没有,避免每次都从零分析。还有一个之前没充分想的,是不同批大小下的最优配置不一样,小批量和大批量的融合策略要分开调,我们建了配置矩阵按场景选。性能这事儿,最怕的是凭感觉,一旦有了 profiling 数据和调优清单,优化就从玄学变成了工程,可复制、可复盘。我们也吃过过度融合的亏,有一版为了吞吐把不该融的也融了,数值虽然过了 strict 校验,但边缘 case 出了零星异常,后来加了一个分层校验才稳。往后看,推理降本的战场会越来越多在引擎和编译层,模型层面红利在收窄,谁先把这层吃透,谁的单位成本就低一截,这是后面要持续投入的方向。这层优化不性感,但每一分吞吐都是真金白银,我们也在把 kernel 调优的经验沉淀成内部基准,新同学照着跑就能复现,不再依赖个别老手的直觉。

我们也开始把调优经验写成内部文档,新模型接入照着跑一遍就能拿到 baseline,不再每次从零摸索。性能文化这件事,靠一个人厉害没用,靠一套可复制的动作才有用,这也是我们把 profiling 固化进流程的初衷。现在我们新人入职第一周就要过一遍这份清单,传承比个人英雄重要。