# 自适应并发 Benchmark 使用说明

这套脚本对每个固定的 `(TP, DP, ISL, OSL)` 依次测试
`C=1,2,4,8,...`，直到 Total TPS 连续两次增长不足 2%，或达到并发上限、
发生 OOM。每个正式测点发送 `C * 5` 个请求，并先用相同并发 C warm-up。

## 1. 进入目录

以下路径均相对仓库根目录（如 H200 机器上的 `experiments/h200/...`）。

vLLM：

```bash
cd experiments/h200/dsv4_h200_vllm_tp_dp_matrix
```

SGLang：

```bash
cd experiments/h200/dsv4_h200_sglang_tp_dp_matrix
```

两个目录的入口都是：

```bash
bash run_adaptive_concurrency.sh
```

## 2. 先 dry-run

只打印 TP/DP、ISL/OSL 和并发搜索计划，不加载模型：

```bash
DRY_RUN=1 bash run_adaptive_concurrency.sh
```

## 3. 单组合 smoke

只测 `TP=8, DP=1, ISL=1K, OSL=128`，并发搜索到 8：

```bash
RUN_ID=smoke-$(date +%Y%m%d-%H%M%S) \
TP_LIST="8" \
ISL_LIST="1024" \
OSL_LIST="128" \
GRID_LIMIT=1 \
SEARCH_MAX_CONCURRENCY=8 \
RESULT_BASE="$PWD/adaptive_results/smoke" \
bash run_adaptive_concurrency.sh
```

## 4. 正式运行

长任务放进 tmux。以下命令假设在仓库根目录下执行。vLLM 示例：

```bash
tmux new-session -d -s vllm-adaptive \
  "cd experiments/h200/dsv4_h200_vllm_tp_dp_matrix && \
   RUN_ID=vllm-\$(date +%Y%m%d-%H%M%S) \
   RESULT_BASE=\$PWD/adaptive_results/vllm \
   bash run_adaptive_concurrency.sh"
```

SGLang 示例：

```bash
tmux new-session -d -s sglang-adaptive \
  "cd experiments/h200/dsv4_h200_sglang_tp_dp_matrix && \
   RUN_ID=sglang-\$(date +%Y%m%d-%H%M%S) \
   RESULT_BASE=\$PWD/adaptive_results/sglang \
   bash run_adaptive_concurrency.sh"
```

查看任务：

```bash
tmux ls
tmux attach -t vllm-adaptive
tmux attach -t sglang-adaptive
```

从 tmux 退出但保持任务运行：按 `Ctrl-b`，松开，再按 `d`。

## 5. 常用覆盖参数

无需修改脚本，可以把变量写在命令前：

```bash
MODEL_PATH=/path/to/model \
DATASET_PATH=/path/to/ShareGPT.json \
DOCKER_IMAGE=your/server:image \
DOCKER_CLIENT_IMAGE=lmsysorg/sglang:latest \
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
SEARCH_MAX_CONCURRENCY=512 \
TPS_MIN_GAIN_PCT=2.0 \
PLATEAU_PATIENCE=2 \
bash run_adaptive_concurrency.sh
```

- vLLM 端口用 `VLLM_PORT`，SGLang 端口用 `SGLANG_PORT`。
- `TP_LIST="8"` 只跑 TP=8；DP 使用 `config.env` 中对应的 TP/DP 组合。
- `ISL_LIST="1024 4096"`、`OSL_LIST="128 256"` 用来筛选长度。
- `GRID_LIMIT=1` 表示每组 TP/DP 只跑一个 ISL/OSL shape。
- `BENCH_WARMUP_MAX_REQUESTS=0` 表示每个测点用完整并发 C warm-up；正数表示上限。
- 正式基线保持 `BENCH_DATASET_NAME=random` 和 `RANDOM_RANGE_RATIO=1.0`。
- `random-ids` 只用于检查链路，不与正式 ShareGPT-backed 结果混用。

换机器或模型时，至少检查 `MODEL_PATH`、`DATASET_PATH`、Docker 镜像、GPU 编号、
端口、模型最大上下文和显存参数。需要永久修改时再编辑对应目录的 `config.env`。

## 6. 结果

每次运行在 `${RESULT_BASE}/${RUN_ID}/` 下生成：

```text
adaptive_points.csv       每个并发测点的 TPS、TTFT、TPOT 等
adaptive_summary.csv      每个 ISL/OSL/TP/DP 的饱和并发和最佳 TPS 并发
adaptive_summary.md       可直接阅读的汇总表
run_manifest.json         本次模型、数据集和搜索参数
logs/                     编排与服务日志
tp*_dp*/raw_outputs/      sglang.bench_serving 原始 JSON
tp*_dp*/gpu_logs/         nvidia-smi 采样
```

快速查看：

```bash
column -s, -t adaptive_summary.csv | less -S
tail -f logs/orchestrator.log
```
