Prhub

#43813 [Bug] Fix `tests/distributed/test_elastic_ep.py - assert False`

原始 PR 作者 yewentao256 合并时间 2026-05-28 23:00 文件变更 1 提交数 1 评论 0 代码增减 +6 / -2

执行摘要

修复 CpuGpuBuffer 在推理模式下不可变导致测试失败

弹性 EP 测试 tests/distributed/test_elastic_ep.py 报错 RuntimeError: Inplace update to inference tensor outside InferenceMode is not allowed,原因是 CpuGpuBuffertorch.inference_mode() 下创建张量(不可变),但测试中需要 inplace 更新缓冲区。PR body 贴出了完整的 traceback 定位到问题。

建议快速合并,属于明确的单点修复。可作为 PyTorch inference mode 下 mutable buffer 使用模式的参考案例。

讨论亮点

无 review 评论。

实现拆解

  1. 定位问题:traceback 显示 CpuGpuBuffer.__init__ 在 inference mode 下创建 self.cpuself.gpu,后续 _switch_and_prepare 中的 inplace 操作触发 PyTorch 保护。
  2. 修改 vllm/v1/utils.pyCpuGpuBuffer.__init__:将 torch.zerostorch.zeros_like 调用包裹在 with torch.inference_mode(False): 上下文管理器中,确保缓冲区张量在普通模式下创建,允许后续 inplace 更新。
  3. 仅改动单个文件,+6/-2 行,不涉及其他模块,不新增配置或依赖。
文件 模块 状态 重要度
vllm/v1/utils.py 运行时工具 modified 5.45

关键符号

CpuGpuBuffer.__init__

关键源码片段

vllm/v1/utils.py core-logic

修复核心:在 `CpuGpuBuffer.__init__` 中通过 `torch.inference_mode(False)` 上下文管理器创建可变的 CPU/GPU 缓冲区张量。

class CpuGpuBuffer:
    """Buffer to easily copy tensors between CPU and GPU."""
​
    def __init__(
        self,
        *size: int | torch.SymInt,
        dtype: torch.dtype,
        device: torch.device,
        pin_memory: bool,
        with_numpy: bool = True,
    ) -> None:
        # 这些缓冲区是可变运行时状态,因此需要以普通模式分配
        # 避免在 torch.inference_mode() 下创建不可变张量,
        # 否则后续 inplace 更新会报 RuntimeError
        with torch.inference_mode(False):
            self.cpu = torch.zeros(
                *size, dtype=dtype, device="cpu", pin_memory=pin_memory
            )
            self.gpu = torch.zeros_like(self.cpu, device=device)
        self.np: np.ndarray
        if with_numpy:
            if dtype == torch.bfloat16:
                raise ValueError(
                    "Bfloat16 torch tensors cannot be directly cast to a "
                    "numpy array, so call CpuGpuBuffer with with_numpy=False"
                )
            self.np = self.cpu.numpy()

评论区精华

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

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

风险与影响

低风险:变更范围极小,仅修改了 CpuGpuBuffer 构造逻辑,不影响缓冲区读写接口或性能。潜在风险是如果其他位置依赖 inference mode 进行图优化(如 CUDA graphs),但此处仅为初始化阶段,风险可忽略。

影响范围局限于 CpuGpuBuffer 的使用者(弹性 EP 测试),不影响生产路径。修复了 test_elastic_ep_scaling 测试失败,2 个测试用例均通过。

测试覆盖不足

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论