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

91 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 与测试前逐字一致。
## 后续长上下文容量边界
[64K / 128K / 接近 262K 测试](context262k-results.md)发现:两组均通过 64K/128K 的有限检索,
接近 260K 时两组均发生主机 OOM(图版本请求中断)。此前短上下文通过不能外推为满长稳定。