Files
qwen38-flash-next-dgx-spark/docs/cuda-graph-retest.md

5.2 KiB
Raw Permalink Blame History

CUDA Graph 2048 输出预算复测(2026-09-17

历史实验记录:保留当时的配置和恢复状态。当前部署已改为 128K eager 基线,见 当前状态

结论: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
  • 从当前稳定镜像重建同样适配:
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 与测试前逐字一致。

后续长上下文容量边界

64K / 128K / 接近 262K 测试发现:两组均通过 64K/128K 的有限检索, 接近 260K 时两组均发生主机 OOM(图版本请求中断)。此前短上下文通过不能外推为满长稳定。