用途
Kernel Microbenchmark 是 vLLM 项目中的一项技能,用于构建、调试并解读 GPU 内核微基准测试,支持 CUDA、Triton 和 CuteDSL 编写的内核,并涉及 CUPTI 计时、正确性检查与生成代码分析。当既有测试框架噪声过大、无法清晰衡量单个内核算子性能时,可用它创建独立的复现或基准测试。
主要能力
- 隔离测量:在测量编译后内核前强制执行编译/自动调优;在正确性比较有意义时固定随机种子输入。
- 计时边界控制:只计时目标操作,排除分配、编译、随机输入生成、日志和主机—设备传输,除非这些本身就是研究对象。元数据设置、计划构建、内存分配、随机输入生成与日志均保留在计时区间之外。
- 指标选择:计算密集型内核报告 TFLOPS,内存密集型报告估算搬运字节数与 GB/s,混合型选择最诚实的指标并说明注意事项。TFLOPS 与内存带宽按操作的理论最佳值计算,而非按某一具体内核实现;例如内存带宽假定所有数据仅从全局内存读取一次。比较不同形状时优先使用吞吐指标作为主表列,延迟用于绝对成本。
- 结果校验:若结果超过预期峰值/SOL,先检查单位、FLOP/字节公式、是否跳过工作、稀疏性、缓存,以及基线是否在做相同操作。
- 可复现元数据:与基线对比并报告足以复现的元数据,包括 GPU、dtype、形状、命令、分支/提交和相关环境变量。
- 生成代码分析:将解释视为假设,直到有产物支撑,例如消融实验、生成的 PTX/SASS、分析器输出或受控基准。
默认基准设置
默认使用 FlashInfer CUPTI 计时,配合 CUDA graph 和冷 L2 缓存:from flashinfer.testing import bench_gpu_time_with_cupti。
多 GPU 基准
- 说明运行是本地还是多节点,报告 GPU 拓扑、world size、每节点 GPU 数、集合通信后端及相关库版本。
- 以同类 TP 配置对比;报告每 rank 与全局维度;未做显式归一化或扩展分析时,不比较不同 TP 规模的结果。
- 基准前先定义计时操作边界。若生产包装器含输入暂存、标志重置、生成屏障、填充或输出拷贝,端到端对比时应保留在计时区间内;仅内核计时用单独且明确标注的消融。
- 计时前先检查分布式正确性:按 rank 有意设定种子,以相同集合语义构造参考值,读取或比较输出前先同步。
- 每次测量重放前在设备端插入屏障,该通用同步放在计时区间之外,候选实现所需的屏障则保留在区间内。
- 使用 CUDA graph 时,捕获前先预热,跨 rank 协调捕获,缓存复用重要时轮转指针不同的图,并确保每个 rank 以相同顺序发出所有集合操作。
- 测量每个 rank 并以 MAX 归约每个样本,报告各样本最大值的 median。rank 本地的事件时间不等于分布式延迟。
- 每次调用前重置可复用的对称内存标志,并建立设备端 generation barrier 后才允许对端发出信号,否则快 rank 可能在慢 rank 重置标志前发出信号,造成到达丢失与间歇性死锁。
- 在完整测量生命周期内保留对称内存句柄、CUDA graph、流和图输出;在所有 rank 上以相同顺序和相同形状分配并对接对称缓冲区。
- 在证明非编译或内核性能问题前,将挂起和孤立的毫秒级离群值视为同步 bug 或 rank 偏斜;加入阶段标记、有界同步检查和每 rank 诊断。
- 多节点运行时记录调度器分配,验证 fabric 支持所需的多播或 NVLink 域假设;未经验证不要把两节点 TP 运行描述为等同本地 NVLink 域运行。
- 稳定 GPU 时钟或运行足够未计时工作达到稳态;交替候选顺序,使时钟、热和 rank 偏斜影响被共享。
使用方式与示例
- 使用
benchmarks/cupti_microbenchmark.py作为最小单 GPU FlashInfer CUPTI 计时模式。 - 使用
benchmarks/multi_gpu_gemm_rs.py作为最小分布式 CUDA graph 计时模式。 - 应调整操作、用例、工作公式和正确性容差,而非原样复制示例。
适用场景
适用于需要为 vLLM 或类似推理栈的 GPU 内核建立可信性能数据、进行基线对比、排查性能异常与同步问题的开发者与性能工程师。
限制
资料未提供具体平台兼容性、依赖版本要求、支持的 GPU 型号范围或额外安装步骤。