Prhub

#44852 [CI/Build][CPU] Fix flaky CI image build failure and unexpected warnings

原始 PR 作者 bigPYJ1151 合并时间 2026-06-08 19:10 文件变更 2 提交数 2 评论 1 代码增减 +5 / -4

执行摘要

修复 CPU 镜像构建竞争与早期 GC 问题

PR body 明确指出目的:一是为 Rust 构建阶段添加缓存锁,避免在同一主机上构建时发生竞争;二是添加对 release_dnnl_matmul_handler 的引用,防止 GC 过早回收。这些修复提升了 CI 的稳定性和可靠性。

此 PR 值得合并,尤其是 Docker 缓存锁的修改对构建稳定性有直接改善。虽然 _custom_ops.py 的改动很小,但它解决了一个潜在的运行时 bug,且修复方式符合 Python 资源管理的最佳实践。建议后续评估 GPU 镜像是否有类似需求。

讨论亮点

Review 中无实质技术讨论。唯一的评论来自 BugenZhao 询问为何只对 CPU 镜像应用缓存锁,作者未在 PR 中回复。这可能意味着 GPU 镜像也有类似问题但尚未修复,或者 GPU 镜像的构建机制不共享同一缓存路径。

实现拆解

  1. Dockerfile.cpu:在第 120-122 行,为三个 --mount=type=cache 目标添加 sharing=locked 参数。该参数确保多个并发构建实例在访问同一缓存目录时互斥,避免 Rust 编译缓存损坏或竞争导致的构建失败。

  2. vllm/_custom_ops.py:在 CPUDNNLGEMMHandler.__init__ 中新增一行 self.dtor = torch.ops._C.release_dnnl_matmul_handler,将 C++ 扩展函数强引用保存为实例属性。修改 __del__ 方法中原本直接调用 torch.ops._C.release_dnnl_matmul_handler 的地方为 self.dtor(...)。这样避免了 torch.ops._C 对象在 Python 垃圾回收时被提前销毁,导致 __del__ 中调用时出现 NoneType 错误。

文件 模块 状态 重要度
vllm/_custom_ops.py 核心操作 modified 4.99
docker/Dockerfile.cpu 部署脚本 modified 3.48

关键符号

CPUDNNLGEMMHandler.__init__ CPUDNNLGEMMHandler.__del__

关键源码片段

vllm/_custom_ops.py bugfix

修复 oneDNN handler 被 GC 提前回收的 bug,将 release_dnnl_matmul_handler 函数引用保存为实例属性。

class CPUDNNLGEMMHandler:
    def __init__(self) -> None:
        self.handler_tensor: torch.Tensor | None = None
        self.n = -1
        self.k = -1
        # 将 C++ 函数的引用保存为实例属性,防止 Python GC 在 __del__ 之前
        # 回收 torch.ops._C 导致 self.dtor 变成 None
        self.dtor = torch.ops._C.release_dnnl_matmul_handler
​
    def __del__(self):
        if self.handler_tensor is not None:
            # 通过实例属性调用,避免直接访问可能已被 GC 的 torch.ops._C
            self.dtor(self.handler_tensor.item())
docker/Dockerfile.cpu infrastructure

为 cargo 缓存挂载添加 sharing=locked 参数,防止并发构建时的缓存竞争。

# 添加 sharing=locked 确保并发构建时互斥访问 cargo 缓存,
# 避免 Rust 编译缓存损坏或竞争导致的构建失败
RUN --mount=type=cache,target=/root/.cargo/registry,sharing=locked \
    --mount=type=cache,target=/root/.cargo/git,sharing=locked \
    --mount=type=cache,target=/workspace/rust/target,sharing=locked \
    VLLM_RS_TARGET_PATH=/workspace/vllm-rs bash build_rust.sh

评论区精华

缓存锁是否应应用于 GPU 镜像 other

BugenZhao 询问为何缓存锁只应用于 CPU 镜像,作者未在 PR 中回复。

结论:无回应,可能 GPU 镜像无类似问题或待后续处理。 · unresolved

风险与影响

低风险。Dockerfile 的修改仅影响 CPU 镜像构建流程,且 sharing=locked 是 BuildKit 的标准功能,无副作用。_custom_ops.py 的改动只是保存函数引用,不影响原有逻辑,即使 dtor 属性被覆盖,__del__ 行为也不会更差。

影响范围较小,主要影响 vLLM CPU 镜像的 CI 构建流程。修复后,CPU 镜像的构建失败率应显著降低,同时避免了运行时 oneDNN handler 可能因 GC 提前回收导致的崩溃。团队可减少维护 CI 构建失败的工作量。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论