执行摘要
本次 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 资源隔离。
参与讨论