2026-07-08 02:17:13 +00:00

168 lines
7.7 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.

# vllm-dspark Benchmark 结果评估
> 对应结果:`/data/user1/yy/bench_results/dspark_grid_20260707-132641`
> 运行时间2026-07-07
> 硬件8× NVIDIA H200 143GB
> 模型:`/data/models/DeepSeek-V4-Flash-DSpark`
> 服务配置TP=8FP8 KV cache`--spec-method dspark --spec-tokens 5`block-size=256max-num-seqs=256
> 压测工具:`sglang.bench_serving --backend vllm`
---
## 1. 总体结论
本次 grid 测试覆盖了从轻量 chat 到超长上下文、从重 decode 到高并发压测的多种场景。整体上看:
- **DSpark 在短输入、中高并发场景下表现优秀**`chat_short` 在并发 64 时达到约 9580 tok/s`stress_standard` 在并发 128 时达到约 17465 tok/s。
- **低并发下 DSpark 的 draft 开销明显**,部分场景单并发延迟和吞吐都不如预期。
- **超长上下文场景存在明显的吞吐拐点**`long_rag`32K 输入)在并发 4 达到峰值后,并发 8 吞吐腰斩。
- **延迟长尾P95/P99普遍较重**,提示调度、内存或投机解码验证阶段存在抖动。
---
## 2. 异常点分析
### 2.1 低并发c=1下 DSpark 收益被开销吃掉
`chat_standard`input=1000, output=256为例
| 并发 | req/s | mean E2E(ms) | P99 E2E(ms) | mean TTFT(ms) | P99 TTFT(ms) |
|---|---:|---:|---:|---:|---:|
| 1 | 0.49 | 2040.65 | 10715.53 | 1412.48 | 8430.71 |
| 8 | 4.35 | 1819.35 | 15165.63 | 327.62 | 4404.92 |
| 16 | 8.32 | 1885.15 | 10491.31 | 443.50 | 8567.07 |
| 32 | 10.00 | 3156.73 | 12936.08 | 560.77 | 7129.66 |
- **单并发吞吐仅 0.49 req/s**,远低于无投机基线可预期的水平。
- **P99 TTFT 高达 8.4s**,说明单请求首次预填充极不稳定,可能是 draft 验证/编译缓存未命中或 warmup 不充分导致。
- 并发提升到 8 后TTFT 均值下降到 327ms说明 DSpark 的 draft 计算需要 batch 才能摊薄。
**判断**:这是 DSpark 的典型特征——低并发下 draft 固定开销无法被摊薄,导致延迟尾和单请求吞吐都较差。
### 2.2 超长上下文出现吞吐断崖
`long_rag`input=32000, output=512
| 并发 | Total tok/s | mean TTFT(ms) | P99 TTFT(ms) |
|---|---:|---:|---:|
| 1 | 16104.98 | 549.72 | 1163.96 |
| 2 | 43215.62 | 192.57 | 409.32 |
| 4 | **70040.54** | 191.57 | 427.69 |
| 8 | 34141.70↓51% | 930.98 | 2742.48 |
`long_context_probe`input=16000, output=512也有类似模式
| 并发 | Total tok/s | mean TTFT(ms) |
|---|---:|---:|
| 1 | 11051.09 | 316.59 |
| 2 | 26862.06 | 110.65 |
| 4 | 43042.77 | 127.38 |
| 8 | 29255.46↓32% | 453.93 |
| 16 | 43292.68 | 444.14 |
**判断**
- 32K/16K 长 prefill 在并发 4 时达到最佳,继续加并发反而下降,可能与 **KV cache 显存带宽瓶颈**、**prefill 阶段 scheduling 阻塞** 或 **hybrid KV cache manager 的换入换出** 有关。
- `long_rag` 在 c=8 时 P99 TTFT 暴涨到 2.7s,进一步印证内存/调度压力。
### 2.3 延迟长尾普遍偏重
几乎所有场景的 P99 E2E 都是 mean E2E 的 2~4 倍:
| 场景 | 并发 | mean E2E | P99 E2E | 倍数 |
|---|---:|---:|---:|---:|
| chat_standard | 32 | 3156.73 | 12936.08 | 4.1× |
| generation_standard | 32 | 2908.89 | 6938.03 | 2.4× |
| summarization | 32 | 5587.21 | 14541.75 | 2.6× |
| decode_heavy | 32 | 5562.57 | 12822.35 | 2.3× |
| stress_standard | 128 | 4417.43 | 14850.43 | 3.4× |
**判断**:投机解码的 draft 验证失败会导致 fall back 到逐个 target 前向,造成明显的延迟毛刺;另外 vLLM v1 引擎的 scheduling 在高并发下也可能产生队列等待。
### 2.4 高并发下 TPOT/ITL 增长较快
`stress_standard`input=1000, output=256
| 并发 | mean TPOT | P95 TPOT | P99 TPOT | mean ITL |
|---|---:|---:|---:|---:|
| 96 | 29.46 | 67.30 | 123.42 | 113.64 |
| 128 | 35.20 | 76.85 | 141.17 | 136.57 |
TPOT 从 29ms 升到 35msP99 超过 140ms说明 decode 阶段在极限并发下已经接近饱和。
---
## 3. 可重点优化的方向
### 3.1 按并发动态调整 `--spec-tokens`
参考历史对比数据(`dsv4_inference_comparison_report.md`
| spec-tokens | 低并发c=1 | 高并发c=64 |
|---|---|---|
| 3 | 1.03 req/s, 254 tok/s | **14.53 req/s, 3507 tok/s** |
| 5 | **1.07 req/s, 257 tok/s** | 9.36 req/s, 2210 tok/s |
| 7 | 1.03 req/s, 251 tok/s | 9.13 req/s, 2218 tok/s |
当前部署固定使用 `--spec-tokens 5`
- 对低并发c=1~16相对友好
- 对高并发c≥64不是最优st=3 在高并发下接受率更高、验证开销更小。
**建议**
- 高并发服务场景:改用 `--spec-tokens 3`
- 若负载混合,可考虑不同 endpoint/队列按并发分桶,或测试 st=3/st=5 在本 grid 下的完整表现。
### 3.2 长上下文场景优化
针对 `long_rag`32K`long_context_probe`16K的吞吐断崖
1. **KV cache dtype 对比测试**:当前是 FP8可测试 BF16 是否改善长上下文稳定性和吞吐。
2. **block-size 调整**:当前 256可尝试 128 或 64 看是否减少内存碎片。
3. **hybrid KV cache manager**:当前 `--no-disable-hybrid-kv-cache-manager`,可对比关闭后的表现。
4. **限制长上下文并发**:若业务允许,对 32K 输入设置更低的 `max-num-seqs` 或独立队列,避免 c=8 后的内存带宽瓶颈。
5. **attention backend**:可测试 `FLASHINFER_MLA_SPARSE_DSV4`(脚本 `start_dsv4_dspark_8card_flashinfer.sh`)在长上下文下的表现。
### 3.3 降低延迟长尾
1. **增加 warmup**:当前仅 10 条 warmup。DSpark 的 JIT 编译/算子 warmup 在首次运行时较重,建议增加到 50~100 条或先跑一轮 discard。
2. **compilation cache 持久化**:确认 `TORCH_EXTENSIONS_DIR``VLLM_CACHE_ROOT` 等环境变量已设置并复用,避免每次重启重新编译 deep_gemm/tilelang。
3. **调度参数**:尝试调整 `--max-num-batched-tokens``--max-num-seqs`、chunked prefill 相关参数,减少队列等待。
4. **P99 TTFT 抖动**:高并发下 P99 TTFT 高通常与 prefill batching 有关,可尝试限制 prefill 阶段 batch 大小或启用 prompt chunked prefill。
### 3.4 低并发场景是否需要 DSpark
对于 `chat_standard` c=1
- 当前 0.49 req/s、P99 E2E 10.7s 的服务质量较差。
- 若业务存在大量单用户/低并发请求,可考虑:
- 部署无投机基线 vLLM 专门服务低并发流量;
- 或设置最小 batch 阈值,累积少量请求后再用 DSpark 处理。
### 3.5 对比 baseline 与 SGLang
本次测试只有 DSpark 单一配置,建议补充:
1. **vLLM-dspark 无投机基线**:用同样的 `sglang.bench_serving --backend vllm` 测一遍相同 grid计算真实加速比。
2. **SGLang EAGLE**:在相同 grid 下复测,验证 DSpark 在不同场景下的相对优势。
3. **不同 `--spec-tokens` 的完整 grid**st=3 和 st=5 各跑一遍,绘制并发-吞吐曲线。
---
## 4. 推荐下一步实验
| 优先级 | 实验 | 预期收益 |
|---|---|---|
| P0 | 高并发改用 `--spec-tokens 3` | 提升 c≥64 场景吞吐 20~50% |
| P0 | 长上下文16K/32K对比 BF16 KV cache | 改善吞吐断崖和 P99 TTFT |
| P1 | 增加 warmup / 预热缓存 | 降低 P99 TTFT 和首请求延迟 |
| P1 | 测试 `FLASHINFER_MLA_SPARSE_DSV4` backend | 可能提升长上下文吞吐 |
| P2 | 跑无投机基线 grid | 获得真实加速比 |
| P2 | 对比 st=3/st=5 完整曲线 | 找到最佳投机长度配置 |
---
## 5. 结论
当前 DSpark 部署在 **短输入、中高并发** 场景下已经展现出明显优势,但在 **低并发****超长上下文** 场景下存在明显短板。最优先的优化是:
1. 高并发服务改用 `--spec-tokens 3`
2. 针对 16K/32K 长上下文做 KV cache dtype 和 attention backend 的调优;
3. 补充 baseline 测试,量化 DSpark 的真实收益。