sskj/docs/EXPERIMENT_GUIDE.md
yy-fighting 8652a685e6 rewrite README, add new platform onboarding guide, fix broken scripts/common paths
- rewrite README with project purpose, standard workflow, corrected index
- add docs/NEW_PLATFORM_GUIDE.md (new GPU onboarding SOP, GLM5.2 reuse)
- fix ../../scripts/common -> ../../../scripts/common in 42 experiment scripts
- refresh stale docs (EXPERIMENT_GUIDE, H200_QUICKSTART, ADAPTIVE_CONCURRENCY_USAGE, BENCHMARK_WORKFLOW)
- remove dead code (dp_proxy.py) and .bak leftovers
- add p800 adaptive results (tp4_dp2/tp8_dp1 metrics + summary)
- gitignore envs/charts and .tmp_charts
2026-07-17 06:18:05 +00:00

7.4 KiB
Raw Blame History

实验规范指南

本仓库用于统一记录和复现不同芯片、不同 backendSGLang / vLLM下的推理测速实验。

1. 目录结构

实验目录为三层结构:experiments/<platform>/<experiment_name>/,其中 platform ∈ {h20, h200, p800, pro6000};另有 experiments/TEMPLATE/ 作为新实验模板。

experiments/<platform>/<experiment_name>/
├── config.env              # 实验参数唯一来源
├── run_bench.sh            # 编排入口
├── start_sglang.sh         # SGLang server 启动脚本
├── start_vllm.sh           # vLLM server 启动脚本
└── results/<run_id>/
    ├── comparison.md
    ├── sglang/
    │   ├── results.json
    │   ├── report.md
    │   ├── raw_outputs/    # .gitignore 忽略
    │   └── logs/           # .gitignore 忽略
    └── vllm/
        ├── results.json
        ├── report.md
        ├── raw_outputs/    # .gitignore 忽略
        └── logs/           # .gitignore 忽略

上述是 TEMPLATE 式的固定场景对比实验布局sglang vs vllm老形态仍可用。当前主流实验形态是 TP/DP matrix + 自适应并发搜索:实验目录内由 matrix.json + generate_scenarios.py 生成场景,adaptive_config.env 配置搜索参数,run_adaptive_concurrency.sh 驱动,结果落盘 adaptive_results/<run_id>/adaptive_points.jsonladaptive_summary.{jsonl,md,csv}run_manifest.jsontp*_dp*/ 等),用法见 experiments/ADAPTIVE_CONCURRENCY_USAGE.md

通用工具集中放在 scripts/common/,不要复制到每个实验。三层实验目录以 ../../../scripts/common 引用(experiments/TEMPLATE/ 为两层,用 ../../scripts/common

  • scripts/common/lib.sh日志、metadata、JSON 工具
  • scripts/common/platform.sh:平台自动检测
  • scripts/common/warmup.pyserver 预热
  • scripts/common/parse_backend.py:解析 raw jsonl -> results.json + report.md
  • scripts/common/compare.py:生成 SGLang vs vLLM 对比表
  • scripts/common/adaptive_bench_lib.sh / adaptive_concurrency.py:自适应并发搜索
  • scripts/common/server_docker.sh / bench_client_docker.shDocker server / client 管理
  • scripts/common/adaptive_heartbeat.sh:自适应测试心跳保活

2. 新增一个实验

最快方式:

cp -r experiments/TEMPLATE experiments/<platform>/<your_experiment_name>
# 修改 config.env、start_*.sh
bash experiments/<platform>/<your_experiment_name>/run_bench.sh

2.1 config.env 必备字段

EXPERIMENT="<experiment_name>"
MODEL_NAME="DeepSeek-V4-Flash"
MODEL_PATH="/data/models/DeepSeek-V4-Flash"

SGLANG_PORT="${SGLANG_PORT:-30006}"
VLLM_PORT="${VLLM_PORT:-30005}"

# venv 路径按机器实际配置调整
VENV_SGLANG="${VENV_SGLANG:-/path/to/envs/sglang}"
VENV_VLLM="${VENV_VLLM:-/path/to/envs/vllm}"

export CUDA_VISIBLE_DEVICES="${CUDA_VISIBLE_DEVICES:-0,1,2,3,4,5,6,7}"
TP="${TP:-8}"

MAX_MODEL_LEN=...
MAX_NUM_SEQS=...
MAX_RUNNING=...

# 场景:"concurrency input_len output_len num_prompts"
declare -a SCENARIOS=(
  "1  512  256 32"
)

VENV_CLIENT="${VENV_CLIENT:-$VENV_SGLANG}"
SGLANG_START_SCRIPT="${SCRIPT_DIR:-.}/start_sglang.sh"
VLLM_START_SCRIPT="${SCRIPT_DIR:-.}/start_vllm.sh"

2.2 可复现性要求

每个 results.json 必须记录:

  • metadata.model:模型路径
  • metadata.hardware / metadata.accelerator / metadata.chip
  • metadata.env:使用的虚拟环境路径
  • metadata.git_commit / metadata.git_dirty
  • config.server_args:完整的 server 启动命令
  • config.cuda_visible_devices

这些通过 scripts/common/lib.sh 中的 write_metadata_jsonjq 注入。

3. 平台与硬件适配

3.1 芯片级默认配置

芯片相关默认值放到 platforms/<chip>.env,现有:

  • platforms/nvidia_h20.env
  • platforms/nvidia_h200.env
  • platforms/nvidia_rtx6000d.env
  • platforms/kunlun_p800.env

实验级覆盖通过 config.env 实现。

3.2 跨芯片注意事项

H200 P800 备注
TP 大小 8 8/16 TP 控制
KV cache dtype fp8 可能不同 start_vllm.sh 调整
MLA backend flashinfer_mla 可能不支持 start_sglang.sh/start_vllm.sh 调整
最大上下文 受显存限制 受显存限制 通过探针测试确定
设备变量 CUDA_VISIBLE_DEVICES 可能不同 config.env 设置

如果某芯片不支持某个 featurestart_*.sh 里用条件判断,不要把条件写进通用脚本。

4. SLO 标准

默认使用 S2 层级(完整分级定义见 docs/SLO_STANDARDS.md

  • TTFT P95 < 3000 ms
  • TPOT mean < 50 ms

scripts/common/parse_backend.pyscripts/common/compare.py 默认按这个标准打标。如果需要其他 tier调用 compare.py 时传入 --ttft-limit--tpot-limit

5. 断点续测

run_bench.sh 必须实现 scenario_already_completed() 检查:

  • 如果某 scenario 的 raw_outputs/*.jsonlcompleted 数量已达标,直接跳过
  • 重新执行脚本即可从中断处继续

6. Git 提交规范

6.1 必须提交

  • 实验代码:config.envrun_bench.shstart_*.sh
  • 最终结果:comparison.mdsglang/results.jsonsglang/report.mdvllm/results.jsonvllm/report.md

6.2 不要提交

  • raw_outputs/
  • logs/
  • 中间 server 日志

这些已在 .gitignore 中忽略。

6.3 提交示例

git add experiments/<platform>/<name>/config.env \
        experiments/<platform>/<name>/run_bench.sh \
        experiments/<platform>/<name>/start_*.sh \
        experiments/<platform>/<name>/results/<run_id>/comparison.md \
        experiments/<platform>/<name>/results/<run_id>/sglang/results.json \
        experiments/<platform>/<name>/results/<run_id>/sglang/report.md \
        experiments/<platform>/<name>/results/<run_id>/vllm/results.json \
        experiments/<platform>/<name>/results/<run_id>/vllm/report.md

git commit -m "results: <experiment_name> run <run_id>"
git push origin main

7. 场景设计规范

7.1 请求数 = 并发数 × 5

每个 scenario 的 num_prompts 必须是对应 concurrency5 倍,即每个并发档位至少跑满 5 轮请求,保证 P95/P99 等尾延迟指标有统计意义。

# 格式concurrency input_len output_len num_prompts
declare -a SCENARIOS=(
  "1   512  256  5"    # 1 × 5
  "32  512  256  160"  # 32 × 5
  "128 512  256  640"  # 128 × 5
)

例外:对于超长上下文(如 128k/256k或探针类实验若执行成本过高可在 config.env 中显式注释说明原因,并保留不小于 concurrency × 2 的最低样本量。

8. 命名约定

  • 实验目录:experiments/<platform>/{model}_{chip}_{scenario}_{backend_vs_backend},例如 experiments/h200/dsv4_h200_sglang_vs_vllm
  • scenario 名称:c{concurrency}_i{input_len}_o{output_len}
  • raw 输出:{backend}_{label}_{MMDD}_{concurrency}_{input_len}_{output_len}.jsonl
  • run_idYYYYMMDD-HHMMSS

9. 常见问题

8.1 新芯片上 server 起不来

  1. 检查 platforms/<chip>.env 是否已定义
  2. 检查 start_*.sh 中的 backend-specific 参数是否被该芯片支持
  3. 先用最小场景input=512, output=256, concurrency=1验证通路

8.2 长上下文 OOM

  1. 降低并发
  2. 降低输出长度
  3. 调整 mem-fraction-static / gpu-memory-utilization
  4. 记录能跑通的最大组合,更新矩阵