# DSV4 H200 SGLang vs vLLM 对比实验

在 8x NVIDIA H200 上，用统一控制变量对比 SGLang 与 vLLM serving DeepSeek-V4-Flash。

## 设计原则

- 两个 backend 都使用 **TP=8**，绑定全部 8 张卡。
- 压测客户端统一使用 `sglang.bench_serving`。
- 场景矩阵、并发、输入/输出长度、请求数对两个 backend 完全一致。
- 每个 phase 启动 server 后先做 warmup，再跑正式压测。
- 短上下文和长上下文分阶段启动 server，避免 `max-model-len` / `max-num-seqs` 显存冲突。
- 每次 server 启动的**完整命令行参数**会写入 `results/<RUN_ID>/<backend>/results.json` 的 `config.phase1_server_args` / `config.phase2_server_args`，方便在 P800 等其他平台复现时保持参数一致。

## 场景矩阵

### Phase 1：短上下文吞吐（max_model_len=32k）

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

### Phase 2：长上下文（max_model_len=210k）

| Concurrency | Input  | Output | Num prompts |
|---:|---:|---:|---:|
| 1 | 32768  | 1024 | 8 |
| 1 | 65536  | 1024 | 4 |
| 1 | 131072 | 1024 | 2 |
| 1 | 200000 | 1024 | 1 |

### ShareGPT 真实对话数据（max_model_len=32k）

| Concurrency | ShareGPT context len | Output | Num prompts |
|---:|---:|---:|---:|
| 1  | 32768 | 256 | 32  |
| 32 | 32768 | 256 | 128 |

使用 `datasets/ShareGPT_filtered_chat.json`，`--sharegpt-context-len 32768` 会自动过滤超长请求。

## 快速运行

```bash
bash experiments/dsv4_h200_sglang_vs_vllm/run_bench.sh
```

### 断点续跑

如果实验中途因为脚本/机器原因中断，可以复用同一个 `RUN_ID` 继续跑，已经完成的 scenario 会自动跳过：

```bash
RUN_ID=20260708-XXXXXX bash experiments/dsv4_h200_sglang_vs_vllm/run_bench.sh
```

判断标准是 `raw_outputs/*.jsonl` 已存在且 `completed` 数量达到预期。

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

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

## 文件说明

| 文件 | 作用 |
|---|---|
| `config.env` | 公共配置：模型路径、端口、场景矩阵、虚拟环境 |
| `start_sglang.sh` | 按 phase 启动 SGLang server |
| `start_vllm.sh` | 按 phase 启动 vLLM server |
| `run_bench.sh` | 总 orchestrator：跑 SGLang → 跑 vLLM → 生成对比报告 |
| `warmup.py` | 用 `sglang.bench_serving` 发送少量预热请求 |
| `parse_backend.py` | 解析单个 backend 的 raw jsonl 为 `results.json` + `report.md` |
| `compare.py` | 读取两个 backend 的 `results.json`，生成 `comparison.md` |

## 环境

- SGLM server: `/data/user1/yy/envs/sglang`
- vLLM server: `/data/user1/yy/envs/vllm`
- Benchmark client: `/data/user1/yy/envs/sglang`（统一用该环境的 `sglang.bench_serving`）
