GPU 推理调优经验

调优经验

核心还是打实际的 Profile 数据,耗时和显存都是。

意识到问题,合理选择 AI 的方案就行。

显存相关

动态分配显存的 fragmentation 问题比较严重,尽量还是用手写 Pool 的方案,更稳定。

CUDA graph

关于动态 shape(主要是不同 batch_size),一般是采用捕获多个 graph,共享预分配显存池,然后请求做 Padding。

由于现代硬件关于 zero padding 有稀疏算力处理,所以性能退化不严重。

捕获的时候会定死执行路径(分支,循环步数之类的),重放的时候必须一致。

速度相关

基本方案

  • CUDA graph + torch.compile
  • 攒调度的 Batch,通常 Batch 越大平均开销越低。

进阶方案

  • 找找有没有 CPU bound 之类的优化掉,比如零碎的拼接操作,显存分配等。

正确性相关

一定要建立自动化的简单 benchmark,建立好 baseline 之后再开始优化。

工作交接相关

AI 改的代码 commit 的时候需要人类读核心 diff 并理解,利于交接。

核心路径需要减少分支,降低人类阅读的心智负担。

似乎可以考虑让 AI 审查核心 diff

AI 使用相关

1M 的 context 上下文退化比较严重,可以让它生成交接报告,新的 chat 可以获取新的洞见。

Future Exploration

  • 为什么有 Batch 总耗时还是会增长。
  • 如何评估理论算力和实际耗时的差距。