执行摘要
- 一句话:新增4GPU AMD MI35x runner,缓解8GPU饱和
- 推荐动作:建议阅读:该 PR 展现了如何通过 CI runner 标签细化来缓解资源竞争,是典型的 CI 可观测性与成本优化实践。值得关注的是命名约定、套件拆分策略以及如何平衡覆盖与资源效率。
功能与动机
AMD CI runner-fleet 报告中 linux-mi35x-gpu-8 池严重饱和,几乎所有 mi35x 任务都挤在上面(P99 队列约 20h),而 1-GPU 和 2-GPU 池几乎空闲,4-GPU 标签完全未被引用。根本原因是多个仅需 ≤4 GPU 的任务被钉在 8-GPU 标签上,占据整个 8-GPU 节点。
实现拆解
- 新增 4-GPU runner 标签:假设集群已划分出
linux-mi35x-gpu-4 标签(PR 前置条件)。
- 迁移夜间任务:在
nightly-test-amd.yml 和 nightly-test-amd-rocm720.yml 中,将 nightly-8-gpu-mi35x-deepseek-r1-mxfp4-tp4 和 nightly-4-gpu-mi35x-minimax-m25 的 runs-on 从 linux-mi35x-gpu-8 改为 linux-mi35x-gpu-4。
- 迁移 PR 任务:在
pr-test-amd.yml 和 pr-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 的任务。
- 注册新套件:在
test/run_suite.py 的 PER_COMMIT_SUITES[AMD] 列表中插入 stage-c-test-4-gpu-amd-mi35x,使新套件可被 CI 调度。
- 重命名并调整测试参数:将
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 门限重新标定)。
- 保留夜间 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(模块 测试套件;类别 test;类型 rename-or-move): 核心测试文件:从 8-GPU 重命名为 4-GPU,调整 TP 参数并降级速度断言,直接体现测试覆盖调整。
.github/workflows/pr-test-amd.yml(模块 CI 工作流;类别 infra;类型 infrastructure): 主要 CI 工作流:新增 4-GPU job 并缩减 8-GPU job 分区,实现 rebalance 核心逻辑。
.github/workflows/pr-test-amd-rocm720.yml(模块 CI 工作流;类别 infra;类型 infrastructure): 与 pr-test-amd.yml 对称,为 ROCm 7.20 版本做相同变更。
.github/workflows/nightly-test-amd.yml(模块 CI 工作流;类别 infra;类型 infrastructure): 夜间工作流:将两个 TP=4 任务的 runner 从 8-GPU 改为 4-GPU。
.github/workflows/nightly-test-amd-rocm720.yml(模块 CI 工作流;类别 infra;类型 infrastructure): 与 nightly-test-amd.yml 对称的 ROCm 720 版本。
test/run_suite.py(模块 测试调度;类别 test;类型 test-coverage): 套件注册文件:在 PER_COMMIT_SUITES 中添加新套件名称,使 CI 可发现。
关键符号:未识别
关键源码片段
test/registered/amd/test_deepseek_r1_mxfp4_4gpu.py
核心测试文件:从 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-only
class 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
评论区精华
Gemini Code Assist bot 在 test_deepseek_r1_mxfp4_4gpu.py 的 test_bs_1_speed 方法中添加了评论,建议对 report-only 的断言添加明确的 TODO 注释以跟踪重新标定,避免静默性能回归。虽然代码中已用注释说明原因但未添加 TODO,HaiShaw 最终批准了 PR,未要求修改。
- 性能断言降级应添加 TODO 注释 (testing): 代码保持原样:断言被注释并加了说明,但未添加 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标签依赖, 测试文件重命名需确认旧文件已删除
关联脉络
- PR #28736 [AMD] register 3 tests to stage-b-test-1-gpu-large-amd (batch-6): 同为 AMD CI 测试注册 PR,展示了套件注册的流程,与本 PR 的 test/run_suite.py 修改类似。
- PR #28357 [AMD] fix(jit): port kv_canary write/verify/plan kernels to ROCm: 同为 AMD CI 改进,涉及 JIT 内核移植和 CI 测试注册,与本 PR 在同一 CI 基础设施上下文。
参与讨论