93 lines
5.2 KiB
Markdown
93 lines
5.2 KiB
Markdown
# CUDA Graph 2048 输出预算复测(2026-09-17)
|
||
|
||
> 历史实验记录:保留当时的配置和恢复状态。当前部署已改为 128K eager 基线,见 [当前状态](README.md)。
|
||
|
||
结论: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(图版本请求中断)。此前短上下文通过不能外推为满长稳定。
|