3.6 KiB
优化实验方法
固定模型 revision、原始权重、MTP=2、BF16 KV、262144 上下文上限和 GPU memory=0.80。 按 eager 基线 → piecewise CUDA Graph 实验 → eager+前缀缓存逐项比较,不把多项改动的收益混在一起。 候选未通过启动、基准和 smoke test 前不作为默认配置。
scripts/benchmark.py --label <name> 在服务容器内运行,使用挂载的 API Key;
输出只包含固定合成问题的回答和计时,不打印密钥或用户数据。
- 预热算术题;3 次固定中文说明;简单代码题。
- 2 和 4 并发的中文说明请求。
- 约 8K / 32K token 的固定伪随机档案,检索中间插入的口令,各重复一次。
- 记录真实 prompt/completion token 数、流式 TTFT、正文首字时间、完成耗时、结束原因。
- 读取 prefix_cache_queries_total / hits_total 的增量,避免仅凭响应变快判断缓存成功。
TTFT 指包含 reasoning 在内的第一个非空 token;正文首字时间另记。 近似 decode tokens/s = (completion_tokens-1)/(最后一块输出时间-第一块输出时间), 受 SSE 合并和 speculative 多 token 提交影响,不等于 GPU 内核吞吐。 并发总吞吐采用所有 completion tokens / 该组请求的墙钟时间(包含 prefill)。
cold 标签只代表该轮首次提交,未清空 OS 页缓存,也不保证跨任务没有共享前缀。
因此长输入第一次与重复请求的差异,应结合 prefix hit 计数解释。
温度 0 + seed 固定仍可能有非确定性;完整输出 hash 包含思考过程,hash 不同不自动意味着答案错误。
口令题必须包含期望口令且正常 stop;通用中文题只检查非空,质量需人工审查。
代码题的简单检查仅是 smoke check,不代替完整代码能力测评。
每个候选均保留独立结果。小样本只支持配置选择,不承诺长期性能、全长 262K 或全部任务质量。
当前固定 nightly 在 Qwen4Exp 上选择 runtime breakable CUDA Graph。 单纯设置 splitting_ops 不会拦截自定义 PLE 查表,首次实验在捕获阶段失败。 适配层随后在注册查表 custom op 时使用原生 eager_break_during_capture 装饰器, 并显式设置 VLLM_USE_BREAKABLE_CUDAGRAPH=1。调用者提供固定输出缓冲区,查表原地写入。 小型 GPU 测试验证捕获后 3 组不同输入的重放结果逐字节一致。 这条优化路径应称为 CUDA Graph 加速,不能直接声称启用了 torch.compile/Inductor 融合。
第二轮图捕获发现索引缓冲区在 capture-time 尚未由前置 GPU kernel 填充,
即使 CPU 查表本身是 eager break,也会读到未初始化的索引。
最终候选将原生哈希计算与 mmap 查表合并为 vllm::spark_ple_lookup,
整个操作由 eager-break 包裹,输出保持原地写入。GPU 测试增加了哈希不在捕获中执行的断言,
并检查后续图内浮点计算在更换输入后仍正确。
图执行候选最终成功启动,但在 32K 重复请求上耗尽 256 个输出 token,未完成完整验收。 这不是已证实的图执行正确性缺陷。由于单流收益仅约 4.3%,没有继续重载该候选; 转为 eager + 前缀缓存的独立实验。长输入预算提高为 1024,并先对 eager 基线重新测试。 图执行实现和独立构建说明保存在 experiments/graph,默认适配层保留原已验证实现。
后续 2048 预算复测
上述 CUDA Graph 未完成验收是首次实验的状态。后续 graph+前缀缓存组合已通过三轮复测, 短回答中位速度提升约 4.4%,默认仍保留 eager。详见 复测报告。