Prhub

#44615 [Bugfix] Fix gemma4 crash on CPU: guard mem_get_info call

原始 PR 作者 adhithyamulticoreware 合并时间 2026-06-05 20:47 文件变更 1 提交数 6 评论 7 代码增减 +5 / -0

执行摘要

为 CpuPlatform 补充 mem_get_info,修复 gemma4 CPU 崩溃

关联 Issue #44039 报告了 gemma4 在 CPU 上运行时 _process_video_input 无法使用的问题。根本原因是 CPU 平台缺少 mem_get_info 方法,导致多模态编码分块逻辑无条件调用一个实际为 None 的可调用对象而崩溃。该修复是让 gemma4 多模态处理在 CPU 上正常运行的前提步骤。

本 PR 虽然代码量小,但展示了一个很好的设计决策过程:从临时“补丁”到根本修复的转变。对于理解 vLLM 平台抽象层(Platform 类体系)以及如何优雅地处理平台差异,这是一个值得学习的小案例。建议平台层相关开发者阅览。

讨论亮点

设计讨论:bigPYJ1151 提出不应只在调用处加保护,而应在 CpuPlatform 中完整实现 mem_get_info。贡献者采纳此建议,彻底修复问题。

测试讨论:bigPYJ1151 认为新增的测试不必要,要求删除。贡献者遵从反馈移除了测试。

实现拆解

  1. 问题定位:排查发现 current_platform.mem_get_info 在 CPU 平台返回 None(因为 Platform.getattr 的 fallback 机制),导致 TypeError。
  2. 初始修复尝试:贡献者最初在 gemma4_mm.py 中通过 callable() 守卫临时避免崩溃。
  3. Reviewer 指导:bigPYJ1151 指出更根本的解决方法是在 CpuPlatform 中实现 mem_get_info 方法,并利用 cpu_resource_utils.get_memory_node_info 获取真实内存数据。
  4. 最终实现:在 vllm/platforms/cpu.py 中添加了 @classmethod mem_get_info,返回 (available_memory, total_memory) 元组。
  5. 测试清理:应 reviewer 要求,移除了之前为测试新增的测试函数。
文件 模块 状态 重要度
vllm/platforms/cpu.py 平台层 modified 5.93

关键符号

CpuPlatform.mem_get_info

关键源码片段

vllm/platforms/cpu.py core-logic

唯一变更文件,为 CpuPlatform 添加 mem_get_info 类方法,解决崩溃根因。

# vllm/platforms/cpu.py 中 CpuPlatform 类的部分@classmethod
def get_device_total_memory(cls, device_id: int = 0) -> int:
    # 已有方法,展示了 get_memory_node_info 的使用方式
    meminfo = get_memory_node_info(device_id)
    return meminfo.total_memory@classmethod
def mem_get_info(cls) -> tuple[int, int]:
    """
    返回 (available_memory, total_memory) ,单位字节。
    该方法与 torch.cuda.mem_get_info 接口保持一致,
    用于满足多模态编码分块时对当前可用内存的查询需求。
    """
    meminfo = get_memory_node_info() # 默认 device_id=0
    return meminfo.available_memory, meminfo.total_memory

评论区精华

从调用处保护转向 CpuPlatform 实现 设计

bigPYJ1151 在评论中指出,与其在 gemma4_mm.py 中加 callable 保护,不如在 CpuPlatform 中正确实现 mem_get_info 接口,并使用 cpu_resource_utils 中的 get_memory_node_info 查询真实内存状态。

结论:贡献者 adhithyamulticoreware 接受了建议,修改为在 CpuPlatform 中添加 mem_get_info 方法,调用 get_memory_node_info 实现。 · 已解决

移除不必要的测试 测试

bigPYJ1151 要求删除之前添加的测试 test_cpu_platform_mem_get_info_returns_valid_memory,认为该测试不必要。

结论:贡献者移除了测试,并确认完成。 · 已解决

风险与影响

主要风险:mem_get_info 实现中调用 get_memory_node_info() 未传递 device_id 参数,而同类的 get_device_total_memory 却传递了 device_id。对于多 CPU 节点环境,当前实现可能始终查询节点 0,无法感知其他节点的内存状态。不过 vLLM 的 CPU 后端目前仅支持单节点,此风险在当前使用场景下较低。

其他风险:缺少针对 mem_get_info 返回值的回归测试,但 reviewer 明确认为不需要测试,因此该风险被接受。

直接影响:gemma4 多模态处理(图像/视频)现在可在 CPU 平台上正常执行,不会再因 TypeError 崩溃。

对 GPU 等其他平台无任何影响。变更仅涉及 cpu.py 一个文件,且仅新增一个方法,侵入性极小。用户无需调整使用方式即可受益。

关联 Issue

#44039 [Bug]: gemma4 _process_video_input not supported on CPU

完整报告

参与讨论