Prhub

#21797 Fix killall.py crash when sglang is not yet installed

原始 PR 作者 hnyls2002 合并时间 2026-04-01 08:40 文件变更 1 提交数 2 评论 2 代码增减 +17 / -3

执行摘要

修复 killall.py 在 sglang 未安装时的导入崩溃问题,确保 CI 稳定。

PR body 中明确指出:'killall.py runs before pip install -e in CI, but since #21780 it imports from sglang.srt.utils.common import get_nvidia_driver_version_str',导致在 sglang 未安装的 runner(如新 runner 或路径变更时)上出现 ModuleNotFoundError,CI 测试确定性失败。

该 PR 变更简单直接,不值得精读,除非关注 CI 脚本细节或 import 依赖管理。可关注内联外部命令调用的模式,以避免模块导入依赖。

讨论亮点

无 review 评论或讨论,PR 直接由作者合并。

实现拆解

改动集中于单个文件 python/sglang/cli/killall.py_get_smi_version 函数。移除了导入语句 from sglang.srt.utils.common import get_nvidia_driver_version_str,并内联了 nvidia-smi 子进程调用,直接查询驱动版本。具体逻辑使用 subprocess.run 执行 nvidia-smi 命令,添加异常处理以确保失败时返回 None。

文件 模块 状态 重要度
python/sglang/cli/killall.py cli modified 4.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

_get_smi_version

评论区精华

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

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

风险与影响

风险较低,因为变更仅替换了导入为直接命令调用,逻辑一致。潜在风险包括:nvidia-smi 命令可能在某些环境下不可用(如非 NVIDIA GPU),但已有 FileNotFoundError 处理;子进程调用可能因超时或权限问题失败,但设置了 10 秒超时和异常捕获。未新增测试覆盖,但修复本身通过 CI 验证。

影响仅限于 CI 运行中的 killall.py 脚本:解决了 runner 新安装或路径变更时的崩溃问题,提高 CI 稳定性和可靠性。对用户或生产系统无直接影响,因为 killall.py 主要用于 CI 清理过程。

依赖外部命令

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

本 PR 修复了 CI 中 killall.py 脚本因导入 sglang 模块而崩溃的问题,通过内联 nvidia-smi 查询代码避免依赖,确保 CI 在新 runner 或路径变更时稳定运行。变更范围小,风险低,属常规维护。

功能与动机

此修复源于 CI 测试中的确定性失败:killall.pypip install -e 之前运行,但自 PR #21780 引入后,它导入 from sglang.srt.utils.common import get_nvidia_driver_version_str。在未安装 sglang 的 runner 上(如新 runner 或 git clean 后),该导入会立即失败,导致 ModuleNotFoundError。PR body 中详细说明了失败证据,强调这不是 flaky 测试,而是会随 runner 增加而加剧的问题。

实现拆解

改动仅涉及 python/sglang/cli/killall.py 文件的 _get_smi_version 函数。关键变更包括:

  • 移除导入依赖:删除 from sglang.srt.utils.common import get_nvidia_driver_version_str
  • 内联 nvidia-smi 查询:添加 subprocess.run 调用,直接执行 nvidia-smi --query-gpu=driver_version 命令,并捕获输出。
  • 异常处理:使用 try-except 块处理 SubprocessErrorFileNotFoundError,失败时返回 None

代码示例:

try:
    result = subprocess.run(
        [
            "nvidia-smi",
            "--query-gpu=driver_version",
            "--format=csv,noheader,nounits",
        ],
        capture_output=True,
        text=True,
        check=True,
        timeout=10,
    )
    driver = result.stdout.strip().split("\n")[0].strip() or None
except (subprocess.SubprocessError, FileNotFoundError):
    driver = None

评论区精华

无 review 讨论或评论,PR 直接由作者合并。这表明变更被认可为简单修复,无需进一步审查。

风险与影响

风险分析

  • 低风险:变更逻辑与原函数一致,仅替换导入为命令调用。
  • 外部依赖:依赖 nvidia-smi 命令的可用性,但已有异常处理。
  • 测试覆盖:未新增单元测试,但修复通过 CI 验证。

影响分析

  • CI 稳定性:解决了 runner 未安装 sglang 时的崩溃,提高 CI 成功率。
  • 系统影响:不涉及核心功能或用户接口,仅影响内部 CI 脚本。
  • 长期影响:减少因环境差异导致的 flaky 测试,提升开发效率。

关联脉络

此 PR 直接关联到 PR #21780("[Fix] Fall back to triton MOE for GPT-OSS on Blackwell with driver >= 595"),后者引入了对 sglang.srt.utils.common 的导入,导致本问题。近期历史 PR 中,多个涉及 CI 和 bugfix 的 PR(如 #21778 缓存 Nvidia wheels、#21729 修复 HF API 速率限制)显示团队正持续优化 CI 流程和稳定性。本修复是这一趋势的延续,聚焦于消除 import 依赖导致的脆弱性。

参与讨论