执行摘要
- 一句话:C++标准从17升级到20以兼容PyTorch
- 推荐动作:建议精读该PR,尤其是评论中关于PyTorch C++标准演进方向的讨论。它反映了下游项目如何应对上游依赖的breaking change,对于维护大型分布式系统具有参考价值。
功能与动机
PyTorch头文件(如torch/all.h和ATen/ATen.h)现在强制要求C++20(__cplusplus < 202002L时会触发#error),vLLM若仍使用C++17则无法与新版PyTorch一起编译。PR body明确说明此问题已导致PyTorch出现回退事件。
实现拆解
该PR通过修改3个CMake文件,将C++标准从17升级到20:
- 主CMakeLists.txt:设置
CMAKE_CXX_STANDARD 20,并新增CMAKE_CUDA_STANDARD 20和CMAKE_HIP_STANDARD 20及其_REQUIRED版本,确保CUDA和HIP代码也使用C++20标准。
- cmake/cpu_extension.cmake:将
CMAKE_CXX_STANDARD从17改为20,保持与主配置一致。
- cmake/external_projects/deepgemm.cmake:移除硬编码的
-std=c++17编译选项,因为全局CMake标准设置已经生效,避免冗余和潜在冲突。
没有测试或文档配套变更。
关键文件:
CMakeLists.txt(模块 构建系统;类别 infra;类型 core-logic): 主构建配置文件:设置了全局 C++20 标准,并新增 CUDA/HIP 标准的显式声明,是最核心的变更文件。
cmake/cpu_extension.cmake(模块 构建系统;类别 infra;类型 core-logic): CPU 扩展的构建配置,与主配置同步升级 C++ 标准。
cmake/external_projects/deepgemm.cmake(模块 构建系统;类别 infra;类型 core-logic): DeepGEMM 外部项目的编译选项,移除了硬编码的 -std=c++17,避免与全局标准冲突。
关键符号:未识别
关键源码片段
CMakeLists.txt
主构建配置文件:设置了全局 C++20 标准,并新增 CUDA/HIP 标准的显式声明,是最核心的变更文件。
# vllm_extensions 项目的顶层 CMakeLists.txt
cmake_minimum_required(VERSION 3.26)
project(vllm_extensions LANGUAGES CXX)
# 关键变更:C++ 标准从 17 升级到 20,以兼容 PyTorch 头文件的强制要求
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 为确保 CUDA 和 HIP 代码也使用 C++20,显式设置对应标准(review 建议后添加)
set(CMAKE_CUDA_STANDARD 20)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
set(CMAKE_HIP_STANDARD 20)
set(CMAKE_HIP_STANDARD_REQUIRED ON)
# 其余构建配置保持不变 ...
cmake/external_projects/deepgemm.cmake
DeepGEMM 外部项目的编译选项,移除了硬编码的 -std=c++17,避免与全局标准冲突。
# deepgemm.cmake 片段:移除冗余的 -std=c++17 硬编码
# 因为全局 CMAKE_CXX_STANDARD 20 已生效,无需重复指定
target_compile_options(_deep_gemm_C PRIVATE
# 原来这里有一行:$<$<COMPILE_LANGUAGE:CXX>:-std=c++17>
# 已按 review 建议移除,避免与 CMake 的标准管理冲突
$<$<COMPILE_LANGUAGE:CXX>:-O3>
$<$<COMPILE_LANGUAGE:CXX>:-Wno-psabi>
$<$<COMPILE_LANGUAGE:CXX>:-Wno-deprecated-declarations>
)
评论区精华
关键讨论:
风险与影响
关联脉络
- PR #40378 Related issue: vLLM C++17 build fails with PyTorch requiring C++20: PR #40380 直接解决 issue #40378 中报告的构建失败问题。
- PR #43230 [Misc] downgrade nvidia-cutlass-dsl to 4.5.0: 同为构建系统相关的兼容性修复,反映了与上游依赖保持一致的工程实践。
参与讨论