2026-06-28
注:本repo对于参赛毫无价值,请使用Spec Decode,对着TextVQA炼丹吧
本项目面向视觉语言模型(VLM)的高效推理优化,目标是在不改变模型架构、不依赖外部服务、不引入额外第三方包的前提下,降低端到端推理时延并提升生成阶段的执行效率。针对 VLM 推理链路长、跨模态模块多、prefill 与 decode 阶段热点差异明显的特点,我们将优化重点放在 kernel 融合、缓存复用、控制流压缩和运行时接管上。
VLM 推理优化通常包含三个层面:
- 框架层优化:减少 Python 热路径中的调度和对象构造开销
- 算子层优化:对高频热点算子做融合或替换,减少中间张量与 launch 开销
- 运行时优化:通过静态缓存、图捕获和 C++ runtime 接管稳定路径
本项目的实现思路与常见高性能推理系统一致,即尽量减少小 kernel 碎片、降低 host 参与度,并在满足比赛约束的前提下使用 Triton、自定义 CUDA/C++ 扩展和 C++ runtime 完成优化。
优化实现主要分布在以下三个位置:
evaluation_wrapper.pycpp_runtimekernels/
三部分的职责划分如下:
evaluation_wrapper.py负责模型加载、运行时开关管理、monkey patch 与主推理流程装配kernels/提供自定义 Triton/CUDA kernel,用于替换热点算子cpp_runtime/提供 C++ runtime bridge,用于承接部分 prefill 热路径和运行时控制逻辑
evaluation_wrapper.py 中的核心工作是把热点路径上的默认实现替换为更轻量的执行方案,并将多个优化统一纳入同一套环境变量和运行时控制逻辑中。主要优化包括:
- 启用 fp16 prefill / decode 优化路径
- 为视觉 prefill 中间结果建立 cache,减少重复构造
- 对 connector 路径的 scatter 和索引逻辑做快路径处理
- 对 text prefill mask 构造做快路径处理
- 对 decode 阶段的 rope、position advance、kv update 等高频小操作做融合
- 对 prefill 阶段仅保留必要 logits,减少无用输出张量
- 启用 CUDA Graph,用于压缩稳定 decode 路径中的调度开销
这一层的目标是减少高层框架开销,把原本分散的小操作尽可能组合为更稳定、可复用的执行流程。
kernels/ 中主要实现了多类热点算子的融合与替换,重点围绕以下路径展开:
- fused decode rmsnorm + rope
- fused kv update
- fused prefill qk + rope + kv update
- fused RMSNorm
- fused add + RMSNorm
- fused interlayer add + RMSNorm
- fused MLP SwiGLU
- fused vision rotary
- fused vision add + layernorm
- fused text deepstack
这些 kernel 的共同目标是:
- 减少 kernel launch 次数
- 减少中间张量落地
- 降低显存读写次数
- 压缩 decode 和 prefill 中的高频 elementwise / 小粒度计算开销
在实现上,项目优先使用当前环境中已有的 Triton 与自定义 CUDA/C++ 扩展能力,而不是引入额外外部库。
cpp_runtime/ 的主要作用是把部分原本由 Python 驱动的 prefill 热路径下沉到 C++ 侧,减少 Python 调度参与度。当前这部分工作主要包括:
- 提供 C++ runtime bridge 并在 Python 侧统一加载
- 为 prefill 文本路径提供 C++ runtime stub
- 通过预编译
.so或按需在线重编译的方式加载 runtime - 将稳定且结构固定的 prefill 侧逻辑交给 C++ 运行时执行
这一层的核心目标不是更换模型算子语义,而是减少高层控制流和运行时管理造成的额外开销。
在运行时加载策略上,默认行为为优先加载已经存在的 .so 文件;如果产物缺失,会从源码自动编译一次。显式设置 AICAS_CPP_RUNTIME_FORCE_REBUILD=1 时会忽略已有产物并强制重编译。该设计用于区分开发态与提交态:本地开发可以强制重编译验证最新修改,提交环境优先走预编译产物,缺失时也不会直接因为 .so 不存在而失败。
项目通过 run.sh 启动 benchmark,运行环境使用 CUDA 单卡推理,核心依赖由 requirements.txt 管理。模型加载、kernel patch、CUDA Graph 和 C++ runtime bridge 的启用逻辑均由 evaluation_wrapper.py 统一控制。本地执行 run.sh 时可以通过环境变量控制 C++ runtime 是否重编译;提交时不依赖 run.sh,默认优先加载预编译 .so,必要时自动编译。
本项目围绕 evaluation_wrapper.py、kernels/ 和 cpp_runtime/ 三个层面构建了一套面向 VLM 推理的软硬件协同优化方案。方案的核心思路是:
- 用 kernel 融合解决高频小算子碎片化问题
- 用缓存和快路径减少 prefill 阶段的重复工作
- 用 CUDA Graph 与 C++ runtime 压缩运行时调度成本