PyTorch 2.15 发布:重写版 NCCL 后端成为默认
PyTorch 2.15 Release Blog
PyTorch 2.15 发布,重写版 NCCL 后端成为所有 nccl 进程组的默认后端,并提供 TORCH_DIST_USE_NCCL2=0 与 nccl-legacy 回滚路径。
我们很高兴宣布 PyTorch® 2.15 发布(发行说明)!
PyTorch 2.15 版本包含以下变更:
- 重写的 NCCL 后端成为默认后端,并带有飞行记录器,可在挂起时转储信息,并提供
TORCH_DIST_USE_NCCL2=0或nccl-legacy作为回滚路径 - 面向 torch.distributed 的单边传输,提供 NIXL 后端以及可被 CUDA 图捕获的传输
- FSDP2 与流水线获得更精细的内存和通信控制,为精度敏感参数提供 fp32,支持 CUDA 图捕获的梯度累积,并让梯度归约与计算重叠
- 在 NVIDIA Blackwell GPU 上实现更快的 4 位(NVFP4)LLM 解码,通过 NVGEMM 中更少、重叠更好的内核启动实现
- Apple Silicon 获得 FP8 和更快的解码,提供
float8_e4m3fn和_scaled_mm、带有解码快速路径的新 grouped_mm(MoE 解码上达到 1.32–1.34 倍 tokens/s),以及公开的torch.mps.StreamAPI - 更广泛的平台支持:在 AMD gfx950 上提供 FlyDSL 内核,为 gfx1250(MI450)提供 Tensor Data Mover 支持,提供 ROCm 10.0 wheel,在 Intel GPU 上简化 SYCL 内核编写并支持多 GPU 性能分析,默认 wheel 使用 CUDA 13.2 并同时提供 CUDA 13.4,以及在 Python 3.15 上支持 torch.compile
本版本自 PyTorch 2.14 以来由 583 位贡献者提交的 3,117 个提交组成。我们衷心感谢敬业社区所做的贡献。一如既往,我们鼓励大家试用这些功能,并在我们改进 2.15 的过程中报告任何问题。有关如何开始使用 PyTorch 2 系列的更多信息,请访问我们的 入门页面。
欢迎将您关于 PyTorch 2.15 的任何问题带到我们于 2026 年 11 月 5 日(星期四)太平洋时间上午 11 点举行的问答网络研讨会上。Tristan Rice、Natalia Gimelshein、Huy Do 和 Jane Xu(均来自 Meta)将分享 2.15 版本概览,并回答社区关于 PyTorch 及本版本新能力的问题。Chris Gottbrath(Gottbrath Tech)将担任主持人。立即注册。
在整个 2.x 系列中,PyTorch 一直在从研究优先的框架演变为面向大规模生产训练和推理的统一、硬件无关平台。PyTorch 2.13 在 Apple Silicon 上落地了 FlexAttention,为 Inductor 提供了 CuTeDSL 代码路径,并引入了用于大集群训练的 torchcomms。PyTorch 2.14 将该路径成熟为 NVGEMM,预览了重写的 NCCL 后端,并将原生线性代数带到 Apple Silicon。
PyTorch 2.15 在此基础上继续发展。重写的 NCCL 后端现在为每个 nccl 进程组提供支持,NVGEMM 针对低精度解码进行了调优,Apple Silicon 增加了 FP8 和解码专用内核,AMD 支持扩展到新的编译器 DSL 以及(预览支持)下一代 Instinct,Intel GPU 则获得了更简单的内核编程模型和更深入的性能分析。
分布式训练
重写的 NCCL 后端成为默认后端
当模型跨多块 GPU 训练时,这些 GPU 会通过通信后端不断交换数据,在 NVIDIA 硬件上该后端就是 NCCL。在 PyTorch 2.15 中,每个使用 nccl 的任务默认都运行在我们重写的后端上。
PyTorch 2.14 预览了我们重写的 NCCL 后端(从 torchcomms 移植而来),作为可选的 nccl2 后端。在 2.15 中,它成为每个 nccl 进程组的默认后端,并提供 TORCH_DIST_USE_NCCL2=0 和 nccl-legacy 后端名作为回滚路径。现在通信器会随进程组一起立即创建,重新配置可以选择启用收缩/扩展快速路径(NCCL 2.29 或更新版本),使存活的 rank 跳过完整的 bootstrap。在 ROCm 上配合 RCCL 2.30.7 也启用了用于容错的重新配置。
为了让后端在生产环境中可调试,一个与后端无关的飞行记录器会在集合通信挂起时向磁盘写入事后分析,并将看门狗健康状态发布到调试服务器,这样任意 rank 上的超时都会触发所有 rank 的飞行记录器转储。在集群规模下,单块停滞的 GPU 就可能让整个训练任务停摆,而查找原因往往意味着要手动复现故障。飞行记录器会捕获挂起瞬间每个 rank 正在做什么。
API 不稳定
(PR #192281、#192895、#199240、#198865 和 #198339,作者 Tristan Rice,Meta;#194774,作者 Chinmay Kuchinad,AMD;#192233 和 #199092,作者 Tushar Jain,Meta;#192075,作者 Atharva Kshirsagar,Red Hat)
基于 NIXL 后端的单边传输
torch.distributed 新增了用于单边数据移动的 Python 传输 API,首个后端为 NIXL。传输通过存储连接到对端,无需进程组或集合通信,Transport.read_stream/write_stream 会在 CUDA 流上排队传输,因此可以用 torch.cuda.graph 捕获。
API 不稳定
(PR #195643、#197032、#198889 和 #198918,作者 Tristan Rice,Meta)
FSDP2 与流水线并行:内存与通信控制
FSDP2 现在对精度和捕获提供更精细的控制。对精度敏感的参数(例如 MoE 路由器门控和归一化权重)可以保持 fp32,而模型其余部分以 bf16 训练,同时每个 fully_shard 仍只做一次 all-gather(MixedPrecisionPolicy(param_dtype_override_fn=...))。现在整个梯度累积步骤可以在单个 CUDA 图中捕获。梯度精度也可以按参数设置。梯度直接在 .grad 中累积,并遵循每个参数的 grad_dtype,这改变了 reduce_dtype=None 时的默认行为(参见弃用与向后不兼容变更)。
流水线并行现在会在每次接收前才分配接收缓冲区,而不是为每个微批次预先分配,并在前向输出的发送完成后立即释放。调度接受一个 max_outstanding_sends 预算,FSDP 的 unshard 操作会在每个 rank 的启动气泡期间错峰执行,而不是在步骤开始时全部发出。根据调度确定的流水线并行 rank 之间的每条唯一边,现在都会获得专用的 P2P 通信器。FSDP 的 reduce grads 现在可以与后续计算重叠。这些改进使 PyTorch 流水线可被 cudagraph 捕获、具有确定性、并拥有优化的内存配置,同时暴露了用于最小化暴露通信的性能调优旋钮。
API 不稳定
(PR #196640、#196724、#196727、#196641 和 #196963,作者 Chien-Chin Huang,Meta;#196626,作者 Anshul Sinha,Meta;#198417,作者 Andrew Or,Apache Spark PMC);#194114,作者 Animesh Jain,Meta;#196463、#196464 和 #196706,作者 Sanket Purandare,Meta)
性能改进
用于解码和线性代数的更快的 MPS 内核
在 2.14 迁移的基础上,更多 MPS 算子从 MPSGraph 迁移到原生 Metal 内核。对 128,256 条目词表的单行 softmax 下降 8 倍,上采样反向传播最高快 21.7 倍,归约操作现在共享一组内核,使 norm 全归约快 100 倍以上。
对于解码,F.linear 现在使用现有的 gemv 内核(几何平均加速 1.23 倍,在小投影上最高 5 倍),新的 MPS grouped_mm 具有 gemv 路径,在 M3 Ultra 上提供 1.32–1.34 倍的 MoE 解码吞吐量提升。若干线性代数求解器也被重写:512 x 512 矩阵的 QR 分解从约 7 秒降至 1.5 毫秒,三角求解现在采用分块方式。
(PR #196071、#199687、#198611、#198495、#194933、#198721、#198725、#198732、#195944 和 #196900,作者 Irakli Salia,Hugging Face;#196922、#196241 和 #195369,作者 Nikita Shulga,Thinking Machines Lab;#193153,作者 Sunghyun Choi,韩国技术教育大学;#188473,作者 Shrivas Shankar,威斯康星大学麦迪逊分校)
核心功能
默认使用 CUDA 13.2 以及 CUDA 13.4 Wheels
默认的 PyTorch wheel 迁移到 CUDA 13.2(13.2.2 工具包),同时为 Linux x86_64、Linux aarch64 和 Windows 提供 CUDA 13.4 GA wheel。CUDA 13.4 wheel 新增了对 NVIDIA Rubin GPU 的实验性支持。
(PR #198913 和 #196014,作者 Andrey Talman,Meta;#194996 和 #198843,作者 Ashish Karale,NVIDIA;#196560、#199269 和 #196351,作者 Ting Lu,NVIDIA;#192653,作者 Wei Wang,NVIDIA;#186245,作者 Lakshay Garg,NVIDIA)
ROCm 10.0 与 TheRock Wheels
PyTorch 2.15 在 2.14 引入的 ROCm 7.14 wheel 之外,新增了 ROCm 10.0 wheel。所有 ROCm wheel 现在都基于 AMD 的 TheRock 包构建,并且它们将 ROCm 作为 pip 依赖(对应的 rocm 包)安装,而不是捆绑 ROCm 库。
(PR #194919、#198895 和 #196610,作者 Ethan Wee,AMD;#195672,作者 Andrey Talman,Meta)
Python 3.11 至 3.15,以及 Python 3.15 上的 torch.compile
PyTorch 2.15 支持 Python 3.11 至 3.15,包括自由线程的 3.14t 和 3.15t 构建。在 2.15 中,Dynamo 新增了对 Python 3.15 的支持。
(PR #178393、#194117 和 #198018,作者 Rob Timpe,OpenTeams;#198233、#199398 和 #199356,作者 Andrey Talman,Meta)
平台功能与更新
CUDA
用于 NVFP4 解码的 NVGEMM
NVGEMM 是 2.14 中引入的 CuTeDSL GEMM 后端,现在将 ModelOpt NVFP4 线性层的标量反量化因子折叠进 GEMM,从而在解码期间消除了每层单独的逐点启动。一个有界、形状感知的候选策略覆盖了 nvMatmulHeuristics 遗漏的 Blackwell NVFP4 解码形状,并且 NVGEMM 内核可以使用程序化依赖启动,使 Triton 消费者与生产者 GEMM 的尾部重叠。NVGEMM 还迁移到了 CUTLASS Operators 上。
API 不稳定
(PR #194651、#194652、#197485、#194792 和 #194793,作者 Michael Lazos,Meta;#194364,作者 Masaki Kozuki,NVIDIA)
ROCm
gfx950 上的 FlyDSL 内核与 gfx1250 上的 Tensor Data Mover
FlyDSL 加入 CuTeDSL、Triton 和 Helion,成为 PyTorch 可使用的内核 DSL。在 gfx950 上,Inductor 会与 Triton 和 ATen 一起,为 GEMM、ragged F.grouped_mm 和 MXFP4/MXFP8 scaled_mm 自动调优 FlyDSL 模板;在 eager 模式下,FlyDSL 可以覆盖 RMSNorm 和 topk。FlyDSL 是可选的,需要 FlyDSL 0.3.x。
在 gfx1250(MI450)上,Inductor 使用 Tensor Data Mover 进行稠密 mm/addmm、逐点运算和归约代码生成,以及 FlexAttention 前向和解码。gfx1250 已加入 nightly wheel 架构列表。
API 不稳定
(PR #192877、#190903、#194032、#191446 和 #191447,由 AMD 的 Xiaobing Zhang 提交;#194981,由 AMD 的 Yutao Xu 提交;#196719,由 AMD 的 Heng Yi 提交;#191166、#196525 和 #197329,由 AMD 的 Glen Cao 提交;#196610,由 AMD 的 Ethan Wee 提交)
MPS(Apple Silicon)
Apple Silicon 上的 FP8、Streams 和更快的 MoE 推理
torch.float8_e4m3fn 现已在 MPS 上获得支持,同时支持的还有 _scaled_mm(支持 tensorwise 或 rowwise 缩放)以及针对解码尺寸形状的 gemv 快速路径。MPS 还新增了仿照 CUDA 设计的公开 stream API:torch.mps.Stream、current_stream、set_stream、torch.mps.stream 上下文管理器和 Tensor.record_stream。
API 不稳定
(PR #194074、#196916、#197862、#196945、#196918 和 #196955,由 Hugging Face 的 Irakli Salia 提交;#191415、#193464 和 #195867,由 OpenTeams 的 Kurt Mohler 提交;#196395,由 Meta 的 Aditya Venkataraman 提交)
XPU(Intel GPU)
SYCL 内核编程简化
本次发布为 XPU 后端引入了 SYCL 自由函数内核支持,大多数现有 SYCL 内核已迁移到新的编程模型。通过用显式的自由函数内核替代冗长的基于函子的实现,开发者可以更直观地编写设备代码,从而降低为 Intel XPU 开发和移植自定义 GPU 内核的门槛。
(PR #196387、#196932、#198200、#198720 和 #200223,由 Intel 的 Yifeng Cui 提交)
增强的 XPU 运行时能力
本次发布扩展了 XPU 运行时能力,为 torch.xpu.Event 增加了 IPC 支持,使事件能够跨进程共享并与 torch.multiprocessing 集成。此外,torch.xpu.MemPool 现在支持 use_on_oom 和非拆分分配策略,为需要处理内存不足情况或利用分布式对称内存工作流的应用提供了更大的灵活性。
API 不稳定
(PR #191182、 #192495、 #192514、 #192038 和 #192033,由 Intel 的 Guangye Yu 提交)
改进的 XPU 性能分析体验
此版本新增了对 XPU Graph 重放的 kernel 级可见性、XCCL 集合通信的跨 rank 关联,以及在多 GPU 工作负载中跨所有 Intel GPU 的逐 kernel 硬件计数器采集。这些增强功能可为基于 graph 的、多 GPU 的以及分布式训练和推理提供更深入的性能分析。
(PR #195128,作者 Chuanqi Wang,Intel;PR #5486 和 #1479,作者 Adrian Ostrowski,Intel)
C++ ABI
扩展的稳定 ABI 与仅头文件接口
torch::stable::sort 加入稳定 ABI,Python 互操作 shim 新增 dtype/device 转换以及 is_tensor 探测,与现有的 tensor 转换并存。更多 c10/util(irange、load、数学常量、类型转换和溢出检查)移入 torch/headeronly,旧路径保留为转发 include。现在如果 TORCH_TARGET_VERSION 比扩展的 libtorch 头文件更新,扩展会得到编译时错误,并且 load_inline 可以生成可在自由线程 Python 上安全导入的 pybind11 模块。
(PRs #198038,作者 Adrian Abeyta,Red Hat;#194673、#194781 和 #193962,作者 Chris Leonard,Red Hat;#192774,作者 Paweł Gadziński,NVIDIA;#196802,作者 Alex Malyshev,Meta)
性能分析与调试
使用 Cuspy 进行 CUDA Graph Kernel 归属
从 CUDA graph 重放的 kernel 现在可以归属回捕获它们的代码。Kernel 注解从 CUPTI 节点创建回调中记录,并由 export_chrome_trace 内联写入,而在 record_py_stacks 下 CUDA graph 会捕获每个节点的 Python 启动栈。CUPTI 监视器已重命名为 Cuspy,并通过 CuspyConfig 启用。
API 不稳定
(PRs #191999、#194854、#196528、#198419 和 #196529,作者 Natalia Gimelshein,Meta;#196066,作者 Ryan Zhang,Meta)
弃用与向后不兼容的变更
- 不再支持 Python 3.10。 PyTorch 2.15 要求 Python 3.11 或更高版本:不再构建 3.10 wheel,CI 中也不再测试 3.10。不支持在 3.10 上从源码构建,后续版本将移除剩余的 3.10 代码路径,包括 torch.compile (Dynamo) 中的路径。参见 #198233 和 #199417。
- nccl 现在选择重写后的 NCCL 后端。 设置
TORCH_DIST_USE_NCCL2=0或使用nccl-legacy后端以恢复旧版ProcessGroupNCCL。参见 #192281。 - 来自 torch.ops 和自定义算子的 C++ 警告现在会传播到 Python。 参见 #193451。
- macOS 14 不再受支持。 PyTorch 2.15 需要 macOS 15 或更高版本才能使用 MPS(Apple Silicon GPU)加速。macOS 14 已达到生命周期终点,针对它的 MPS 变通方案已被移除。PyTorch 可能仍可在 macOS 14 上运行,但未在该系统上测试,相关问题也不会被修复。参见 #199261。
- FSDP2 将分片与非分片梯度的数据类型分开。 参见 #194434。
文章 PyTorch 2.15 发布博客 首次发布于 PyTorch。
来源:PyTorch Blog · pytorch.org