# CUDA Graph 2048 输出预算复测(2026-09-17) 结论:CUDA Graph + 前缀缓存通过本轮三次完整基准及前缀正确性、工具调用检查。 长输入未再发生输出预算截断,短回答生成速度中位数约提升 4.4%。 本次按复测范围执行,默认部署仍保留 eager + 前缀缓存。 ## 条件与方法 - 模型、基础 nightly、权重、BF16 KV、MTP=2、262K 上限及并发参数与前次一致。 - 两组均启用前缀缓存和相同的两处 Mamba 块对齐修正。 - eager 镜像:`local/qwen38-flash-spark:prefix-eager-0bfc7a15`。 - graph 镜像:`local/qwen38-flash-spark:prefix2-0bfc7a15`,即原 graph2 适配加相同 Mamba 修正。 - 长输入 `max_tokens=2048`,短输入保持 512;均为 temperature=0、seed=42、reasoning_effort=low。 2048 是思考与正文共用预算,没有另行提高 reasoning_effort,也没有另设思考 token 限额。 - eager、graph 各连续运行三轮。每轮包含 3 次短回答、代码、2/4 并发、8K/32K 首次及重复检索。 - 两组均从新加载的服务开始完整三轮;轮间不清缓存,`cold` 只是脚本标签,后两轮实际可命中缓存。 - 未清 OS 页缓存,执行次序没有随机化;本轮是小样本功能与性能复测,不是统计显著性或长稳测评。 与最初 graph2 实验不同,本轮启用了前缀缓存。因此本轮证明的是当前组合通过测试, 不能单独证明原先无缓存版本的失败必然只由 256 预算引起。 ## 结果 短回答汇总各组 9 次的中位数;并发吞吐取三轮中位数。 | 指标 | eager + 前缀缓存 | CUDA Graph + 前缀缓存 | |---|---:|---:| | 短回答生成速度(近似 tokens/s) | 30.032 | 31.361 | | 短回答首 token(秒,含思考) | 0.2784 | 0.2780 | | 2 路并发总吞吐(tokens/s) | 43.186 | 47.428 | | 4 路并发总吞吐(tokens/s) | 67.547 | 71.773 | | 长检索正确数 | 11 / 12 | 12 / 12 | | 长检索预算截断数 | 0 / 12 | 0 / 12 | | 长检索最大输出 tokens | 619 | 504 | | 长检索最大思考 tokens | 609 | 467 | | 前缀复用专项正确数 | 4 / 4 | 4 / 4 | | 专项实际 prefix hit 增量 | 24000 | 24000 | | 算术、中文、工具调用 smoke | 通过 | 通过 | 图版本三轮 32K 首次/重复检索共 6 次全部正确并正常 stop;本次无需继续提高至 4096。 图捕获日志确认 breakable graph 已启用,两次捕获分别占约 0.39 / 0.17 GiB。 没有发生捕获失败、服务崩溃或 OOM。 整体生成速度略快,但短请求 TTFT 基本不变。长回答仍受思考长度影响,不能承诺完整耗时等比例下降。 图组比 eager 多答对一次不足以证明图执行提升模型质量。 ## 失败样本也保留 最初在已运行的 eager 服务上开始测试,8K 首次检索输出 495 tokens 后正常 stop, 却将档案中的口令视为注入文本而拒绝采信;这不是预算截断。 原脚本遇错即停,触发恢复。该次部分结果保存在 `results/retest-2048/initial-eager-aborted.jsonl`, 不混入后续完整三轮汇总。 随后改为记录每条失败并继续完成用例,在重新加载后的 eager 第一轮, 同一道 8K 首次检索再次答错(379 tokens、正常 stop);该失败计入 11/12。 其余 eager 长检索以及全部 graph 长检索通过。暂不能确定这类回答波动的具体原因。 实际复测脚本保存在 `experiments/graph/benchmark-record-all-2048.py`。 其中 `BENCHMARK_COMPLETED` 仅表示执行到末尾,绝不代表全部通过;正确性须看逐条记录。 通用 `scripts/benchmark.py` 已加入 `--continue-on-answer-failure`:继续收集后仍会以非零退出码报告失败。 并发输出增加锁,避免 JSON 对象写入同一行。归档的六份完整结果仅规范化为一条 JSON 一行,字段不变。 ## 复现与边界 - 数据:`docs/results/retest-2048/`。 - 图与前缀缓存组合:`experiments/graph/compose.prefix.yaml`。 - 从当前稳定镜像重建同样适配: ```bash docker build -f experiments/graph/Dockerfile.prefix -t local/qwen38-flash-spark:prefix2-0bfc7a15 . docker compose -f compose.yaml -f experiments/graph/compose.prefix.yaml up -d # 等待服务健康,再执行,遇答案失败时仍收集余下用例: docker exec -i qwen38-flash-vllm python3 -u - --label graph-2048 --long-max-tokens 2048 --continue-on-answer-failure < scripts/benchmark.py ./scripts/test-prefix.sh ./scripts/test.sh # 恢复默认 eager 配置: docker compose -f compose.yaml up -d ``` 未验证完整 262K 输入、长期压力或多模态。本轮结果不改变这些边界。 ## 结束状态 测试后已恢复 `prefix-eager-0bfc7a15`,容器 healthy,重启策略 `unless-stopped`。 恢复后的算术、中文、工具调用 smoke test 全部通过;默认 Compose 与测试前逐字一致。