从零实现 LLM Inference:045. Streaming TTFT 拆解(Queue wait vs Prefill)
TTFT 只是一个总数:里面既有排队等待,也有 prefill 的真实计算。只看 TTFT 很容易把优化方向搞反。给 SchedulerManager 记录 admit timestamp,并在 benchmark_streaming 里打印 TTFT breakdown。
TTFT 只是一个总数:里面既有排队等待,也有 prefill 的真实计算。只看 TTFT 很容易把优化方向搞反。给 SchedulerManager 记录 admit timestamp,并在 benchmark_streaming 里打印 TTFT breakdown。
paged-attn / CUDA Graph 的第一次请求会把 Triton JIT 和 graph capture 算进 TTFT/吞吐,导致对比结论失真。给 benchmark_streaming 加 warmup-runs + repeat-runs,把冷启动和稳态拆开。
streaming 场景想看 TTFT/TPOT/ITL 的 p99,但之前不好一条命令切换 decode 的快路径,也不好给 nsys 挂 NVTX。补齐 benchmark 的三个开关。
decode 每层都要把 (k,v) 写进 KV cache。原来是 index_select + index_put 四连。先用一个 Triton kernel fuse 成一次写入,并加上 batch size gate,避免小 batch 退化。
decode 已经很快了但还不够?很多时候慢在 sampling:每步 B 次 .item() 会把 GPU pipeline 打散。把采样做成 batch,一步只同步一次。