# dsv4_h200_vllm_tp8_custom_bench

## 目的

当 vLLM 使用 **TP=8**（Tensor Parallel = 8）部署时，单张 H200 上运行 **1 个服务**，独占全部 8 张 GPU：

| 服务 | 端口 | GPU 组 |
|------|------|--------|
| 1    | 30005 | 0, 1, 2, 3, 4, 5, 6, 7   |

TP=8 提供最大的单服务 tensor-parallel 宽度，适合极高并发、大 batch 场景。本实验使用 **自定义压测客户端 `bench_client.py`**，直接调用 OpenAI `/v1/chat/completions` API。

## 与多服务方案的区别

| 特性 | TP=2 (4 服务) | TP=4 (2 服务) | TP=8 (1 服务) |
|------|---------------|---------------|---------------|
| 服务数量 | 4 | 2 | 1 |
| 每服务 GPU | 2 | 4 | 8 |
| 单服务吞吐 | 较低 | 中等 | 最高 |
| 集群总吞吐 | 相近 | 相近 | 相近 |
| 适用场景 | 低并发、低延迟 | 中等并发 | 极高并发、大 batch |

## 文件说明

| 文件 | 说明 |
|------|------|
| `bench_client.py` | 自定义异步压测客户端（复用 TP=2/TP=4 版本） |
| `config.env` | 实验配置（单服务、端口 30005） |
| `run_bench.sh` | 编排脚本：启动 1 个服务 → 运行压测 → 解析结果 |
| `start_server.sh` | 启动 1 个 vLLM TP=8 服务（占用全部 8 GPU） |
| `parse_results.py` | 解析 bench_client.py 输出的 JSONL，生成 `results.json` + `report.md` |

## 快速运行

```bash
# 完整流程（自动启动服务、压测、生成报告）
bash experiments/dsv4_h200_vllm_tp8_custom_bench/run_bench.sh

# 跳过服务管理（已有服务在运行）
SKIP_MANAGE_SERVER=1 bash experiments/dsv4_h200_vllm_tp8_custom_bench/run_bench.sh

# 单独运行压测客户端（单服务）
python3 experiments/dsv4_h200_vllm_tp8_custom_bench/bench_client.py \
  --host 127.0.0.1 --port 30005 \
  --model deepseek-v4-flash \
  --concurrency 32 --input-len 512 --output-len 256 --num-prompts 640 \
  --output-file /tmp/test.jsonl

# 解析已有结果
python3 experiments/dsv4_h200_vllm_tp8_custom_bench/parse_results.py \
  experiments/dsv4_h200_vllm_tp8_custom_bench/results/<RUN_ID>
```

## 场景设计

本实验覆盖了从 **单并发** 到 **128 并发** 的梯度，以及不同输入/输出长度组合：

| 并发 | 输入长度 | 输出长度 | 请求数 | 说明 |
|------|----------|----------|--------|------|
| 1    | 512      | 256      | 20     | 单并发基线，测纯延迟 |
| 2    | 512      | 256      | 40     | 低并发 |
| 4    | 512      | 256      | 80     | 中低并发 |
| 8    | 512      | 256      | 160    | 中等并发 |
| 16   | 512      | 256      | 320    | 中高并发 |
| 32   | 512      | 256      | 640    | 高并发 |
| 64   | 512      | 256      | 1280   | 很高并发 |
| 128  | 512      | 256      | 2560   | 极限并发，测吞吐上限 |
| 1    | 2048     | 512      | 20     | 长输入基线 |
| 8    | 2048     | 512      | 160    | 长输入中并发 |
| 32   | 2048     | 512      | 640    | 长输入高并发 |
| 128  | 2048     | 512      | 2560   | 长输入极限并发 |
| 1    | 4096     | 1024     | 20     | 超长输入基线 |
| 8    | 4096     | 1024     | 160    | 超长输入中并发 |
| 32   | 4096     | 1024     | 640    | 超长输入高并发 |
| 128  | 4096     | 1024     | 2560   | 超长输入极限并发 |

## 输出格式

同 TP=2/TP=4 版本，输出 JSONL 原始数据、`results.json` 结构化结果、`report.md` 人类可读报告。

## 单独启动/停止服务

```bash
# 启动服务
bash experiments/dsv4_h200_vllm_tp8_custom_bench/start_server.sh

# 停止（run_bench.sh 会自动停止，但也可以手动）
port=30005
pid_file="experiments/dsv4_h200_vllm_tp8_custom_bench/server_port${port}.pid"
[[ -f "$pid_file" ]] && kill "$(cat "$pid_file")" 2>/dev/null || true
rm -f "$pid_file"
pkill -9 -f "vllm serve.*DeepSeek-V4-Flash" 2>/dev/null || true
```

## 注意事项

- 服务独占全部 8 张 GPU，确保无其他进程占用 GPU。
- 模型文件路径：`/data/models/DeepSeek-V4-Flash`
- TP=8 相比 TP=2/TP=4 单服务延迟最低，但无法通过多服务并行提升低并发下的集群利用率。
- 健康检查依赖 `/health` 端点（vLLM 默认启用）。
- 如果服务频繁崩溃，检查 GPU 显存是否充足（OOM 是最常见原因）。
