执行摘要
- 一句话:修复B200夜间测试因评估统一导致的GSM8K准确性基线问题。
- 推荐动作:该PR值得快速浏览,以了解评估统一后的测试适配模式;重点关注
AccuracyTestParams扩展api字段的设计,以及如何通过配置修复因评估方法变更导致的测试失败。
功能与动机
PR #21667统一了GSM8K评估路径,但引入了两个问题:
1) FP8 MOE后端因旧评估包含少量样本泄露导致分数虚高约4%,新评估分数降至0.905-0.925,原基线0.93过高;
2) FP4 DeepSeek-R1因新评估默认使用Chat API且缺少样本数限制,分数从0.975降至0.86。需调整测试基线以反映真实准确性,避免CI失败。
实现拆解
- 扩展测试框架支持API参数:在
python/sglang/test/accuracy_test_runner.py中,为AccuracyTestParams数据类添加api字段(可选"chat"或"completion"),并在_run_simple_eval函数中新增api参数,将其传递给评估后端,以控制评估使用的API模式。
- 调整FP8 MOE后端基线阈值:在
test/registered/backends/test_flashinfer_trtllm_gen_moe_backend.py中,将test_gsm8k方法的断言阈值从0.93降至0.89,匹配新评估方法下的实际分数范围(0.905-0.925)。
- 修复FP4 DeepSeek-R1测试配置:在
test/registered/perf/test_dpsk_v3_fp4_4gpu_perf.py中,为AccuracyTestParams添加num_examples=200和api="completion",确保评估使用正确的API并限制样本数,恢复基线0.935。
- 测试配套调整:所有变更均为测试文件修改,无源码主路径改动,旨在确保夜间CI测试通过,不涉及功能逻辑变更。
关键文件:
python/sglang/test/accuracy_test_runner.py(模块 测试框架;类别 test;类型 test-coverage;符号 AccuracyTestParams, _run_simple_eval, run_accuracy_test): 核心测试框架扩展,新增API参数支持,影响所有准确性测试的配置传递。
test/registered/perf/test_dpsk_v3_fp4_4gpu_perf.py(模块 性能测试;类别 test;类型 test-coverage;符号 AccuracyTestParams): 修复DeepSeek-R1 FP4测试配置,添加num_examples和api参数以匹配旧评估行为。
test/registered/backends/test_flashinfer_trtllm_gen_moe_backend.py(模块 后端测试;类别 test;类型 test-coverage;符号 test_gsm8k): 调整FP8 MOE后端GSM8K测试的断言阈值,反映评估统一后的真实准确性。
关键符号:AccuracyTestParams, _run_simple_eval, run_accuracy_test, test_gsm8k
关键源码片段
python/sglang/test/accuracy_test_runner.py
核心测试框架扩展,新增API参数支持,影响所有准确性测试的配置传递。
@dataclass
class AccuracyTestParams:
"""Parameters for accuracy testing."""
dataset: str # e.g., "mgsm_en", "gsm8k", "mmmu", "gpqa"
baseline_accuracy: float # Required: minimum accuracy threshold
num_examples: Optional[int] = None
num_threads: Optional[int] = None
max_tokens: Optional[int] = None
return_latency: bool = False
thinking_mode: Optional[str] = None # e.g., "deepseek-v3"
temperature: Optional[float] = None
top_p: Optional[float] = None
top_k: Optional[int] = None
repeat: Optional[int] = None
api: Optional[str] = None # 新增字段:控制评估 API 模式,可选 "chat" 或 "completion",默认在 run_eval 中为 "chat"
def _run_simple_eval(
model: ModelLaunchSettings,
base_url: str,
dataset: str,
num_examples: Optional[int] = None,
num_threads: Optional[int] = None,
max_tokens: Optional[int] = None,
return_latency: bool = False,
thinking_mode: Optional[str] = None,
temperature: Optional[float] = None,
top_p: Optional[float] = None,
top_k: Optional[int] = None,
repeat: Optional[int] = None,
api: Optional[str] = None, # 新增参数:接收 API 模式配置
) -> Tuple[bool, Optional[str], Optional[dict]]:
"""Run evaluation using simple_eval backend (run_eval.py)."""
process = None
try:
process = popen_launch_server(
model.model_path,
base_url,
other_args=model.extra_args,
timeout=model.launch_timeout or DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH,
env=model.env,
)
args = SimpleNamespace(
base_url=base_url,
model=model.model_path,
eval_name=dataset,
num_examples=num_examples,
num_threads=num_threads or 1024,
)
if api is not None: # 将 API 参数传递给评估后端
args.api = api
# ... 其他参数处理逻辑
评论区精华
review中主要讨论了测试一致性和潜在遗漏:
风险与影响
- 风险:
- 回归风险低:变更仅影响测试断言和配置,不修改核心业务逻辑。
- 兼容性风险:新增
api字段向后兼容,但依赖方需注意默认值从"chat"变为可配置。
- 测试覆盖风险:
FlashinferTrtllmGenMoeBackendMXFP8Base基线未更新,可能导致未来CI失败。
- 性能风险无:纯测试调整,不影响运行时性能。
- 影响:
- 对用户影响:无直接影响,仅夜间测试通过性改善。
- 对系统影响:确保B200夜间测试准确反映模型性能,避免误报失败。
- 对团队影响:减少CI噪音,但需关注未调整基线的潜在测试失败。
- 风险标记:测试基线未完全覆盖, 配置依赖变更
关联脉络
- PR #21667 [CI] Lower GSM8K baselines for B200 nightly after eval unification: PR body中提及该PR统一了GSM8K评估路径,是本次测试失败的根因,直接关联。
参与讨论