Prhub

#27461 Enable async-assert invariant probes by default in CI

原始 PR 作者 hnyls2002 合并时间 2026-06-07 07:23 文件变更 16 提交数 3 评论 3 代码增减 +47 / -62

执行摘要

在 CI 中默认启用异步断言探测

PR body 指出:异步断言探测可以在无 GPU-CPU 同步的前提下,在下一个同步点以干净断言暴露张量中的 NaN/Inf/OOB 等错误,而不是静默产生错误结果或非法地址崩溃。此前仅少数 spec/eagle 测试通过 envs.SGLANG_ENABLE_ASYNC_ASSERT.override(True) 选择启用,未发挥全面检测能力。本次将其提升为 CI 全局默认,使所有 CUDA 和 AMD 上的模型测试都能受益。

该 PR 值得阅读,尤其是对负责 CI 基础设施和测试策略的工程师。它展示了如何通过环境变量集中管控运行时检查,并在保持零同步开销的前提下扩大验证覆盖。设计上清晰分离了 CUDA/AMD 与 NPU/MUSA 的配置,未来如果 NPU/MUSA 支持 torch._assert_async,只需简单添加环境变量即可。

讨论亮点

该 PR 由作者独立推动,review 过程中无实质讨论或争议。有一条 /rerun-test 命令用于重跑失败测试,已通过。

实现拆解

  1. CUDA CI 工作流添加环境变量:在 .github/workflows/_pr-test-stage.ymlrerun-test.ymlnightly-test-nvidia.ymlweekly-test-nvidia.ymlnightly-72-gpu-gb200.ymlenv: 块中添加 SGLANG_ENABLE_ASYNC_ASSERT: true,覆盖所有 CUDA PR 测试、夜间测试和每周测试。
  2. AMD CI 脚本添加环境变量:在 scripts/ci/amd/amd_ci_exec.shENV_MAP 中添加 [SGLANG_ENABLE_ASYNC_ASSERT]=1,通过 docker exec -e 注入到容器中,覆盖所有 AMD 测试套件。
  3. 移除测试中的冗余 override:删除 10 个测试文件和 fixture 中的 with envs.SGLANG_ENABLE_ASYNC_ASSERT.override(True): 及相关 import,包括 eagle_fixture.pytest_eagle_constrained_decoding.pytest_deepseek_v3_fp4_mtp_small.py 等。这些测试现在直接依赖 CI 环境变量。
文件 模块 状态 重要度
.github/workflows/_pr-test-stage.yml CI 流程 modified 3.81
.github/workflows/nightly-72-gpu-gb200.yml CI 流程 modified 3.61
python/sglang/test/server_fixtures/eagle_fixture.py 测试夹具 modified 5.6
test/registered/spec/eagle/test_deepseek_v3_fp4_mtp_small.py 推测测试 modified 4.95

关键符号

EagleServerBase.setUpClass TestDeepseekV3FP4MTP.setUpClass TestEagleDPAttnServerSmall.setUpClass

关键源码片段

python/sglang/test/server_fixtures/eagle_fixture.py test-coverage

最常用的 EAGLE 测试 fixture,移除了 async assert override,代表所有测试文件的清理模式。

# 从 sglang.srt.environ 导入 envs 已移除,因为不再需要 override
from sglang.srt.utils.common import kill_process_tree
from sglang.test.test_utils import (
    DEFAULT_DRAFT_MODEL_EAGLE,
    DEFAULT_TARGET_MODEL_EAGLE,
    DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH,
    DEFAULT_URL_FOR_TEST,
    CustomTestCase,
    popen_launch_server,
)class EagleServerBase(CustomTestCase):
    target_model = DEFAULT_TARGET_MODEL_EAGLE
    draft_model = DEFAULT_DRAFT_MODEL_EAGLE
    spec_algo = "EAGLE"
    spec_steps = 5
    spec_topk = 8
    spec_tokens = 64
    mem_fraction_static = 0.7
    extra_args = []
​
    @classmethod
    def setUpClass(cls):
        cls.base_url = DEFAULT_URL_FOR_TEST
        # 之前:with envs.SGLANG_ENABLE_ASYNC_ASSERT.override(True):
        # 现在:CI 环境已默认设置 SGLANG_ENABLE_ASYNC_ASSERT=true,
        # 因此直接启动服务器,无需上下文管理器。
        cls.process = popen_launch_server(
            cls.target_model,
            cls.base_url,
            timeout=DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH,
            other_args=[
                f"--speculative-algorithm={cls.spec_algo}",
                f"--speculative-draft-model-path={cls.draft_model}",
                f"--speculative-num-steps={cls.spec_steps}",
                f"--speculative-eagle-topk={cls.spec_topk}",
                f"--speculative-num-draft-tokens={cls.spec_tokens}",
                f"--mem-fraction-static={cls.mem_fraction_static}",
            ]
            + cls.extra_args,
        )
​
    @classmethod
    def tearDownClass(cls):
        kill_process_tree(cls.process.pid, wait_timeout=60)

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  • 新增 CI 失败风险:启用异步断言后,之前被掩蔽的 NaN/Inf 等数值错误将显式抛出,可能导致现有测试新增失败。但这是预期行为,有助于暴露潜在问题。
  • NPU/MUSA 未覆盖:CUDA 和 AMD 已全部覆盖,但 NPU 和 MUSA 平台未配置该变量,这些平台上的数值错误仍可能被忽视。
  • 依赖 torch._assert_async 支持:该 API 在较新 PyTorch 版本中可用,sglang 依赖版本已满足要求,风险极低。
  • 性能影响:异步断言无需 GPU-CPU 同步,计算开销接近于零。
  • 用户:无直接用户可见变化,仅 CI 内部机制增强。
  • 系统:所有 CUDA 和 AMD 上的模型测试现在都能在关键检查点执行张量合法性验证,及早捕获异常。
  • 团队:测试代码更简洁,不再需要每个测试单独开启异步断言;CI 配置集中化管理,维护成本降低。
NPU/MUSA 未覆盖 依赖 torch._assert_async 支持 可能导致现有测试新增失败

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论