Prhub

#30613 [AMD] Nightly Test Coverage - Minimax-M3-MXFP8 Accuracy Test

原始 PR 作者 yctseng0211 合并时间 2026-07-26 14:52 文件变更 3 提交数 11 评论 13 代码增减 +351 / -0

执行摘要

AMD MI35x 新增 MiniMax-M3 MXFP8 精度测试

关联 issue #31742 已修复,需要新增 nightly 测试覆盖以确保 MiniMax-M3 在 AMD 平台上的精度不退化。

此 PR 主要面向 AMD 平台维护者和 CI 配置参考,不涉及推理逻辑变更,无需精读。但测试文件中针对推理模型 chat+thinking 模式的评估方法、环境变量配置等细节值得参考。

讨论亮点
  1. 数据泄露风险:bot 评论指出早期版本中 few-shot 示例与评估问题重叠,建议从 num_shots 偏移开始评估。该问题在后续切换为 chat+thinking 模式后不再相关(无需 few-shot)。
  2. 缺乏异常 traceback:bot 建议在 except 块中添加 traceback.print_exc() 以辅助 CI 调试。该建议未在最终代码中采纳。

实现拆解

  1. 新增测试文件:在 test/registered/amd/accuracy/mi35x/ 下创建 test_minimax_m3_tp4_eval_mi35x.py,定义 ModelConfig 数据类和测试配置(TP=4, MXFP8, aiter 后端, fp8 KV 缓存),实现 run_gsm8k_benchmark 函数以 chat+thinking 模式(推理模型的正确评估方式)执行 GSM8K 测试,并编写 TestMiniMaxM3TP4EvalMI35x 单元测试类。
  2. 配置 CI 工作流:分别在 nightly-test-amd.yml(ROCm 7.0)和 nightly-test-amd-rocm720.yml(ROCm 7.2)中添加 nightly job nightly-4-gpu-mi35x-minimax-m3,包含 docker 环境准备、依赖安装、精度测试执行步骤,并注册到 suite 矩阵。
  3. 参数调优历程:通过多轮 CI 验证调整,最终确定使用 aiter 后端 + fp8 KV 缓存 + 禁用 radix 缓存的配置,在 ROCm 7.0 和 7.2 上均达到 0.97+ 精度阈值。
文件 模块 状态 重要度
test/registered/amd/accuracy/mi35x/test_minimax_m3_tp4_eval_mi35x.py 精度测试 added 7.48
.github/workflows/nightly-test-amd-rocm720.yml CI 配置 modified 4.04
.github/workflows/nightly-test-amd.yml CI 配置 modified 4.04

关键符号

ModelConfig __post_init__ get_display_name get_answer_value run_gsm8k_benchmark query TestMiniMaxM3TP4EvalMI35x setUpClass

关键源码片段

test/registered/amd/accuracy/mi35x/test_minimax_m3_tp4_eval_mi35x.py test-coverage

新增的测试文件,定义了模型配置、GSM8K 评估逻辑和测试类,是 PR 核心。

# 测试配置文件,定义模型参数和推理环境
from dataclasses import dataclass
from typing import Optional, List@dataclass
class ModelConfig:
    """Configuration for a model to test."""
    model_path: str
    tp_size: int = 4
    accuracy_threshold: float = 0.93
    other_args: Optional[List[str]] = None
    env_vars: Optional[dict] = None
    timeout: Optional[int] = None
    variant: Optional[str] = None
​
    def __post_init__(self):
        if self.other_args is None:
            self.other_args = []
        if self.env_vars is None:
            self.env_vars = {}
​
    def get_display_name(self) -> str:
        if self.variant:
            return f"{self.model_path} ({self.variant})"
        return self.model_path# 具体测试配置:使用 aiter 注意力后端、fp8 e4m3 KV 缓存、禁用 radix 缓存
MI35X_MINIMAX_M3_TP4_MODELS = [
    ModelConfig(
        model_path="MiniMaxAI/MiniMax-M3-MXFP8",
        tp_size=4,
        accuracy_threshold=0.95,
        timeout=5400,
        variant="TP4+MXFP8+aiterAttn+fp8KV",
        other_args=[
            "--quantization", "mxfp8",
            "--dtype", "bfloat16",
            "--trust-remote-code",
            "--attention-backend", "aiter",
            "--kv-cache-dtype", "fp8_e4m3",
            "--disable-radix-cache",
            "--chunked-prefill-size", "8192",
            "--mem-fraction-static", "0.80",
            "--watchdog-timeout", "1200",
        ],
        env_vars={
            "SGLANG_USE_AITER": "1",
            # ROCm 7.0 的 rocBLAS 不支持 bf16 输入 /fp32 输出 router GEMM,
            # 强制 fp32 路由路径以获得更精确的专家路由。
            "SGLANG_OPT_USE_BF16_ROUTER_GEMM": "0",
        },
    ),
]

评论区精华

Few-shot 数据泄露问题 正确性

Bot 指出评估问题从索引 0 开始,但 few-shot 示例取自测试集开头,导致模型在 prompt 中已见过评估问题,建议从 num_shots 偏移开始评估。作者后续切换为 chat+thinking 模式后无需 few-shot,该问题不再适用。

结论:未在最终版本中体现(但已通过模式切换规避)。 · closed-unaddressed

缺少异常 traceback 打印 测试

Bot 建议在 except 块中添加 `traceback.print_exc()` 以便 CI 中调试异常原因。

结论:未采纳(最终代码中未添加)。 · closed-unaddressed

风险与影响

  1. 测试配置偏差:若 Aiter 后端或 fp8 KV 缓存行为在未来变更,可能导致测试假阳性/假阴性。当前配置与真实部署场景可能存在差异(如 radix 缓存禁用)。
  2. CI 耗时增加:新增 job 最长期望 90 分钟,可能延长 nightly CI 总时长。
  3. 硬件依赖:测试仅在 MI35x (gfx950) 上运行,其他 AMD GPU 无法覆盖。

用户无直接影响(仅 CI 测试)。对系统增加 nightly CI 开销,但通过 job_filter 机制可选择性执行。对团队增强了 AMD 平台模型的回归防护,降低精度下降风险。影响程度中等。

测试配置偏差风险 CI 执行时间增加 特定硬件依赖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论