Prhub

#28745 ci: add 4-GPU mi35x runner and rebalance off the saturated 8-GPU pool

原始 PR 作者 michaelzhang-ai 合并时间 2026-06-20 06:41 文件变更 6 提交数 1 评论 2 代码增减 +109 / -14

执行摘要

新增 4GPU AMD MI35x runner,缓解 8GPU 饱和

AMD CI runner-fleet 报告中 linux-mi35x-gpu-8 池严重饱和,几乎所有 mi35x 任务都挤在上面(P99 队列约 20h),而 1-GPU 和 2-GPU 池几乎空闲,4-GPU 标签完全未被引用。根本原因是多个仅需 ≤4 GPU 的任务被钉在 8-GPU 标签上,占据整个 8-GPU 节点。

建议阅读:该 PR 展现了如何通过 CI runner 标签细化来缓解资源竞争,是典型的 CI 可观测性与成本优化实践。值得关注的是命名约定、套件拆分策略以及如何平衡覆盖与资源效率。

讨论亮点

Gemini Code Assist bot 在 test_deepseek_r1_mxfp4_4gpu.pytest_bs_1_speed 方法中添加了评论,建议对 report-only 的断言添加明确的 TODO 注释以跟踪重新标定,避免静默性能回归。虽然代码中已用注释说明原因但未添加 TODO,HaiShaw 最终批准了 PR,未要求修改。

实现拆解

  1. 新增 4-GPU runner 标签:假设集群已划分出 linux-mi35x-gpu-4 标签(PR 前置条件)。
  2. 迁移夜间任务:在 nightly-test-amd.ymlnightly-test-amd-rocm720.yml 中,将 nightly-8-gpu-mi35x-deepseek-r1-mxfp4-tp4nightly-4-gpu-mi35x-minimax-m25runs-onlinux-mi35x-gpu-8 改为 linux-mi35x-gpu-4
  3. 迁移 PR 任务:在 pr-test-amd.ymlpr-test-amd-rocm720.yml 中,新增名为 stage-c-test-4-gpu-amd-mi35x 的 job(runs-on: linux-mi35x-gpu-4),将 DeepSeek-R1-MXFP4 从原 8-GPU 套件拆分到新 job;原 8-GPU 套件从两个分区(part: [0,1])缩减为一个分区(part: [0]),仅保留 Kimi-K2.5-MXFP4 和 Qwen3-Coder-Next 两个真正需要 TP=8 的任务。
  4. 注册新套件:在 test/run_suite.pyPER_COMMIT_SUITES[AMD] 列表中插入 stage-c-test-4-gpu-amd-mi35x,使新套件可被 CI 调度。
  5. 重命名并调整测试参数:将 test/registered/amd/test_deepseek_r1_mxfp4_8gpu.py 重命名为 test_deepseek_r1_mxfp4_4gpu.py,修改 register_amd_ci 的套件名,将所有 --tp 8 改为 --tp 4,并注释掉速度断言(变为 report-only,等待 TP=4 门限重新标定)。
  6. 保留夜间 TP=8 覆盖:夜间 8-GPU 套件 nightly-amd-8-gpu-mi35x-deepseek-r1-mxfp4 仍运行在 linux-mi35x-gpu-8 上,确保 TP=8 准确度覆盖不丢失。
文件 模块 状态 重要度
test/registered/amd/test_deepseek_r1_mxfp4_4gpu.py 测试套件 renamed 5.03
.github/workflows/pr-test-amd.yml CI 工作流 modified 4.83
.github/workflows/pr-test-amd-rocm720.yml CI 工作流 modified 4.81
.github/workflows/nightly-test-amd.yml CI 工作流 modified 3.41
.github/workflows/nightly-test-amd-rocm720.yml CI 工作流 modified 3.41
test/run_suite.py 测试调度 modified 3.18

关键源码片段

test/registered/amd/test_deepseek_r1_mxfp4_4gpu.py rename-or-move

核心测试文件:从 8-GPU 重命名为 4-GPU,调整 TP 参数并降级速度断言,直接体现测试覆盖调整。

# test/registered/amd/test_deepseek_r1_mxfp4_4gpu.py
# 原文件从 8gpu 重命名而来,将 TP=8 改为 TP=4,并临时移除速度断言门限。register_amd_ci(est_time=3600, suite="stage-c-test-4-gpu-amd-mi35x")class TestDeepseekR1MXFP4(CustomTestCase):
    @classmethod
    def setUpClass(cls):
        # ... ( 省略 import 和 setup 公共部分 )
        other_args = [
            "--tp",
            "4", # 原为 "8",改为 4 以匹配 4GPU runner
            "--chunked-prefill-size",
            "131072",
            # ...
        ]
        cls.process = popen_launch_server(...)
​
    def test_bs_1_speed(self):
        # 吞吐速度测试:原断言 self.assertGreater(speed, 75) 被注释
        # 理由:TP=4 的吞吐与 TP=8 不同,需重新标定门限
        # TODO: 标定后重新启用断言(建议添加)
        print(f"{speed=:.2f}")
        # self.assertGreater(speed, 75) # 暂时 report-onlyclass TestDeepseekR1MXFP4MTP(CustomTestCase):
    @classmethod
    def setUpClass(cls):
        other_args = [
            "--tp",
            "4", # 同样改为 4
            # ...
        ]
​
    def test_bs_1_speed(self):
        # 原断言 self.assertGreater(speed, 150) 被注释
        # TODO: 重新标定后启用
        # self.assertGreater(speed, 150) # 暂时 report-only

评论区精华

性能断言降级应添加 TODO 注释 测试

Gemini Code Assist bot 建议在 test_bs_1_speed 中为注释掉的断言添加 TODO 注释,以跟踪重新标定。

结论:代码保持原样:断言被注释并加了说明,但未添加 TODO。HaiShaw 批准 PR,未强制要求修改。 · 已解决

风险与影响

  • 性能门禁降级test_bs_1_speed 中的速度断言被注释掉,变为 report-only。在重新标定前,TP=4 的性能回退不会被 CI 拦截,可能导致部署后吞吐下降。但由于夜间任务仍保留 TP=8 覆盖,且 GSM8K 准确度断言仍有效,风险可控。
  • runner 标签依赖:新增的 linux-mi35x-gpu-4 标签需预先在集群中定义,若未正确划分,任务会因找不到 runner 而失败。
  • 测试重复或遗漏:重命名文件后旧文件名未清理,可能留下死代码(旧文件不在变更列表中,说明已删除)。需确认旧文件已被删除。

对最终用户无直接影响。对 AMD CI 系统有正面影响,降低排队时间和 8-GPU 节点占用,提高资源利用率。对 CI 维护者需要确保 linux-mi35x-gpu-4 标签可用。对 DeepSeek-R1-MXFP4 模型测试不再验证 TP=4 吞吐门限,但认可度仍通过。

性能断言降级为 report-only runner 标签依赖 测试文件重命名需确认旧文件已删除

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论