我们很高兴地宣布 PyTorch® 2.15 正式发布(发布说明)!
PyTorch 2.15 版本包含以下变更:
本版本由 583 位贡献者提交的 3,117 个 commit 组成,自 PyTorch 2.14 以来。我们衷心感谢敬业社区所做的贡献。一如既往,我们鼓励您试用这些功能并报告任何问题,以帮助我们改进 2.15。有关如何开始使用 PyTorch 2 系列的更多信息,请访问我们的入门页面。
欢迎参加我们于 2026 年 11 月 5 日(星期四)太平洋时间上午 11 点举行的 PyTorch 2.15 问答网络研讨会,提出您关于 PyTorch 2.15 的任何问题。Tristan Rice、Natalia Gimelshein、Huy Do 和 Jane Xu(均来自 Meta)将分享 2.15 版本概览,并回答社区关于 PyTorch 及本版本新功能的提问。Chris Gottbrath(Gottbrath Tech)将担任主持人。立即注册。
在整个 2.x 系列中,PyTorch 一直在从研究优先的框架演变为面向大规模生产训练和推理的统一、硬件无关平台。PyTorch 2.13 将 FlexAttention 引入 Apple Silicon,为 Inductor 提供了 CuTeDSL 代码路径,并引入了用于大规模集群训练的 torchcomms。PyTorch 2.14 将该路径成熟为 NVGEMM,预览了重写的 NCCL 后端,并将原生线性代数引入 Apple Silicon。
PyTorch 2.15 在此基础上继续发展。重写的 NCCL 后端现在为每个 nccl 进程组提供支持,NVGEMM 针对低精度解码进行了调优,Apple Silicon 增加了 FP8 和解码专用内核,AMD 支持扩展到新的编译器 DSL 以及下一代 Instinct 的(预览支持),Intel GPU 获得了更简单的内核编程模型和更深入的性能分析。
当模型在多块 GPU 上训练时,这些 GPU 会通过通信后端不断交换数据,在 NVIDIA 硬件上该后端就是 NCCL。在 PyTorch 2.15 中,所有使用 nccl 的任务默认运行在我们重写的后端上。PyTorch 2.14 预览了从 torchcomms 移植而来的重写 NCCL 后端,作为可选的 nccl2 后端。在 2.15 中,它成为每个 nccl 进程组的默认后端,并提供 TORCH_DIST_USE_NCCL2=0 和 nccl-legacy 后端名称作为回滚路径。通信器现在随进程组一起急切创建,重新配置可以选择加入收缩/增长快速路径(NCCL 2.29 或更新版本),使存活的 rank 跳过完整的引导过程。在 ROCm 上使用 RCCL 2.30.7 时,也启用了用于容错的重新配置。
为了使后端在生产环境中可调试,一个后端无关的飞行记录器会在集合通信挂起时将事后分析写入磁盘,并将看门狗健康状态发布到调试服务器,以便任何 rank 上的超时都会触发所有 rank 的飞行记录器转储。在集群规模下,单块停滞的 GPU 就可能使整个训练运行停止,而查找原因往往意味着手动复现故障。飞行记录器会捕获挂起时刻每个 rank 正在执行的操作。
(PR #192281、#192895、#199240、#198865 和 #198339,作者 Tristan Rice,Meta;#194774,作者 Chinmay Kuchinad,AMD;#192233 和 #199092,作者 Tushar Jain,Meta;#192075,作者 Atharva Kshirsagar,Red Hat)
torch.distributed 新增了用于单边数据移动的 Python 传输 API,并将 NIXL 作为首个后端。传输通过存储(store)连接到对等节点,无需进程组或集合通信;Transport.read_stream/write_stream 在 CUDA 流上排队传输,因此可以用 torch.cuda.graph 捕获。
(PR #195643、#197032、#198889 和 #198918,作者 Tristan Rice,Meta)
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 流水线并行可被 CUDA 图捕获、具有确定性、内存配置经过优化,并提供了用于最小化暴露通信的性能调优参数。
(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)
在 2.14 迁移的基础上,更多 MPS 算子从 MPSGraph 迁移到原生 Metal 内核。对 128,256 条目词表的单行 softmax 耗时降低 8 倍,upsample backward 最高提速 21.7 倍,归约操作现在共享一组内核,使 norm 全归约提速超过 100 倍。
对于解码,F.linear 现在使用现有的 gemv 内核(几何平均提速 1.23 倍,小型投影最高提速 5 倍),新的 MPS grouped_mm 具有 gemv 路径,在 M3 Ultra 上使 MoE 解码吞吐量提高 1.32–1.34 倍。若干线性代数求解器也被重写: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,威斯康星大学麦迪逊分校)
默认 PyTorch wheel 迁移至 CUDA 13.2(13.2.2 工具包),同时提供适用于 Linux x86_64、Linux aarch64 和 Windows 的 CUDA 13.4 GA wheels。CUDA 13.4 wheels 新增对 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)
PyTorch 2.15 在 2.14 引入的 ROCm 7.14 wheels 之外,新增 ROCm 10.0 wheels。所有 ROCm wheels 现在基于 AMD 的 TheRock 包构建,并将 ROCm 作为 pip 依赖安装(匹配的 rocm 包),而不是捆绑 ROCm 库。
(PR #194919、#198895 和 #196610,作者 Ethan Wee,AMD;#195672,作者 Andrey Talman,Meta)
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)
NVGEMM 是 2.14 中新增的 CuTeDSL GEMM 后端,现在将 ModelOpt NVFP4 线性层的标量反量化因子折叠进 GEMM,从而在解码期间为每一层省去一次独立的逐点内核启动。一个有界、形状感知的候选策略覆盖了 nvMatmulHeuristics 遗漏的 Blackwell NVFP4 解码形状,并且 NVGEMM 内核可以使用程序化依赖启动,使 Triton 消费者与生产者 GEMM 的尾部重叠。NVGEMM 还迁移到了 CUTLASS Operators 上。
(PR #194651、#194652、#197485、#194792 和 #194793,作者 Michael Lazos,Meta;#194364,作者 Masaki Kozuki,NVIDIA)
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 架构列表。
(PR #192877、#190903、#194032、#191446 和 #191447,作者 Xiaobing Zhang,AMD;#194981,作者 Yutao Xu,AMD;#196719,作者 Heng Yi,AMD;#191166、#196525 和 #197329,作者 Glen Cao,AMD;#196610,作者 Ethan Wee,AMD)
torch.float8_e4m3fn 现已在 MPS 上受支持,同时支持带 tensorwise 或 rowwise 缩放的 _scaled_mm,以及针对解码尺寸形状的 gemv 快速路径。MPS 还新增了仿照 CUDA 的公共流 API:torch.mps.Stream、current_stream、set_stream、torch.mps.stream 上下文管理器以及 Tensor.record_stream。
(PR #194074、#196916、#197862、#196945、#196918 和 #196955,作者 Irakli Salia,Hugging Face;#191415、#193464 和 #195867,作者 Kurt Mohler,OpenTeams;#196395,作者 Aditya Venkataraman,Meta)
此版本为 XPU 后端引入了 SYCL 自由函数内核支持,大多数现有 SYCL 内核已迁移到新的编程模型。通过用显式自由函数内核替换冗长的基于函子的实现,开发者可以以更直观的方式编写设备代码,降低了为 Intel XPU 开发和移植自定义 GPU 内核的门槛。
(PR #196387、#196932、#198200、#198720 和 #200223,作者 Yifeng Cui,Intel)
此版本扩展了 XPU 运行时能力,为 torch.xpu.Event 增加了 IPC 支持,使事件能够跨进程共享并与 torch.multiprocessing 集成。此外,torch.xpu.MemPool 现在支持 use_on_oom 和非拆分分配策略,为需要处理内存不足情况或利用分布式对称内存工作流的应用提供了更大的灵活性。
(PR #191182、#192495、#192514、#192038 和 #192033,作者 Guangye Yu,Intel)
此版本增加了对 XPU Graph 重放的内核级可见性、XCCL 集合通信的跨 rank 关联,以及在多 GPU 工作负载中跨所有 Intel GPU 的逐内核硬件计数器收集。这些增强功能使得对基于图的、多 GPU 以及分布式训练和推理进行更深入的性能分析成为可能。
(PR #195128,作者 Chuanqi Wang,Intel;PR #5486 和 #1479,作者 Adrian Ostrowski,Intel)
torch::stable::sort 加入 stable ABI,Python 互操作 shim 在现有张量转换之外新增了 dtype/device 转换和 is_tensor 探测。更多 c10/util(irange、load、数学常量、类型转换和溢出检查)移入 torch/headeronly,旧路径保留为转发 include。如果 TORCH_TARGET_VERSION 比扩展的 libtorch 头文件更新,扩展现在会得到编译时错误,并且 load_inline 可以生成可在自由线程 Python 上安全导入的 pybind11 模块。
(PR #198038,作者 Adrian Abeyta,Red Hat;#194673、#194781 和 #193962,作者 Chris Leonard,Red Hat;#192774,作者 Paweł Gadziński,NVIDIA;#196802,作者 Alex Malyshev,Meta)
从 CUDA graph 重放的内核现在可以归因回捕获它们的代码。内核注解从 CUPTI 节点创建回调中记录,并由 export_chrome_trace 内联写出,使用 record_py_stacks 时 CUDA graph 会捕获每个节点的 Python 启动栈。CUPTI 监视器更名为 Cuspy,并通过 CuspyConfig 启用。
(PR #191999、#194854、#196528、#198419 和 #196529,作者 Natalia Gimelshein,Meta;#196066,作者 Ryan Zhang,Meta)

转载声明:本文为转载整理,原文版权归原作者及原站点所有。
原文来源:PyTorch Blog
原文作者:bsterling;如有侵权,请联系管理员删除。