pping-lang 把你本来要开 Nsight Compute 才看得到的 kernel 级深度 (PC sampling / stall reason / SASS / 源码行)做成常驻、低开销、还附结论,而且懂 vLLM 语义。 旗舰能力 Autopilot(设计中)更进一步:不止诊断,还在沙盒里自动把 vLLM 调到最优。
Prometheus + Grafana 那套能把 vLLM 的指标全画出来,但落到「现在到底是什么瓶颈、该动哪个参数」时,要靠人脑补。这里有两个具体的坑:
GPU utilization 反映的是 SM duty cycle,不是吞吐量。LLM decode 阶段它常稳定在 70–90%,而 MFU 不足 5% —— 因为 memory-bound。只盯 utilization 数字,识别不出这类瓶颈。
规则触发、阈值告警、根因关联 —— 全要使用方自己实现。看到一堆曲线,离「该把 max_num_seqs 调大还是开 prefix caching」还隔着一整套领域知识。
pping-lang 把诊断拆成两层:规则名 = 测出来的客观事实(如「TPOT p99 超 SLA」),根因与优化建议作为署名推断单列。事实和猜测分开摆,你能判断该不该信。
Nsight 给你最深的证据,但要抓一段、离线看、还得自己是专家;Grafana 常驻实时,但看不到 kernel、也不下结论。pping-lang 把两边的好处合在一起 —— 常驻 + Nsight 级深度 + 直接给结论,而且懂 vLLM。
| 维度 | Nsight Systems / Compute | Grafana + Prometheus | pping-lang |
|---|---|---|---|
| 运行方式 | 抓一段 → 离线看报告 | 常驻、实时 | 常驻、实时(跑在 vLLM 进程里) |
| Kernel 级深度 | ✓ 极深 | ✗ | ✓ 同源 CUPTI · PC sampling / stall / SASS / 源码行 |
| 给结论 | ✗ 原始证据,自己读 | ✗ 曲线,自己判 | ✓ 事实 + 署名推断 + 处方 |
| 懂 vLLM 语义 | ✗ 只见 CUDA kernel | ~ 见指标不解释 | ✓ TTFT / TPOT / KV / batch / prefix / roofline |
| 开销 | 高(详细 profiling 串行化 kernel) | 低 | 低(~5% 预算,常驻) |
| 上手门槛 | 高(要懂 GPU 架构) | 中 | 低(直接给人话) |
| 生产常驻 | ✗ 一次性诊断 | ✓ | ✓ |
Nsight 是实验室显微镜 —— 偶尔抓一段、离线看、给原始证据;pping-lang 是常驻听诊器 —— 一直跑、说人话、还告诉你该调哪个旋钮。要对单个自定义 kernel 做穷尽式微架构调优,Nsight Compute 仍是那把专业手术刀;pping-lang 主打的是常驻、serving 级、结论驱动的那条线。
下面是把 502 个请求(并发 8、内置 mixed-short 数据集)打到 runw 上一台 RTX 5060 Ti 的 vLLM 0.21(Qwen2.5-0.5B)后,仪表盘四个标签页采到的真实数据。点标签切换。
perf_stats,故 MFU / padding ratio 显示为空,Roofline 自动切换 analytical 模式(绝对值约 ±20% 误差)。其余 KPI 不受影响。
3% 持续低于 50% 已 30s1.0 ≤ 1.0 已 30spping-vllm serve,经 CUPTI 注入做 PC Sampling)。下方为 runw RTX 5060 Ti(Blackwell)实采、单窗 826 万样本的真实热点。
| Kernel | 分类 | GPU 时间 | 最深热点 |
|---|---|---|---|
| cutlass wmma_bf16 16x16_128x1 | GEMM | 57.0% | ◆ SASS 0x11f0 · memory_dependency 77% |
| cutlass wmma_bf16 16x16_128x2 | GEMM | 33.5% | ◆ SASS 偏移级(闭源 cutlass) |
| flash_fwd_splitkv(FlashAttention) | Attention | 1.7% | ◆ SASS 偏移级(闭源 flash) |
| flashinfer RadixTopK(采样) | Sampling | 0.8% | ◆ SASS 偏移级(闭源 flashinfer) |
| at::native elementwise | Elementwise | 0.7% | ◆ SASS 偏移级 |
cutlass wmma_bf16 16x16 → tile 16×16 / bf16 / wmma tensorop / SM80。小 tile = 小矩阵、低并发 → 呼应 Roofline 的「增大 batch」结论。memory_dependency 71% = 在等显存 → 实锤 memory-bound。
mappable=false。这是物理事实,不是 bug。
| 指标 | p50 | p90 | p95 | p99 | mean | min | max |
|---|---|---|---|---|---|---|---|
| TTFT ms | 18.5 | 19.1 | 19.4 | 19.7 | 17.1 | 13.5 | 22.1 |
| TPOT ms | 4.89 | 4.95 | 4.97 | 5.02 | 4.90 | 4.68 | 5.12 |
| E2E ms | 636.8 | 644.6 | 648.1 | 654.6 | 560.6 | 47.8 | 659.9 |
一条命令起 pping-lang → 点「自动调优」→ Agent 在沙盒里迭代「诊断 → 改一个旋钮 → 压测 → Δ → 留下 / 回滚」→ 给出实测验证过的最优配置 + 全程推理。把 LLM 变成一个会看证据、自己动手、用压测打分的 LLM-serving 性能工程师。
三件套在同一进程。别人的 AI infra agent = 把 nvidia-smi 喂给 GPT 盲调;Autopilot = 诊断驱动(只动对症旋钮)→ 3–5 轮收敛,而非盲搜几十轮。每步改动必须 bench 验证才留下,LLM 无权声明压测没证实的收益。
设计前提:插件的任何异常都不得影响 vLLM 推理路径。所以热路径不做 I/O、不序列化、不等锁;实时面板直读内存 ring buffer,持久化是顺序追加 JSONL。
┌─── live 内存层(O(1) 写 / O(1) 读) │ ↑ ↑ record() ──push─┤ /api/kpis /api/metrics/recent ≤60s NVML 100ms ─────┤ /api/snapshot /api/roofline ≤60s │ /api/latency_trends ≤900s │ │ Sink._latest: name → (value, ts_ns) │ Sink._recent: name → 2000-deep ring │ └─── bg flush ─── JSONL append-log ─── archival 扫描 metrics / diagnoses
| 热路径开销项 | 实测 | 说明 |
|---|---|---|
push_metric() 单次 | < 5 μs | 纯入队,无 I/O |
record() 单次 | ≈ 100 μs | 含 collector 解析 |
| Sink bg flush 线程 CPU | < 1% | 独立 daemon 线程 |
| 常驻内存 | ≈ 6 MB | ring buffer 有界 |
12 项 KPI(TTFT/TPOT/吞吐/KV/队列/MFU/利用率/显存/Prefix/Padding/抢占),Roofline 散点带自动结论卡,TTFT/TPOT/E2E 多统计量时序。每项 hover 看公式与解读。
Nsight Compute 级的证据,常驻采集:每个 GPU kernel 的时间占比 + 算子分类 + 主导 stall。Triton kernel 直定位到 .py 源码行;闭源库给 SASS 热点 + kernel 名解码;闭源 GEMM 也能归因到调它的 nn.Linear。
13 条策展规则,「事实 + 署名推断 + 处方」三段式。阈值集中在一份 SLA 配置,仪表盘热加载,不重启 vLLM;可增删自定义规则,与策展规则同一引擎评估。
仪表盘直接发起 OpenAI 协议静态压测,配置 endpoint / 并发 / 时长 / prompt 来源,输出 client-side TTFT/TPOT/E2E 分布与 SLO 校验。三个内置数据集:短问答 / 长文档 / 代码。
不改任何 vLLM 参数,自动加载。需要 Kernel 级证据时,把 vllm serve 换成 pping-vllm serve 即可。
| vLLM | 状态 | Scheduler | Iteration | perf_stats |
|---|---|---|---|---|
| 0.20+ | 推荐 | ✓ | ✓ | ✓ |
| 0.13.x | 支持 | ✓ | ✓ | ✗ |
| < 0.13 | 不支持 | — | — | — |
perf_stats 是 MFU / 显存带宽利用 / 实测 Roofline 的数据源,仅 0.20+ 提供。缺失时 Roofline 切 analytical,其余功能不变。
| 代际 | 设备 |
|---|---|
| Blackwell | B200 · B100 |
| Hopper | H200 · H100 SXM/PCIe/NVL · A100 |
| Ada 数据中心 | L40S · L40 · L4 |
| Ada 桌面/移动 | RTX 4090 … 4060 · 5060 Ti |
| 旧代 | A30 · A10G · A10 · V100 · T4 · RTX 3090 |
未识别的 GPU 不影响指标采集,仅跳过依赖峰值的派生量。Linux 原生支持;Windows 经 WSL2 + Ubuntu。
吞吐-under-SLA 目标 + Autopilot UI,runw 上从朴素基线跑出 ×2~3。不碰源码、不碰生产。前置:基线记分牌。
多旋钮 / 多目标 / 去噪 / promote-to-prod;M2 用 PC sampling 给 kernel / 源码级建议(仅建议,不自动改)。
TP/PP/EP 通信维度;每次调优攒「诊断→动作→压测Δ」轨迹 → 学策略,趋近「看一眼直接给最优配置」。
dashboard + 规则引擎 + bench。目标场景:单机本地开发、单卡 / 单 Pod 部署。
Docker 镜像、Helm chart、K8s 多副本指标聚合。面向生产侧部署。
基于已有 Prometheus / Tempo 后端的诊断,复用现有可观测栈。