Prhub

#21331 [CI] Rewrite `killall_sglang` as Python with CI/local dual mode

sgl-project/sglang · 作者 alisonshao · 合并时间 2026-03-25 14:54

分析状态 已生成
文件变更 5提交数 14 · 评论 5
代码增减 +275 / -2
ci bugfix refactor

执行摘要

重写 killall_sglang 为 Python 脚本,实现 GPU 范围限制的 CI 清理,避免跨容器进程误杀。

PR body 中指出,在共享主机容器中(使用 --pid=host),pgrep 会看到所有容器的进程,导致 killall_sglang.sh 杀死其他容器的 sglang 进程,产生 spurious exit code -9 失败。因此,需要将 kill 操作限制在当前容器的 GPU 上,仅影响 CUDA_VISIBLE_DEVICES 分配的 GPU,以避免跨容器干扰。

该 PR 值得精读,特别是其 GPU 隔离机制和双模式设计(CI 与本地),对优化多 GPU CI 环境有参考价值。关注关键函数如 _get_target_gpus 和 _kill_pids 的实现细节,以及内存检查逻辑,有助于理解如何处理跨容器资源冲突。

讨论亮点

review 评论为空,表示无讨论或直接合并,因此无争议点或决策结论。从提交历史看,变更经历了多次演进(14 次提交),包括合并、简化代码、移除冗余路径等,但缺乏公开讨论。

实现拆解

实现分为几个关键部分:

  1. 新增 Python 脚本 python/sglang/cli/killall.py,包含核心逻辑:通过 nvidia-smi 查询 GPU 进程,根据 CUDA_VISIBLE_DEVICES 环境变量(仅支持数字索引)获取目标 GPU,杀死相关进程,并在清理后检查 GPU 内存使用率,若超过 10% 则退出码为 1。
  2. 修改 CI 配置文件 .github/workflows/pr-test-rust.yml,添加环境变量 SGLANG_IS_IN_CI=true,以启用 CI 模式。
  3. 更新 CI 安装脚本 scripts/ci/cuda/ci_install_dependency.sh,将调用从 bash scripts/killall_sglang.sh all 改为 python3 python/sglang/cli/killall.py,并检查退出码。
  4. 在 pyproject.toml 中添加 killall_sglang 命令行入口点,便于直接调用。
  5. 修改原 shell 脚本 scripts/killall_sglang.sh,添加弃用注释,保留其默认/rocm/all/gpus 模式供本地使用。
文件 模块 状态 重要度
python/sglang/cli/killall.py cli added 9.0
.github/workflows/pr-test-rust.yml CI workflows modified 7.0
scripts/ci/cuda/ci_install_dependency.sh CI scripts modified 6.0
scripts/killall_sglang.sh scripts modified 4.0
python/pyproject.toml package configuration modified 3.0

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

关键符号

_run_smi _get_pid_cmdline _kill_pids _get_target_gpus _get_gpu_pids main

评论区精华

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

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

风险与影响

技术风险包括:

  • 依赖于外部工具 nvidia-smi:在非 NVIDIA 环境或 nvidia-smi 不可用时,脚本会失败(例如在 AMD 或 CPU 环境中)。
  • CUDA_VISIBLE_DEVICES 支持有限:仅处理数字索引(如 '0,1'),不支持 UUID 格式(如 'GPU-xxx'),可能在某些配置下无效。
  • 内存检查阈值:10% 的内存使用率阈值可能导致误报(例如正常残留内存),触发 CI 提前退出,影响测试连续性。
  • 环境变量 SGLANG_IS_IN_CI 设置:若未正确设置,可能导致 CI 模式不生效或行为不一致。
  • 兼容性问题:原 shell 脚本标记为弃用,未来迁移时需处理其多种模式(如 rocm)的替代方案。

影响范围:

  • 对 CI 系统:直接提高测试稳定性和隔离性,减少因跨容器进程误杀导致的失败,优化 CI 资源使用。影响程度为中度,主要影响共享主机环境的 CI 运行。
  • 对用户:本地用户仍可使用原 shell 脚本,影响较小;但未来迁移可能需要更新使用习惯。
  • 对团队:改进了 CI 流程,减少维护成本,但增加了对 Python 脚本的依赖和维护。
依赖外部工具 nvidia-smi 仅支持数字 CUDA_VISIBLE_DEVICES 内存检查可能误报

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

本次 PR 将 killall_sglang 脚本从 shell 重写为 Python 版本,引入 CI 模式以限制在 CUDA_VISIBLE_DEVICES 指定的 GPU 上进行进程清理,解决共享主机容器中跨容器进程误杀导致的 CI 失败问题。同时保留原脚本供本地使用,标记为弃用。该变更提升了 CI 测试的隔离性和稳定性,但依赖于 NVIDIA 工具和特定环境配置。

功能与动机

动机:在共享主机容器(如 H100 RadixArk)中,使用 --pid=host 导致 pgrep 看到所有容器的进程。这使 killall_sglang.sh 在 CI 启动和测试清理时,误杀其他容器的 sglang 进程,产生 exit code -9 失败。因此,需要将 kill 操作限制在当前容器分配的 GPU 上,避免跨容器干扰。

功能:新增 Python 脚本 killall.py,在 CI 模式下通过 nvidia-smi 查询 GPU 进程,仅杀死 CUDA_VISIBLE_DEVICES 中的 GPU 相关进程,并在清理后检查内存使用率(超过 10% 则退出)。原 shell 脚本保留为本地使用,但标记为弃用。

实现拆解

模块 关键改动 描述
Python CLI 脚本 新增 python/sglang/cli/killall.py 核心实现:使用 _run_smi 查询 GPU 信息,_get_target_gpus 解析 CUDA_VISIBLE_DEVICES_kill_pids 杀死进程,并添加内存阈值检查。代码片段:
```python
def _get_target_gpus():
cvd = os.environ.get("CUDA_VISIBLE_DEVICES")
if cvd is not None and cvd.strip():
return {int(g.strip()) for g in cvd.split(",") if g.strip().isdigit()}
return {int(line) for line in _run_smi("index") if line.isdigit()}
```
CI 工作流 修改 .github/workflows/pr-test-rust.yml 添加环境变量 SGLANG_IS_IN_CI: true,确保 CI 模式生效,并将调用从 bash 脚本改为 Python 脚本。
CI 安装脚本 修改 scripts/ci/cuda/ci_install_dependency.sh 替换 killall 调用为 python3 python/sglang/cli/killall.py,并检查退出码,若内存异常则提前退出 CI。
包配置 修改 python/pyproject.toml 添加 killall_sglang 命令行入口点,便于用户直接调用。
原脚本保留 修改 scripts/killall_sglang.sh 添加弃用注释和 TODO,保留默认/rocm/all/gpus 模式供本地使用,确保向后兼容。

评论区精华

review 评论区为空,表明无公开讨论或直接合并。但从提交历史(14 次提交)可见多次演进,如合并、简化代码、移除冗余路径,这反映了内部迭代优化,但缺乏外部技术交锋。

风险与影响

技术风险

  • 依赖 nvidia-smi 工具,在非 NVIDIA 环境(如 AMD 或 CPU)中可能失败,需确保环境兼容。
  • CUDA_VISIBLE_DEVICES 仅支持数字索引(如 '0,1'),不支持 UUID 格式(如 'GPU-xxx'),限制使用场景。
  • 内存阈值检查(10%)可能导致误报,例如正常残留内存触发 CI 退出,影响测试连续性。
  • 环境变量 SGLANG_IS_IN_CI 若设置不当,可能导致 CI 模式不生效,引发行为不一致。

影响评估

  • 对 CI 系统:显著提升测试稳定性和资源隔离性,减少跨容器干扰导致的失败,影响程度为中度。
  • 对用户:本地用户无直接影响,但未来迁移需适应新脚本;团队需维护双模式脚本,增加一定复杂度和依赖。

关联脉络

近期历史 PR 显示 CI 优化是持续趋势:

  • PR #21330 默认启用 failfast 优化测试执行,与本 PR 的清理功能互补,共同提升 CI 效率。
  • PR #21341 添加跨作业健康检查,与本 PR 的内存检查机制类似,都旨在增强 CI 稳定性和资源管理。
  • PR #21364 修复 CI 工作流程标签,展示了对基础设施的持续维护。
    这些 PR 共享 'ci' 和 'infra' 标签,反映了团队在改进 CI 流程、减少 flakiness 方面的系统化努力,本 PR 是这一脉络中的关键一环,专注于 GPU 资源隔离。

参与讨论