Prhub

#40575 [Build] Fall back to system libgomp when torch has no vendored copy

原始 PR 作者 lyd1992 合并时间 2026-05-06 11:42 文件变更 1 提交数 3 评论 6 代码增减 +14 / -9

执行摘要

CMake 构建回退系统 libgomp 支持非 x86 平台

PR body 指出,当 PyTorch 从源码构建或从发行版打包时(常见于 RISC-V、s390x、Fedora/RHEL aarch64),vllm_prepare_torch_gomp_shim() 生成的 shim 目录为空,后续 find_library(OPEN_MP ... NO_DEFAULT_PATH REQUIRED) 强制在此目录查找会导致 CMake 错误。此问题阻碍了这些平台的 CPU 扩展构建。

建议合并。该 PR 解决了特定平台上的构建阻塞问题,改动清晰、经过 review 迭代,且作者在 RISC-V 硬件上进行了实际测试。代码质量高,值得作为 CMake 最佳实践的参考。

讨论亮点

Review 中 gemini-code-assist[bot] 提出了两点关键意见:

  1. 变量 ${VLLM_TORCH_GOMP_SHIM_DIR} 应使用双引号包裹,避免路径包含空格时 find_library 失败。
  2. 使用 MATCHES 检查路径前缀是脆弱的,因为路径中特殊字符会被解释为正则元字符,建议使用 cmake_path(IS_PREFIX)
    作者 lyd1992 采纳建议,重构为显式 if(VLLM_TORCH_GOMP_SHIM_DIR)/else() 分支,完全避免了正则匹配,并添加了路径引用。

实现拆解

  1. 分离 vendored 与系统 libgomp 路径逻辑:在 cmake/cpu_extension.cmake 中,将原单一的 find_library 调用替换为 if(VLLM_TORCH_GOMP_SHIM_DIR) / else() 分支。如果 shim 目录非空(即 PyTorch 提供了 vendored libgomp),则从该目录查找;否则回退到系统路径查找。
  2. 修复 LD_LIBRARY_PATH 设置:原代码无条件设置 LD_LIBRARY_PATH 包含 shim 目录。新代码仅在使用了 vendored libgomp 时(即 if(VLLM_TORCH_GOMP_SHIM_DIR) 分支内)设置,避免空目录或无关目录干扰。
  3. 引用安全性增强:根据 review 建议,将路径变量用双引号包裹,避免因路径包含空格导致 CMake 解析错误。
文件 模块 状态 重要度
cmake/cpu_extension.cmake 构建配置 modified 4.56

关键源码片段

cmake/cpu_extension.cmake core-logic

核心构建配置文件,实现 libgomp 查找逻辑的 fallback 机制,是 PR 唯一修改的文件。

# locate PyTorch's libgomp (e.g. site-packages/torch.libs/libgomp-*.so)
# and create a local shim dir with it. When PyTorch is built from source or packaged
# by a distro (common on RISC-V, s390x, Fedora/RHEL aarch64), no vendored libgomp
# exists and the shim dir is empty; fall back to the system libgomp in that case.
vllm_prepare_torch_gomp_shim(VLLM_TORCH_GOMP_SHIM_DIR)if(VLLM_TORCH_GOMP_SHIM_DIR)
  # PyTorch has a vendored libgomp — use it exclusively
  find_library(OPEN_MP
    NAMES gomp
    PATHS "${VLLM_TORCH_GOMP_SHIM_DIR}"
    NO_DEFAULT_PATH # Only search the shim dir
    REQUIRED
  )
  # Set LD_LIBRARY_PATH to use the same libgomp as PyTorch at build time
  set(ENV{LD_LIBRARY_PATH} "${VLLM_TORCH_GOMP_SHIM_DIR}:$ENV{LD_LIBRARY_PATH}")
else()
  # Fall back to system / toolchain libgomp (common on non-x86 platforms)
  find_library(OPEN_MP NAMES gomp REQUIRED)
endif()

评论区精华

路径变量引用安全性 style

gemini-code-assist[bot] 指出 `${VLLM_TORCH_GOMP_SHIM_DIR}` 应使用双引号包裹,避免路径含空格时解析错误。

结论:作者在后续 commit 中添加了双引号。 · 已解决

路径前缀匹配的健壮性 设计

gemini-code-assist[bot] 指出使用 `MATCHES` 进行路径前缀匹配脆弱,建议改用 `cmake_path(IS_PREFIX)`。

结论:作者完全重构逻辑为显式分支,避免了正则匹配。 · 已解决

风险与影响

风险较低。该修改主要影响非 x86_64 平台(RISC-V、s390x、aarch64 等)的 CPU 扩展构建流程。对于 x86_64 pip wheel 用户,由于 shim 目录非空,行为与之前完全一致。潜在风险:如果系统 libgomp 版本与 PyTorch 期望的版本不兼容,可能导致运行时问题,但概率较低且易于诊断。

直接影响:解除了在 RISC-V、s390x、Fedora/RHEL aarch64 等平台上使用系统提供的 PyTorch 时构建 CPU 扩展的阻塞。影响范围限于构建时,不涉及运行时行为变更。对 x86_64 用户无影响。

平台兼容性变更 仅在特定非 x86 路径生效

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论