Prhub

#29784 [AMD][DI][CI] 2/N Add DSV4 DP8/EP8 and MTP MI355X 1P1D nightly recipes

原始 PR 作者 Lzy17 合并时间 2026-07-01 23:46 文件变更 15 提交数 5 评论 4 代码增减 +970 / -3

执行摘要

为 AMD MI355X 添加 DSV4 DP8/EP8 和 MTP 夜间测试配置

PR 标题为 '[AMD][DI][CI] 2/N Add DSV4 DP8/EP8 and MTP MI355X 1P1D nightly recipes'。根据 body,目的是扩展 AMD MI355X 的夜间测试,覆盖 DeepSeek-V4 的多种并行拓扑和推测解码,以尽早发现回归问题。

值得精读,以理解如何为 AMD 平台扩展复杂的分离式测试拓扑。重点关注 launch_mi355x.sh 的解析逻辑和 recipe 结构,可作为类似 CI 配置的模板。同时也需留意上游 get_cpu_copy 的修复进展,以便及时解除并发限制。

讨论亮点

从 PR body 和评论区提取的关键讨论:

  • 并发限制决策:bingxche 在评论中报告了测试失败(设置 swa_full_tokens_ratio 为 0.2 和 0.3 均失败),最终作者决定将 dsv4pro-fp8-mtp 的并发上限限制在 128。PR body 详细解释了根本原因:disagg-decode SWA hybrid KV pool 填满后,scheduler 回收请求时调用 offload_kv_cacheget_cpu_copy,而 SWA hybrid pool 的 get_cpu_copy 是未实现的 NotImplementedError
  • 上游依赖:recipe 注释中明确标注该限制,并注明需要上游实现 get_cpu_copy 才能解除。
  • 无设计争议:讨论中没有架构层面的争议,主要围绕实际运行中的问题定位与 workaround。

实现拆解

  1. 新增 recipe 文件:在 scripts/ci/slurm/recipes/ 下按模型精度和拓扑创建 12 个 YAML 文件。每个文件定义 backend.sglang_config 中的 TP/EP/DP 大小、runtime 参数(镜像、IB 设备、端口等)、ben th 配置(并发序列、正确性门控),以及可选的 mtp 段(启用 MTP 时设置 num_steps/eagle_topk/num_draft_tokens)。基础变体(无 MTP、EP1/DP1)沿用现有配置。
  2. 更新 nightly-configs.yaml:在 scripts/ci/slurm/nightly-configs.yaml 中为每个模型精度组合新增三个配置条目(-mtp、-dp8ep8、-dp8ep8-mtp),指向对应的 recipe 文件。
  3. 增强 launch_mi355x.sh:修改启动脚本以解析 recipe 中的 expert-parallel-sizedata-parallel-sizemtp: 节,并转换为 --ep-size--enable-dp-attention --dp-size--speculative-* 等命令行参数。基础 recipe 产生空额外标志,保持向后兼容。
  4. 处理已知限制:在 dsv4pro-fp8-mtp 的 recipe 中通过注释说明并发 256 会因上游 NotImplementedErrorget_cpu_copy 未实现)崩溃,因此将 concurrencies 上限设为 128。同时尝试调高 swa_full_tokens_ratio 无效。
  5. 排除坏节点:在 launch_mi355x.sh 的 salloc 阶段添加节点排除逻辑,屏蔽有 RDMA 驱动 ABI 不匹配的节点(如 mia1-p01-g20)。
  6. 日志收集:末次 commit 修改日志脚本,将 MI355X 分离式测试的日志打包到结果目录。
文件 模块 状态 重要度
scripts/ci/slurm/nightly-configs.yaml CI 配置 modified 5.22
scripts/ci/slurm/recipes/mi355x-fp8/dsv4pro/1k1k/1p1d-mtp.yaml CI 配置 added 5.08
scripts/ci/slurm/launch_mi355x.sh 启动脚本 modified 5.0

关键源码片段

scripts/ci/slurm/recipes/mi355x-fp8/dsv4pro/1k1k/1p1d-mtp.yaml infrastructure

代表 MTP 变体的 recipe,包含详细的并发限制注释和上游未实现问题的 workaround,是测试配置决策的典型示例。

# MI355X DeepSeek-V4-Pro-FP8 2 节点 1P1D 分离式 recipe — TP8 + MTP
# 注意:并发 256 因上游 get_cpu_copy 未实现而排除resources:
  prefill_workers: 1
  decode_workers: 1backend:
  sglang_config:
    prefill:
      tensor-parallel-size: 8
      expert-parallel-size: 1
      data-parallel-size: 1
    decode:
      tensor-parallel-size: 8
      expert-parallel-size: 1
      data-parallel-size: 1runtime:
  image: lmsysorg/sglang-rocm:v0.5.13.post1-rocm720-mi35x-20260623
  attention_backend: dsv4
  ib_devices: rdma0,rdma1,rdma2,rdma3
  prefill_port: 30025
  decode_port: 30026
  # ... ( 其他运行时参数 )
  swa_full_tokens_ratio: 0.1 # 曾尝试调至 0.2/0.3 但无法避免 conc256 crashmtp: # MTP / EAGLE 推测解码配置
  enabled: true
  num_steps: 3
  eagle_topk: 1
  num_draft_tokens: 4bench:
  # 限制并发上限:conc256 会触发 disagg-decode SWA hybrid pool 的 get_cpu_copy 未实现错误
  concurrencies: [1, 8, 16, 32, 64, 128] # 注意不含 256
  num_prompts_factor: 4
  random_range_ratio: 1.0
  accuracy:
    enabled: true
    num_shots: 8
    num_questions: 1319
    threshold: 0.91

评论区精华

swa_full_tokens_ratio 调优与并发限制 正确性

bingxche 报告了 dsv4pro-fp8-mtp 在 conc256 时失败,作者尝试将 swa_full_tokens_ratio 从 0.1 调至 0.2、0.3 均无效。最终决定将并发上限限制在 128,并在 recipe 中记录上游未实现 get_cpu_copy 导致的 crash。

结论:接受 conc128 限制,等待上游修复 get_cpu_copy。 · 已解决

节点排除与 RDMA 驱动问题 infra

PR 中包含对 mia1-p01-g20 节点的排除,因为其 ionic RDMA 驱动 ABI 不匹配导致初始化失败。

结论:在 salloc 阶段添加节点排除逻辑,避免调度到坏节点。 · 已解决

风险与影响

风险较低,因为修改的是 CI 测试配置,不影响产品代码。但需注意以下潜在风险:

  • 固化限制dsv4pro-fp8-mtp 限制在 conc128 可能成为硬性约束,若上游修复 get_cpu_copy,需手动更新 recipe 以恢复全并发覆盖。
  • 节点排除误判:节点排除逻辑基于已知问题节点,若未来节点恢复或新节点出现类似问题,可能需要更新排除列表。
  • 配置扩散:新增 12 个配置条目增加了 CI 配置的复杂度,但结构清晰风险可控。

对用户无直接影响。对 AMD MI355X 平台的影响是扩展了夜间测试覆盖,有助于捕获 DeepSeek-V4 在不同并行策略下的回归。对团队的影响是增加了 CI 配置文件的维护量,但结构清晰且模板化,降低了长期维护成本。影响程度中等,仅限于 CI 环境。

依赖上游修复 固化并发限制 节点排除可能过时

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论