Prhub

#51185 [Bugfix][Build] Patch stable string memleak fix from 2.14 for 2.13

原始 PR 作者 janeyx99 合并时间 2026-08-09 12:12 文件变更 2 提交数 3 评论 5 代码增减 +43 / -0

执行摘要

为 Torch 2.13 补丁 stable ABI 字符串内存泄漏修复

PyTorch 的 stable ABI 头文件存在字符串内存泄漏问题,已在 2.14 中修复,但 vllm 当前仍使用 2.13,因此需要临时移植修复。PR body 明确说明:'The stable ABI header had a memory leak for strings that was patched recently... This PR ports it over for the interim. This PR should be reverted once torch 2.14 is the build version for vllm.' 该问题也关联 issue #50150。

该 PR 值得快速审查,因为它是一个针对特定版本问题的临时补丁,逻辑清晰,风险可控。可关注其 CMake 实现中条件检测和 shadow 目录的技巧,这为类似临时补丁提供了可复用模式。建议在 Torch 2.14 升级时确保回滚此补丁。

讨论亮点

主要评论来自 Harry-Chen:

  • 在评论中提醒 @atalman 在后续做 Torch 2.14 升级时,需包含对本 PR 的回滚。
  • 提交了第二个 commit 将 CMakeLists 改为使用 ephemeral header(临时头文件)的方式,即复制到构建目录再 patch,而不是直接修改系统头文件,以保持构建的清洁性。
  • 该 PR 修复 issue #50150(由 ashgold 在评论中确认)。

实现拆解

实现分为两步:

  1. 新增 patch 文件 cmake/patches/pytorch_stable_string.patch,内容修改 torch/csrc/stable/stableivalue_conversions.h 中的 stringFromIValue 函数,将原先通过 new std::string 创建并在函数返回时通过指针返回(存在泄漏风险)改为直接返回局部 std::string 对象,利用移动语义安全转移所有权,避免手动内存管理。
  2. CMakeLists.txt 中,针对 Torch 版本在 [2.13, 2.14) 区间时,检测头文件中是否包含旧代码模式 auto strptr = new std::string,若存在则复制头文件到构建目录的 shadow 目录,并用 patch 命令应用该补丁,最后将该 shadow 目录置于 include 路径最前,使编译时使用已修复的头文件。同时添加注释说明该 hotfix 应在升级到 2.14 后删除。
    该实现避免了修改系统安装的 Torch 头文件,保证了构建的隔离性和可重复性。
文件 模块 状态 重要度
cmake/patches/pytorch_stable_string.patch 构建脚本 added 4.17
CMakeLists.txt 构建脚本 modified 3.48

关键源码片段

CMakeLists.txt configuration

这是补丁的触发和应用逻辑,确保在合适的 Torch 版本下正确应用补丁,并保持构建的隔离性。

if(Torch_VERSION VERSION_GREATER_EQUAL "2.13" AND
   Torch_VERSION VERSION_LESS "2.14")
  # hotfix for https://github.com/pytorch/pytorch/pull/190493
  # delete after we bump to 2.14
  list(GET TORCH_INCLUDE_DIRS 0 TORCH_INCLUDE_DIR)
  set(_stable_hdr_rel "torch/csrc/stable/stableivalue_conversions.h")
  file(READ "${TORCH_INCLUDE_DIR}/${_stable_hdr_rel}"
       TORCH_STABLE_STRING_CONTENTS)  if(TORCH_STABLE_STRING_CONTENTS MATCHES "auto strptr = new std::string")
    set(TORCH_SHADOW_INCLUDE_DIR
        "${CMAKE_CURRENT_BINARY_DIR}/torch_patched_headers")    file(MAKE_DIRECTORY "${TORCH_SHADOW_INCLUDE_DIR}/torch/csrc/stable")
    file(COPY_FILE
         "${TORCH_INCLUDE_DIR}/${_stable_hdr_rel}"
         "${TORCH_SHADOW_INCLUDE_DIR}/${_stable_hdr_rel}")    execute_process(
      COMMAND patch --batch --forward -p1
              "--input=${CMAKE_CURRENT_LIST_DIR}/cmake/patches/pytorch_stable_string.patch"
      WORKING_DIRECTORY "${TORCH_SHADOW_INCLUDE_DIR}"
      COMMAND_ERROR_IS_FATAL ANY)    include_directories(BEFORE "${TORCH_SHADOW_INCLUDE_DIR}")
  endif()
endif()

评论区精华

提醒升级 2.14 时回滚 other

Harry-Chen 评论:'cc @atalman: Should you do the torch 2.14 transition later, please include a revert of this PR in your changes. Thx!'

结论:确认需要回滚,但未指定具体计划。 · 已解决

修复 issue #50150 other

ashgold 评论:'This PR fix https://github.com/vllm-project/vllm/issues/50150'

结论:确认此 PR 修复了该 issue。 · 已解决

风险与影响

主要风险包括:

  • 补丁仅在 Torch 2.13.x 中有效,若 Torch 2.13 小版本更新导致头文件变化,补丁可能无法应用,进而导致构建失败(CMake 中 COMMAND_ERROR_IS_FATAL ANY 会直接终止)。
  • 当前使用 file(READ)MATCHES 检测头文件内容,若检测不准确,可能在不需要时也尝试打补丁,或漏掉需要补丁的情况。
  • 该补丁是临时修复,若忘记在升级 2.14 后回滚,可能引起不必要的构建复杂度。不过,由于补丁仅在非 2.14 版本触发,风险相对可控。

影响范围限于构建过程,不改变运行时行为。修复了 stable ABI 扩展中的字符串内存泄漏,可提升长期运行服务的稳定性(避免内存增长)。对用户无感知,对构建系统的可维护性有轻微影响(增加临时补丁逻辑),但通过清晰注释和条件限定降低了维护成本。

临时补丁 构建脚本变更

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论