Prhub

#49966 [Bugfix] Respect cgroup memory limits on all platforms

原始 PR 作者 chaunceyjiang 合并时间 2026-07-28 14:38 文件变更 1 提交数 4 评论 1 代码增减 +1 / -3

执行摘要

修复 cgroup 内存限制在非 ROCm 平台被忽略

用户报告在 Pod 中设置 memory limit 后,vLLM 仍然认为主机有 865 GB 可用内存,从而错误地禁用 Auto-prefetch。根本原因是 _get_available_ram_bytes 仅在 ROCm 平台上读取 cgroup 限制,其他平台直接返回 psutil.virtual_memory().available

值得快速合并。这是一个小而正确的 bugfix,修复了容器场景下的常见问题。建议阅读时关注 _get_available_ram_bytesget_cgroup_memory_limit 的配合逻辑。

讨论亮点

审核人 AndreasKaratzas 评论“LGTM. Did not want to change the entire datapath, that's why I did not update it for other platforms in my PR.” 表明原 ROCm PR 作者有意限制了平台范围,而当前 PR 将其通用化,得到认可。

实现拆解

  1. vllm/model_executor/model_loader/weight_utils.py 中修改 _get_available_ram_bytes 函数:移除 if not current_platform.is_rocm(): return host_available 的条件判断,使所有平台都执行 cgroup 内存限制读取逻辑。
  2. 更新函数 docstring,从“honoring cgroup limits on ROCm”改为“honoring cgroup limits”,反映通用化语义。
  3. 该函数依赖 get_cgroup_memory_limit,该函数已实现在 vllm.utils.cpu_resource_utils 中,并支持跨平台(Linux cgroup v1/v2),因此无需新增依赖。
文件 模块 状态 重要度
vllm/model_executor/model_loader/weight_utils.py 模型加载器 modified 5.28

关键符号

_get_available_ram_bytes

关键源码片段

vllm/model_executor/model_loader/weight_utils.py core-logic

核心变更文件,修改了 `_get_available_ram_bytes` 函数,移除仅 ROCm 平台的 cgroup 限制检查,使其在所有平台生效。

def _get_available_ram_bytes() -> int:
    """Return available RAM, honoring cgroup limits."""
    import psutil
​
    host_available = psutil.virtual_memory().available
​
    # 从 cgroup 获取容器内存限制(适用于 Linux cgroup v1/v2)
    from vllm.utils.cpu_resource_utils import get_cgroup_memory_limit
​
    cgroup_limit, cgroup_usage = get_cgroup_memory_limit()
    if cgroup_limit is None:
        # 非容器环境或无法读取 cgroup,直接返回主机可用内存
        return host_available
    cgroup_available = (
        cgroup_limit if cgroup_usage is None else max(0, cgroup_limit - cgroup_usage)
    )
    # 取主机可用内存和容器可用内存的较小值
    return min(host_available, cgroup_available)

评论区精华

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

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

风险与影响

风险较低。变更仅移除一条提前返回语句,逻辑在所有平台统一。get_cgroup_memory_limit 已有对非 Linux 或非 cgroup 环境的 None 返回处理,不影响裸机运行。

影响所有非 ROCm 的 Linux 容器用户(主要是 CUDA 用户),使其在 Pod 中设置的 memory limit 被正确读取,避免 Auto-prefetch 被错误禁用。裸机或非 Linux 平台无变化。

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论