# DSV4 H200 vLLM+DSpark vs vLLM default 对比实验

在 8x NVIDIA H200 上，用统一控制变量对比 **vLLM 开启 DSpark 投机解码** 与 **vLLM 默认配置** 的 TTFT / TPOT / 吞吐表现。

## 目的

你之前的观察是：开启 DSpark 后 TTFT 比默认 vLLM 更长。这个实验把两个配置放在同一套场景下重测，确认现象并量化差异，为后续分析根因提供数据。

> 每次 server 启动的**完整命令行参数**会写入 `results/<RUN_ID>/<backend>/results.json` 的 `config.server_args`，方便在 P800 等其他平台复现时保持参数一致。

## 控制变量

| 维度 | DSpark | Default |
|---|---|---|
| 硬件 | 8x H200，TP=8，全部 8 张卡 | 同上 |
| 后端 | `vllm serve --spec-method dspark --spec-tokens 5` | 普通 `vllm serve` |
| 压测客户端 | `sglang.bench_serving --backend vllm` | 同上 |
| 场景矩阵 | 5 个场景完全一致 | 同上 |
| KV cache | fp8 | fp8 |
| max_model_len | 32768 | 32768 |
| max_num_seqs | 256 | 256 |

> 注：DSpark 使用独立的 `DeepSeek-V4-Flash-DSpark` checkpoint；default 使用标准的 `DeepSeek-V4-Flash`。这是 DSpark 方案本身带来的差异， unavoidable。

## 场景矩阵（全部测 5 个）

| Concurrency | Input len | Output len | Num prompts |
|---:|---:|---:|---:|
| 1   | 512   | 256  | 32  |
| 32  | 512   | 256  | 128 |
| 128 | 512   | 256  | 128 |
| 1   | 4000  | 512  | 32  |
| 32  | 4000  | 512  | 64  |

## 快速运行

```bash
bash experiments/dsv4_h200_vllm_dspark_vs_default/run_bench.sh
```

结果保存在 `experiments/dsv4_h200_vllm_dspark_vs_default/results/<RUN_ID>/`：

```
results/<RUN_ID>/
├── dspark/
│   ├── results.json
│   ├── report.md
│   └── raw_outputs/      # gitignored
├── default/
│   ├── results.json
│   ├── report.md
│   └── raw_outputs/      # gitignored
├── comparison.md
└── logs/
```

## 文件说明

| 文件 | 作用 |
|---|---|
| `config.env` | 模型路径、端口、虚拟环境、场景矩阵 |
| `start_dspark.sh` | 启动带 DSpark 投机解码的 vLLM server |
| `start_default.sh` | 启动普通 vLLM server |
| `run_bench.sh` | 总 orchestrator：DSpark → default → 对比报告 |
| `parse_backend.py` | 解析单个 backend 的 raw jsonl 为 `results.json` + `report.md` |
| `compare.py` | 读取两个 backend 结果，生成 TTFT 聚焦的 `comparison.md` |

## 环境

- DSpark server: `/data/user1/yy/envs/vllm-dspark`
- Default server: `/data/user1/yy/envs/vllm`
- Benchmark client: `/data/user1/yy/envs/sglang`
