Prhub

#29084 [AMD][DI][CI] 1/N: MI355X disaggregation nightly benchmark

原始 PR 作者 Lzy17 合并时间 2026-06-26 10:21 文件变更 10 提交数 19 评论 29 代码增减 +816 / -9

执行摘要

AMD MI355X 2 节点 1P1D 分解式夜间基准测试

Brings full nightly coverage of all four DeepSeek-V4 (Flash/Pro, FP8/FP4) 2-node 1P1D PD-disaggregation runs to AMD MI355X, with correctness gated before performance so regressions surface immediately. The design is intentionally sglang-native and self-contained. (来自PR body)

值得仔细阅读,特别是其自包含 CI 设计、GSM8K 门控与性能测量的结合方式、以及自动镜像解析策略。该 PR 可作为 AMD 平台后续模型基准测试的模板。

讨论亮点
  1. 使用上游镜像:functionstackx 建议使用 lmsysorg/sglang-rocm 上游夜间镜像而非私有仓库,HaiShaw 赞同,Lzy17 最终切换并验证。
  2. 负载均衡器选择:functionstackx 询问是否可用正式的 sgl-router 替代自定义 standalone_lb.py,Lzy17 确认替换并删除自定义脚本,利用镜像中已有的 sglang_router.launch_router 模块。
  3. process_result.py 硬件标识:HaiShaw 起初反对将硬编码 "gb200" 改为环境变量,Lzy17 解释 MI355X 需要不同标识且默认保持不变,HaiShaw 随后撤回异议。

实现拆解

  1. 工作流与矩阵生成:在 .github/workflows/nightly-amd-mi355x-disagg.yml 中新增 nightly-amd-mi355x-disagg 工作流,通过 generate_matrix.pynightly-configs.yaml 读取4个配置(Flash/Pro × FP8/FP4)生成矩阵,每个配置独立运行,fail-fast: false
  2. 自动镜像解析:工作流的 setup job 通过 Docker Hub API 解析 lmsysorg/sglang-rocm 仓库中最新的 rocm720-mi35x 标签,传递给自托管 runner,确保每次夜间测试使用最新镜像。
  3. 启动脚本scripts/ci/slurm/launch_mi355x.sh 是核心启动器,通过 salloc 分配2节点(1P1D),在Docker容器中依次启动:prefill server、decode server、sgl-router负载均衡器、GSM8K准确性门控(8-shot,阈值0.91),最后执行 bench_serving 并发扫描(1→256),每个并发输出单独JSON结果。
  4. Recipe配置:每个模型组合有独立的YAML recipe(如 mi355x-fp4/dsv4pro/1k1k/1p1d.yaml),定义资源分配、SGLang参数(TP8/EP1/DP1)、运行时镜像、RoCE设备、并发列表和准确性门控参数。
  5. 结果处理与总结process_result.py 通过环境变量 HW 区分硬件(默认GB200),summarize.py 支持动态标题并按硬件显示结果;所有结果JSON通过 workflow 的 collect-results job 上传。
文件 模块 状态 重要度
scripts/ci/slurm/launch_mi355x.sh 启动脚本 added 7.07
.github/workflows/nightly-amd-mi355x-disagg.yml CI 工作流 modified 5.81
scripts/ci/slurm/recipes/mi355x-fp4/dsv4pro/1k1k/1p1d.yaml 基准配置 added 5.01
scripts/ci/slurm/recipes/mi355x-fp8/dsv4pro/1k1k/1p1d.yaml 基准配置 added 5.01
scripts/ci/slurm/recipes/mi355x-fp4/dsv4flash/1k1k/1p1d.yaml 基准配置 added 5.0
scripts/ci/slurm/recipes/mi355x-fp8/dsv4flash/1k1k/1p1d.yaml 基准配置 added 4.99
scripts/ci/slurm/nightly-configs.yaml 矩阵配置 modified 4.67
scripts/ci/slurm/summarize.py 结果汇总 modified 3.7
scripts/ci/slurm/process_result.py 结果处理 modified 2.75
scripts/ci/slurm/generate_matrix.py 矩阵生成 modified 2.41

关键符号

emit

关键源码片段

scripts/ci/slurm/launch_mi355x.sh infrastructure

核心启动脚本,包含节点分配、Docker 运行、GSM8K 门控、并发扫描等完整逻辑。

# Resolve HF cache snapshot 通过 refs/main 指向最新快照
if [[ -f "$MODEL_PATH/refs/main" && -d "$MODEL_PATH/snapshots" ]]; then
  SNAP_HASH="$(cat "$MODEL_PATH/refs/main")"
  RESOLVED="$MODEL_PATH/snapshots/$SNAP_HASH"
  if [[ -d "$RESOLVED" ]]; then
    echo "resolved snapshot: $MODEL_PATH -> $RESOLVED"
    MODEL_PATH="$RESOLVED"
  else
    echo "WARNING: refs/main points to $RESOLVED but directory missing, using as-is" >&2
  fi
fi# 根据精度设置 FP4 专家标志
# PRECISION=fp4 时启用 SGLANG_DSV4_FP4_EXPERTS,否则无
if [[ "$PRECISION" == "fp4" ]]; then
  EXPERT_FLAGS="-e SGLANG_DSV4_FP4_EXPERTS=1"
else
  EXPERT_FLAGS=""
fi# 通过 GSM8K 正确性门控(8-shot),阈值 0.91
# 失败则退出,不执行后续性能扫描
echo "=== GSM8K Accuracy Gate ==="
python3 -m sglang.test.few_shot_gsm8k \
  --num-shots 8 --num-questions 1319 \
  --threshold 0.91 \
  --host "http://$LB_HOST:$LB_PORT" || exit 1

评论区精华

使用上游 Docker 镜像 设计

functionstackx 建议改用 lmsysorg/sglang-rocm 上游夜间镜像,HaiShaw 表示赞成。Lzy17 已完成切换并验证。

结论:切换至 lmsysorg/sglang-rocm,所有 recipe 和工作流镜像引用均已更新。 · 已解决

负载均衡器选择:sgl-router vs standalone_lb.py 设计

functionstackx 质疑为何不直接使用 sgl-router 而是手写负载均衡器,Lzy17 原意是避免 Rust 依赖。后 Lzy17 确认镜像中已有 sglang_router 模块,替换并删除自定义脚本。

结论:采用 `python -m sglang_router.launch_router` 替代 standalone_lb.py,提升可维护性并验证生产 LB 路径。 · 已解决

process_result.py 硬件标识的默认值 设计

HaiShaw 起初反对将硬编码 `"gb200"` 改为环境变量,认为不应改动共享代码。Lzy17 解释 MI355X 需要不同标识,且默认值保持 `gb200` 不影响现有 GB200 工作流。HaiShaw 同意并撤回意见。

结论:保留环境变量方案,默认 `HW=gb200`,MI355X 工作流显式设置 `HW=mi355x`。 · 已解决

风险与影响

  1. 镜像兼容性:自动解析最新镜像可能引入未测试的依赖变更,导致启动失败或性能偏离;需确保 recipe 中的回退镜像与解析逻辑一致。
  2. GSM8K门控误判:准确性阈值0.91为固定值,若模型微调后准确率自然波动可能导致门控误报,但当前GSM8K基准稳定。
  3. Slurm资源竞争:矩阵中4个模型独立运行,若 runner 资源不足可能导致排队超时;fail-fast: false 确保部分失败不影响其他任务。
  4. 共享脚本改动process_result.pysummarize.py 是 GB200 和 MI355X 共享的,需确保条件分支不影响已有工作流;经差分测试,GB200路径输出字节一致。
  1. AMD CI流程:新增独立的夜间基准测试工作流,为 MI355X 提供持续的 DeepSeek-V4 性能与准确性监控,可早期发现回归。
  2. 跨硬件兼容:共享的结果处理脚本做了硬件无关化改造(HW 环境变量),但保持向后兼容;GB200 工作流不受影响。
  3. 团队工作量:引入新维护负担(4个 recipe、启动脚本、镜像解析),但设计高度复用现有矩阵/结果层,增加维护成本有限。
  4. 可扩展性:启动脚本支持多P/D拓扑(通过 recipe 资源字段),后续可增加 wideEP 或多 prefill 节点配置。
新 CI 工作流 硬件依赖 镜像兼容性 GSM8K 阈值

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论