近日,PyTorch 团队正式发布了 v2.8.0 版本,带来了多项重要功能更新、性能优化和错误修复。本文将详细介绍该版本的主要变化,帮助开发者更好地理解新特性及其影响。
亮点功能
- 不稳定版本特性
torch::stable::Tensor
- 在 Intel CPU 上利用原生 PyTorch 进行高性能量化大语言模型(LLM)推理
- 实验性 Wheel 版本支持
- Inductor CUTLASS 后端支持
- Inductor CUDA 图的图划分功能
- 控制流算子库
- HuggingFace SafeTensors 在 PyTorch 分布式 Checkpoint 中的支持
- 在 PyTorch C++ Extension API 中提供 SYCL 支持
- XPU 设备上的 A16W4 支持
- 使用
torch.compile
的分层编译 - Intel GPU 分布式后端(XCCL)支持
跟踪中的回归问题
- Windows 上使用 CUDA 12.9.1 构建 wheel 时发生栈溢出
由于 CUDA 12.9.1 引入的一个 bug,我们无法在该版本下完成完整的 Windows wheel 构建,因为在编译torch.segment_reduce()
时会导致构建崩溃。
因此,我们提供了一个不包含torch.segment_reduce()
的 wheel 版本来规避该问题。
如果你需要torch.segment_reduce()
的支持,请使用其他版本的 CUDA。
向后不兼容的变更(Backwards Incompatible Changes)
CUDA 支持
- 在 CUDA 12.8 和 12.9 构建中,移除了对 Maxwell 和 Pascal 架构的支持。
由于二进制体积限制,在 PyTorch 2.8.0 中,已移除对 sm50 - sm60 架构 的支持(仅限 CUDA 12.8 和 12.9 版本)。
如果需要支持这些架构,请改用 CUDA 12.6。
Python 前端
- 当调用算子(op)时,输入的 dtype 不被支持 将抛出
NotImplementedError
,而不是RuntimeError
。
请更新异常处理逻辑以反映此变化。
在 2.7.0:
try:
torch.nn.Hardshrink()(torch.randint(0, 5, (10,)))
except RuntimeError:
...
在 2.8.0:
try:
torch.nn.Hardshrink()(torch.randint(0, 5, (10,)))
except NotImplementedError:
...
- 为自定义
autograd.Function
增加了缺失的“视图上的就地操作检查”
在 2.8.0 中,如果自定义的autograd.Function
修改了一个需要梯度的叶子变量(leaf)的视图(view),现在会正确抛出错误。
以前则会静默导致内存泄漏。
示例:
class Func(torch.autograd.Function):
@staticmethod
def forward(ctx, inp):
inp.add_(1)
ctx.mark_dirty(inp)
return inp
@staticmethod
def backward(ctx, gO):
pass
a = torch.tensor([1.0, 2.0], requires_grad=True)
b = a.view_as(a)
Func.apply(b)
2.7.0 版本
运行不报错,但是会内存泄漏。
2.8.0 版本
报错:
RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place operation
- 对
tensordot
的 out 版本 现在会在requires_grad=True
时正确抛出错误。
以前不会报错,但无法为out
张量计算梯度。
在 2.7.0:
a = torch.empty((4, 2), requires_grad=True)
b = torch.empty((2, 4), requires_grad=True)
c = torch.empty((2, 2), requires_grad=True)
# 不报错,但无法计算 c 的梯度
torch.tensordot(a, b, dims=([1], [0]), out=c)
在 2.8.0:
# 会报 RuntimeError
torch.compile
-
修正了
mark_dynamic
张量在特定情况下被错误地形状特化的问题
以前,如果在关闭 guard 的情况下测试符号形状,则 guard 可能被遗漏。
已在 2.8 修复。如果新 guard 使mark_dynamic
的张量被特化,会导致错误。
解决方法:使用maybe_mark_dynamic
替代mark_dynamic
。 -
多个与
torch.compile
相关的配置变量已重命名或移除:enable_cpp_framelocals_guard_eval
现在无效rocm.n_max_profiling_configs
弃用 → 请改用rocm.ck_max_profiling_configs
和rocm.ck_tile_max_profiling_configs
autotune_fallback_to_aten
弃用 → ATen 回退需显式配置use_mixed_mm
和mixed_mm_choice
弃用descriptive_names = False
弃用 → 请使用"torch"
,"original_aten"
或"inductor_node"
custom_op_default_layout_constraint
从 inductor config 移动到 functorch configemit_current_arch_binary
弃用aot_inductor.embed_cubin
重命名为aot_inductor.embed_kernel_binary
aot_inductor.compile_wrapper_with_O0
重命名为compile_wrapper_opt_level
-
对高阶算子(HigherOrderOperators,如
cond
)增加了更严格的别名/突变检查。
如果输入与输出间存在不支持的别名或突变,将报错。
解决方法:对有别名的输出调用.clone()
。 -
guard_or_x
与definitely_x
接口合并
删除了definitely_true
/definitely_false
,请改用guard_or_true
/guard_or_false
。
torch.export
- 移除了
torch.export.export_for_inference
,请使用:
torch.export.export_for_training(...).run_decompositions(...)
torch.export.export
和export_for_training
默认strict=False
(旧版默认是True
)。
如需旧行为,请显式传入strict=True
。
ONNX
torch.onnx.export
默认 opset 从 17 升级到 18。
如果需要旧行为,请显式指定opset_version=17
。- 移除了
JitTraceConvertStrategy
支持,当dynamo=True
时,不再支持 JIT traced/scripted 模块导出到 ONNX。 onnxscript>=0.3.1
是dynamo=True
的必需版本。
构建前端(Build Frontend)
- 从
Dispatcher.h
中移除了torch/types.h
引入
如果 C++ 代码依赖此隐式包含,请升级 torchvision 版本。 - DLPack 升级到 1.0,部分枚举值被重命名:
kDLGPU
→kDLCUDA
kDLCPUPinned
→kDLCUDAHost
- NVTX3 相关 CMake 配置位置变更,使用
USE_SYSTEM_NVTX=1
时需显式配置。
弃用功能(Deprecations)
1. MacOS Ventura 的 MPS 支持将在 2.9 中移除
- PyTorch 2.8 是最后一个支持在 MacOS Ventura 上使用 GPU 加速的版本。
- 从下一个版本(2.9)开始,需要 MacOS Sonoma(2023 年 9 月发布)或更高版本 才能使用 MPS 后端。
2. torch.ao.quantization
已弃用,将在 2.10 中移除
迁移方式如下:
Eager 模式量化
(torch.ao.quantization.quantize
, torch.ao.quantization.quantize_dynamic
)
- 权重-only 和动态量化:使用
torchao
Eager 模式的quantize_
。 - 静态量化:使用
torchao
的 PT2E 量化。
FX 图模式量化
(torch.ao.quantization.quantize_fx.prepare_fx
, torch.ao.quantization.quantize_fx.convert_fx
)
- 使用
torchao
的 PT2E 量化(torchao.quantization.quantize_pt2e.prepare_pt2e
,torchao.quantization.quantize_pt2e.convert_pt2e
)。
注意:
- PT2E 量化已经迁移到
torchao
仓库:
📂 torchao.quantization.pt2e- 详细信息请参考:
- 相关 issue:pytorch/ao#2259
- 快速上手文档:https://docs.pytorch.org/ao/main/quick_start.html#pytorch-2-export-quantization
3. torch.onnx.export
的 dynamo=False
(当前默认)选项已弃用
- 从 PyTorch 2.9 开始,默认值将改为
dynamo=True
。 - 建议迁移到
dynamo=True
选项,这将使torch.export.export
成为默认导出路径,取代 TorchScript。
如果需要保留旧行为:
- 显式设置
dynamo=False
。 - 建议同时尝试
fallback=True
选项,这样当dynamo=True
出错时,导出器会自动回退到dynamo=False
路径。
新功能(New Features)
CUDA
- 在 CUDAGraphs 中支持捕获事件记录与等待(event record & wait) 以用于计时。
torch.compile
Dynamo
- 新增对**分层编译(hierarchical compilation)**的支持,通过
nested_compile_region
实现。 - 允许使用自定义过滤函数
guard_filter_fn
来丢弃 guard。 - 新增
dont_skip_tracing
装饰器,可绕过大多数 Dynamo skipfiles 规则。
Inductor
- 支持将一个 Dynamo 计算图映射到多个不同的 Inductor 计算图,这些计算图可被独立优化。
torch.export
- 新增
draft-export
:一种新的导出变体,旨在稳定生成计算图,并生成追踪过程中的调试报告。
Ahead-Of-Time Inductor(AOTI,提前编译版 Inductor)
- 支持 TorchBind 对象。
- 新增配置变量
aot_inductor.model_name_for_generated_files
,用于指定生成文件的模型名称。
MPS(Apple GPU 后端)
- MPSInductor:支持在 Apple GPU 上运行
torch.compile
。
ONNX
- 新增
draft_export
策略,在使用torch.onnx.export
获取ExportedProgram
时,如果出现数据相关或约束错误,可提供调试信息。 - 在
dynamo=True
导出路径中,新增对**符号算子(symbolic operators)**的支持。- 新增两个算子:
torch.onnx.ops.symbolic
和torch.onnx.ops.symbolic_multi_out
,可直接在 PyTorch 模型中创建 ONNX 符号算子。
- 新增两个算子:
示例:
def forward(self, x: torch.Tensor) -> torch.Tensor:
# 可以选用 is_in_onnx_export 来控制 ONNX 导出时期的行为
if torch.onnx.is_in_onnx_export():
# 在 "custom_domain" 域中创建名为 "CustomOp" 的 ONNX 符号算子
# 输出张量将具有给定的 dtype 和 shape
return torch.onnx.ops.symbolic(
"custom_domain::CustomOp",
(x,),
dict(attr_key="attr_value"),
dtype=x.dtype,
shape=x.shape,
version=1,
)
else:
return x
Python 前端
- 新增广义帕累托分布(Generalized Pareto Distribution, GPD)。
量化(Quantization)
- 新增数据类型
torch.float4_e2m1fn_x2
。
XPU(Intel GPU/加速器)
- 支持 Intel 分布式后端 XCCL。
- 支持通过 C++ 扩展运行 SYCL 内核。
改进内容
构建前端(Build Frontend)
- 移除了
TORCH_CUDA_ARCH_LIST
的过时警告 - 将 Eigen 改为可选构建依赖
- 将 CUTLASS 更新到 3.9.2
可组合性(Composability)
- 为自定义算子增强了支持,包括可序列化的算子配置文件和虚拟注册覆盖
C++ 前端(C++ Frontend)
- 为
torch::nn::functional::grid_sample
添加了 Bicubic 模式
CUDA
- 为自定义 CUDA 扩展的
load_inline()
引入no_implicit_headers
模式 - 在 SDPA 内存高效注意力后端中支持大批量(large batch)计算
- 修复了 SDPA 内存高效注意力反向传播中的非法索引问题
- 在 sm121(DGX Spark)架构上支持 SDPA 注意力后端
- 为 sm12x(GeForce Blackwell)添加 FP8 行级缩放矩阵乘(row-wise scaled-mm)支持
cuDNN
- 将 cuDNN 前端版本更新至 1.12
分布式(Distributed)
c10d
- 为 TCPStore 增强了克隆和队列功能
- 为 NCCL 通信添加了集合操作(collective)时间估算器
- 提升 getDefaultBackend 的容错性,不再依赖异常
- 指定 MPS(Apple GPU)的默认 PyTorch 分布式后端
- 在 TCPStoreLibUvBackend 中支持 masterListenFd
- 在 gloo 中使用共享 store
- 提升故障恢复(FR)转储的健壮性,改进广播等待、降低转储超时并缩小锁范围
- 记录每个被合并的 collective
- 实现更安全的 NCCL 通信器(communicator)资源管理
- 明确
TORCH_NCCL_USE_TENSOR_REGISTER_ALLOCATOR_HOOK
的行为 - 允许在 mempool 中注册未来的 NCCL 分配
- 当使用 group_rank 时跳过 global_rank 计算
- 通过不安全 API 从 ProcessGroupNCCL 暴露 NCCL 通信器
- 为不均匀 all2all 带宽计算添加 split size 信息转储
- 让 FR 成为与厂商无关的实现,使其他后端(如 gloo)也能使用
- 在 functional collective 中添加
needs_contiguous_strides
标签 - 让
split_group
支持非 NCCL 后端 - 使用
new_subgroups_by_enumeration()
简化new_subgroups()
- 在 ProcessGroupNCCL 中仅让当前线程分配池内资源
- 让 gloo 支持
c10::Half
- 在 PG 析构函数中释放 GIL
- 让
get_process_group_ranks()
支持group=None
- 若已注册,跳过更新默认设备分布式后端
- 启用查询构建与运行时的 NCCL 版本
- 在确定性模式下禁用 NCCL NVLS
- 让
init_process_group
支持仅索引的设备 ID - 支持按 ProcessGroup 启用/禁用 NaN 检测
- 在 ProcessGroupGloo 中增加
reduce_scatter
和ReduceOp::AVG
支持 - 在 ProcessGroupNCCL 中添加 FP8 支持
- 在 gloo 中添加 ibverbs 后端,并在支持 GPUDirect 的后端下启用 gloo CUDA
DeviceMesh
- 改进了设备选择逻辑
DDP(DistributedDataParallel)
- 增加选项允许跳过对未使用参数的 all reduce 操作
- 增加接收数据检查,以避免 DDP reducer 中的段错误
- 将
use_python_reducer
从 Python 传递到 C++ reducer
DSD(DistributedStateDict)
- 支持
write_size
中的非张量数据 - 在 meta 设备张量时跳过弹出
DTensor
- 让 StridedShard 支持非均匀切分
- 为
torch.cumsum
增加支持 - 增加 DTensor 重分布前/后数据类型转换,以支持 SimpleFSDP 混合精度训练
- 为
torch.distributed.tensor.debug.visualize_sharding
增加详细支持
FSDP2(Fully Sharded Data Parallel 2)
- 在 FSDP collective 中添加
PrivateUse1
后端支持,并将设备类型传递给 pre forward hook - 添加
set_reshard_after_forward
- 允许无梯度的模型参数使用不同的数据类型
- 当
reshard_after_forward=True
且为根模型时,保留根未分片 - 增加选项强制 FSDP2 始终使用 SUM 规约
- 仅在非 CPU 设备时断言 all_reduce_event
- 为 FSDP2 启用 NCCL 零拷贝(用户缓冲注册)
管道并行(Pipeline Parallelism)
- 添加调度可视化工具
- 允许在 ZeroBubble 路径中传递未使用的 kwargs
- 添加
get_pipeline_order()
支持 Gpipe 和 1F1B
分片张量(ShardedTensor)
- 支持 0 尺寸 ShardedTensor,并通过 all_gather 重新计算元数据
张量并行(TensorParallel)
- 添加
ParallelStyle PrepareModuleInputOutput
torchelastic
- 当 worker 离开时,不关闭 rendezvous
torch.compile
Dynamo
- 改进了对 Python
set
、实现了__torch_function__
的张量子类,以及namedtuple
子类的追踪支持 - 消除了 Compiled Autograd 在动态形状 下的所有重新编译,从而减少编译时间
- 为
torch.compiler.disable
添加了reason
字段 - 移除了顶层
torch
命名空间函数中 lru_cache 的警告
Inductor
- 为 CPU 上的 FlexAttention 添加了 块稀疏(block sparse)支持
- 引入了新的配置选项:
aot_inductor.custom_ops_to_c_shims
和aot_inductor.custom_op_libs
:允许指定自定义算子的 C shimmax_fusion_buffer_group_pairwise_attempts
:限制融合的最大节点距离cuda.cutlass_enabled_ops
:控制 CUTLASS 算子的选择triton.cudagraph_capture_sizes
:指定在哪些形状下捕获 CUDAGraph,并跳过其他形状的捕获use_static_cuda_launcher
:启用对编译后 triton 的静态启动以提升冷启动性能assume_unaligned_fallback_output
:允许 inductor 跟踪未对齐的输出cuda.cutlass_tma_only
:控制是否只使用 TMA 兼容的 CUTLASS 内核static_launch_user_defined_triton_kernels
:启用静态启动用户自定义 triton 内核precompilation_timeout_seconds
:控制预编译的超时时间disable_decompose_k
:禁用新的 DecomposeK GEMM 内核min_num_split
:设置分块归约(split reduction)的最小分块数max_autotune_flex_search_space
:指定 flex attention 自动调优的搜索空间大小
- 引入了
LOG_AUTOTUNE_RESULTS
环境变量,用于自动调优日志记录 - 提高了 CPU Welford 归约 在归一化操作中的数值稳定性
torch.export
- 改进了对内置算子(
min
、max
、math.pow
)的处理 - 为
dim hints
添加了min/max
范围 - 允许通过
pytree.register_dataclass
注册普通类 - 允许将整型输入指定为动态输入
- 内联(inline)
jit.scripted
函数到 export 结果中 - 改进
graph signature
的美化打印
Ahead-Of-Time Inductor (AOTI)
- 支持设备端 TMA
- 在
AOTIModelPackageLoader
中添加了num_runners
参数
FX
- 更新了代码生成中的比较运算符为
==
- 在常量折叠子模块时,将名称映射到操作数索引
- 改进了追踪时的堆栈追踪信息
- 在
normalize_function
中支持边缘方言(edge dialect)算子 - 修复了
minifier
中路径命名问题 - 添加了
graph_code_verbose_log
用于 FX passes - 提升缓存键图打印的性能
- 在
fx.passes.split_module
中添加参数以规范化输入名称
线性代数前端
- 为
cross
添加了张量重叠检查
MPS (Apple Metal 加速)
- 为大量
torch.special
操作(以及index_copy
、hardshrink
、rsub
、col2im
、isin
)添加了支持 - 扩展了以下操作的数据类型支持:
index_put
支持半精度浮点ConvTranspose3D
支持 FP32 和复数log1p
和sigmoid
支持 int64
- 以浮点精度计算激活内核
嵌套张量(Nested Tensor, NJT)
- 修复了嵌套张量字符串表示的连续性问题
torch.nn
- 当模块的完整反向钩子(full backward hook)无输入需要梯度时添加警告
- 为 CPU 添加
weight_norm
的 FP16 支持
ONNX
- 升级 ONNX 到 1.18
- 在
dynamo=True
时支持 opset 18-23 - 添加 float4 支持
- 支持 ONNX 原生算子 Attention-23 和 RotaryEmbedding-23
- 支持
torch.scan
- 在动态维度下支持 0/1 大小的样例输入
- 从 opset 21 添加 group_norm 支持
- 为
VerificationInfo
类添加asdict
方法 - 支持在 ONNX Runtime 中运行 bfloat16 模型
- 改进 ONNX 文档格式和鲁棒性
- 更新 dynamic_shapes 行为以使用
torch.export.dim.DYNAMIC
- 在节点生产时设置值的名称
- 改进符号操作符(
sym_float
,sym_not
,sym_min
,sym_max
)支持
优化器
- 为 CPU 上的融合 Adagrad 添加
TensorLR
版本 - 在优化器正常工作时自动将张量 lr 转换为 0 维
- 在 MultiplicativeLR 中增加
lr_lambda
类型检查
性能分析(Profiler)
- 支持按需内存快照
- 在可视化器中添加 PT2 编译上下文
- 将 PT2 纳入内存快照
- 添加切换全局/本地注解回调的开关
- 将重载名称传递给 Kineto
- 对未完成的 CPU 事件将持续时间设置为 -1
- 从事件最多的索引开始显示
Python 前端
- 引入
torch.AcceleratorError
- 实现
Size.__radd__()
- 更新
get_default_device()
以支持torch.device
上下文管理器
量化(Quantization)
- 改进 x86 PT2E 量化支持,新增 uint8 操作(逐点乘/加/add_relu 和 batch_norm2d)、
qconv1d-relu
融合,以及 lowering pass - 支持 CUDA 上
torch.fused_moving_avg_obs_fake_quant
的布尔张量
发布工程
- 在 manylinux 镜像中将 gcc11 升级到 gcc13
- 升级到 cmake 3.27.2
ROCm
- 允许用户覆盖
cpp_extension
的默认编译标志 - 启用了对稀疏压缩的
mm
/bmm
/addmm
操作的支持
Sparse 前端
- 为 PrivateUse1 扩展 启用了稀疏压缩张量的不变性检查
torch.func
- 添加了以下算子的批处理规则(batching rules):
torch.Tensor.scatter_add_
torch.matrix_exp
XPU(Intel GPU 支持)
- 在 Intel GPU 上支持:
- 安全 softmax
- GQA(Grouped Query Attention)
fp32
因果掩码(causal mask)用于 SDP(Scaled Dot-Product Attention)- 将最大 head dim 从 256 提升到 576
- 在内存分析器(Memory Profiler)中为 Intel GPU 添加内存报告功能
- 支持切换 Intel GPU 性能分析器的功能
- 支持在 Intel GPU 上集成分布式内存跟踪器
- 改进 Intel GPU CMake 文件中的错误处理和报告
- 在 AOTI 中支持
embed_cubin
和multi_arch_kernel_binary
选项,用于 Intel GPU - 在
UserDefineClass
中添加通用及 Intel GPU 专用的Stream
和Event
接口 - 在 Intel GPU 上支持
int4
WOQ GEMM(权重量化 GEMM)
Bug 修复
构建前端(Build Frontend)
- 支持使用 CMake-4.x 进行构建)
- 修复在 gcc-12+ 下 fbgemm 的构建问题
- 在 Windows 上添加
/permissive-
标志以强制构建符合 C++ 标准
组合性(Composability)
- 修复自定义算子返回 1 元素 tuple 时的支持问题
- 避免在标量输入的
torch.norm
中发生溢出
CPU (x86)
- 修复
log_softmax
降精度 FP 内核中明显的复制粘贴错误
CUDA
- 修复广播情况下确定性索引的问题
- 修复在使用 cuBLASLt 时
torch.backends.cuda.matmul.allow_fp16_accumulation
崩溃问题 - 在 Blackwell 上启用 AsyncMM
- 修复
torch.cuda.MemPool
在多线程用例中的问题 - 修复在
layer_norm
中对默认构造的 gamma / beta 调用sum()
的问题 - 为分组 GEMM 负偏移量或 K=0 情况报错,避免挂起
- 在 mempool 上下文中
empty_cache
不再报错
分布式(Distributed)
c10d
- 修复
barrier
产生额外 CUDA 上下文的问题 - 修复在可能情况下优先使用组内 rank 而不是全局 rank 的逻辑
- 修复
all_to_all
的 ET trace 收集问题 - 禁用合并 col 时的开始事件记录并改进性能分析标题
- 修复 TCP store 中的连接重置问题
- 修复
new_subgroups()
中未使用的 group 输入参数问题 - 修复使用端口 0 时的 TCP 初始化问题
- 使用向量暂时保存 future 对象引用,以避免在 Flight Recorder 内部阻塞
分布式检查点(DCP)
- 修复
broadcast_object
工具函数中使用全局协调器 rank 的问题
分布式数据并行(DDP)
- 修复 DDPOptimizer 在静态张量索引下的问题
DTensor
- 修复多线程下的
local_map
- 修复
redistribute
中new_local_tensor
为 None 的情况 - 修复用 rich 可视化 1D 张量的错误
流水线并行(Pipeline Parallelism)
- 通过提前释放输出内存优化内存使用
RPC
- 在无 TensorPipe 编译时仍允许 import torch
分片张量(ShardedTensor)
- 修复在某些 rank 的本地张量为空时分片张量的聚合问题
张量并行(TensorParallel)
- 将异步 TP 适用性断言改回静默跳过
torch.compile
Dynamo
- 修复了编译自动求导(Compiled Autograd)初始 trace 中的静默错误
- 修复包括 einops、dict(mapping_proxy)、FlexAttention HOP 在内的多种 tracing 错误
- 修复检查点与卸载中节省内存的 unpack hook 语义
- 修复 dataclass 默认值和
lru_cache
方法的来源问题 - 修复传入无效 TORCH_LOGS 参数时的刷屏错误
Inductor
- 支持 AMD Triton 配置中的特殊 kwargs
- 修复在多个 Python 运行时时的 minifier
- 修复 int8 GEMM 补偿 epilogue
torch.export
- 修复以下算子的追踪:
aten.is_nonzero
、torch.bincount()
、aten.div
、切片(#150104)、attn_mask
、aten.to
、标量张量构造 - 修复
dynamic_shapes
在 kwargs 下的规范问题 - 修复 unflattener 中的输入错误
- 修复
functools.partial
和高阶算子的非严格跟踪 - 修复
None
输入、math 模块、call_torchbind
、枚举类型的序列化/反序列化问题 - 修复
run_decompositions
中state_dict
被修改的问题 - 修复子类访问自定义算子错误
Ahead-Of-Time Inductor (AOTI)
- 修复 AOTI 的
update_constant_buffer
问题 - 修复
model_package_loader
中的内存泄漏 - 当权重不存在时不在 AOTIModel 中分配
- 修复常量折叠(ConstantFolding)的状态
- 修复可选张量返回值的索引偏移问题
- 修复 float8 min/max 打印问题
线性代数前端(Linear Algebra Frontend)
- 修复 LAPACK 返回工作区大小为浮点数的兼容问题
- 修复
dot
和gemv
的累积类型 - 修复
torch.lobpcg
计算结果与scipy
、numpy.linalg.eig
一致性问题 - 修复 ReducedPrecisionGemV 中 32 位索引溢出
MPS
- 修复多种算子支持问题,包括:
- 输入元素 > 2**32 的一元/二元算子
- 不同 dtype 的二元算子
- 复数标量输入
- Cholesky 分解
floor_divide
类型提升- 大输入的 index_kernel
- 复数输入下的
lerp
logit
对半精度/bfloat16 输入- SDPA 内存泄漏
torch.special.entr
tri[ul]
- N>1024 时的矩阵求逆
- 非连续条件下的
where
torch.nn
- 修复
nn.LazyLinear
的load_state_dict
行为
ONNX
- 修复 ONNX 程序可调用对象中的 bfloat16 支持
- 在 IR TorchTensor 中产生正确的 bf16/f8 dtype
- 在回退时保留所有旧版导出器参数
- 修复 SDPA 的 4D 张量转换
优化器(Optimizer)
- 修复当
last_epoch > -1
时lr_scheduler
意外调用step()
的问题 - 修复
CosineAnnealingWarmRestarts
中T_cur
重置问题
性能分析器(Profiler)
- 修复 Python tracer 中空 C 调用队列
- 删除 Python tracer 中 Python 上下文的
decref
- 在 CUPTI Range Profiler 模式下启用所有已配置的活动
Python 前端(Python Frontend)
- 修复在将 Numpy 字符串张量转换时出现的段错误
- 为空张量列表添加检查
- 修复
MixtureSameFamily
分布的采样验证 - 修复多次创建
Wishart
或Uniform
分布会修改第一个分布约束的错误 - 正确导出
torch::utils::tensor_to_numpy
符号 - 修复
torch.[con]cat[enate]
在空输入时的崩溃 - 统一
torch.tensor
和torch.ops.aten.scalar_tensor
的行为
版本发布工程(Release Engineering)
- 发布源码包时检出可选子模块
- 修复 macOS 在 Python 3.12+ 中的多进程挂起问题
- 修复在 MSVC 中使用模块的静态函数问题
- 修复由 VS2022 导致的 AVX512 非法指令问题
ROCm
- 修复在新编译器下启用 opportunistic fastatomics 的构建错误
可调算子(TunableOp)
- 增加更多 TF32 支持
- 修复 ScaledGEMM 的离线调优问题
- 修复按行的 ScaledGEMM
- 支持 ROCm 的离线调优中使用子矩阵
Vulkan
- 修复 Mac 上
torch.is_vulkan_available()
的检测
XPU
- 修复当 offset > 0 时 matmul 的精度问题
- 修复
torch.xpu.is_bf16_supported
正确报告 Intel GPU 支持情况 - 修复 SYCL C++ 扩展中的 AOT 编译问题
性能优化
Autograd(自动求导)
- 改进了 autograd 流的同步性能
CPU(AArch64)
- 使用更高效的定义计算 ELU(0)
CUDA
- 提升了
cat
和index_select
的性能
Dataloader 前端
- 在
SubsetRandomSampler
中通过迭代列表而不是张量来减少内存使用
torch.compile
Inductor
- 提高了 GEMM 的性能
- 增加了配置选项
cpp.use_small_dequant_buffer
,以便在 WOQ int4 GEMM 中使用较小的反量化缓冲区 - 支持对自定义算子进行图分区
- 优化了 CPU 上并行归约的启发式策略
torch.export
- 缓存未展开的图模块
JIT(即时编译)
- 改进了大型计算图的无用代码消除(DCE)编译时间
线性代数前端
- 为
torch.dot
在 float16/bfloat16 类型下引入了快速路径
MPS(Metal Performance Shaders)
- 提升了 LayerNorm、mm / bmm、sum / prod 归约、算术运算、二元内核、SDPA、linear 以及
cumsum
/cumprod
的性能
Python 前端
- 优化了 SVE 嵌入的性能
- 提升了
torch.tensordot
在缩约为标量时的性能
ROCm
- 提升了 softmax、NLLLoss、就地加法求和、最大池化反向 / 归约(NHWC 格式输入)、最大池化、多维归约以及非向量化逐元素内核的性能
- 提升 MI250X 上 scatter add 的性能
- 将向量化逐元素内核扩展到更多异构张量类型
- 使用 HipSparseLT 进一步加速半结构化(如 2:4)稀疏计算
稀疏前端
- 当从外部存储加载稀疏张量时,跳过稀疏张量的不变性验证
XPU(Intel GPU)
- 为 oneDNN 卷积启用后处理融合
- 通过消除无意义 API 调用减少 Intel GPU 的主机端开销
- 为 Intel GPU 优化 INT4 WOQ GEMM,引入缓存机制进一步减少 oneDNN 集成开销
- 改进在
addmm
、baddmm
中标量张量的处理,降低 Intel GPU 上 oneDNN 集成的额外开销
文档(Documentation)
Autograd
- 在关于扩展 autograd 的说明中,增加了更多细节,解释了
ctx.save_for_backward
为什么重要 - 更新了
torch.autograd.graph.saved_tensors_hooks
的文档,避免引用循环(refcycle) - 更新了
torch.amin
和torch.amax
的梯度行为说明
CUDA
- 修复了文档中已弃用的 AMP API
- 在正确的模块中记录了设备内存 API
- 添加了关于 非 PyTorch CUDA 内存分配 及如何查询的方法文档
分布式(Distributed)
c10d
- 记录了 对象集合(object collectives) 的限制
- 更新了
NCCLConfig
文档,增加了 QOS 变量 - 记录了
get_default_backend_for_device
FullyShardedDataParallel2 (FSDP2)
- 更新了
ignored_params
的文档字符串并增加了单元测试 - 添加了指向 torchtitan 的参考
- 在 world size = 1 时添加了关于梯度结果不正确的警告
torch.export
- 添加了 溯源(provenance)跟踪 的迷你教程
- 更新了
Dims
和ExportGraphSignature
的文档
线性代数前端(Linear Algebra Frontend)
- 解决了文档中关于
torch.linalg.norm()
的ord
参数值为+2
和-2
的歧义
torch.nn
- 改进了关于 Transformer 相关层、nn.RNN、nn.functional 损失函数、
interpolate
饱和类型转换行为、ConvTranspose2d 的stride
/output_size
参数 以及register_full_backward_hook
的文档 - 修正了
nn.Sequential
和nn.LazyModuleMixin
的示例 - 在
nn.modules.padding
和AvgPoolND
中记录了 padding 大小的限制
ONNX
- 将
.rst
文档文件转换为 Markdown - 改进了 ONNX 符号操作(symbolic ops) 的文档字符串
- 为注意力(attention)操作的符号函数添加了注释
- 添加了 ONNX Dynamo 元数据 文档
优化器(Optimizer)
- 添加了用于生成学习率调度器(LRScheduler)曲线的脚本
- 在优化器的
capturable
参数文档中加入了其他加速器的信息 - 更新了 SGD 的文档,使其与实现一致,并说明 SGD 第一步会跳过
dampening
- 修正了
CosineAnnealingLR
文档,使其准确反映递归学习率调度 - 修正了
Adafactor
文档中作者引用错误 - 添加了关于在
lr_scheduler
中使用load_state_dict
时调用顺序的提示
Python 前端(Python Frontend)
- 使
torch.Library
的kind
无默认值,以与代码保持一致 - 添加了 32 位复数类型(complex)的
dtype
说明 - 明确了 当整数 dtype 与
requires_grad=True
一起使用 在tensor.to()
中的行为 - 优化了
cdist
参数描述 - 更新了序列化(serialization)文档
- 修复示例中的
Example:
显示为Example::
错误 - 在文档中指出 将 inf 转换为 int 是未定义行为
- 更新了
as_strided()
的文档 - 修复
keepdim
参数的可选性描述 - 明确
torch.trapezoid
中x
和dx
参数互斥 - 记录了 GEMM 运算的 out_dtype 参数
- 修正了
torch.min()
、torch.max()
、torch.all()
、torch.any()
的基本说明 - 添加了
torch.triu_indices
、torch.tril_indices
的 dtype 描述 - 优化了
torch.equal
的描述
量化(Quantization)
- 修正了
prepare_qat_fx
文档中get_default_qat_qconfig
错误
发布工程(Release Engineering)
- 迁移到新主题
XPU
- 改进了 Intel GPU 入门 文档中的硬件要求与注意事项
Developers(开发者更新)
Distributed(分布式)
- 为
uniqueID
的广播和全收集(allgather)添加了参数记录功能 - 为
PGNCCL
增加了日志配置和更多日志内容,例如nccl_version
以及线程名称/ID,以便飞行记录(flight record) - 在为
DumpPipe
解除链接并创建命名管道时,暴露错误类型 - 改进了
tcpstore
远程关闭时的日志 - 在
new_subgroups()
中,当世界大小不可整除时增强错误日志记录 - 为所有 NCCL 集合(collectives)添加了完成时的耗时日志记录器
- 更新了
get_backend()
错误信息,增加更多细节
FullyShardedDataParallel (FSDP1)
- 调试
FlatParamHandle
时打印完整限定名称(FQN)
FullyShardedDataParallel2 (FSDP2)
- 添加 FSDP2 日志记录
RPC
- 正确地将
rpc_init
中抛出的异常传递给 CPython
torchelastic
- 添加 torch elastic workers 启动的日志记录
- 将事件日志处理器传递给函数调用记录器
- 为
torch.distributed.run
添加选项,用于提供事件日志的存储位置
torch.export
- 添加
TracingContext
- Monkeypatch 模拟模式(fake mode),在自定义无效操作时报错
- 修复
torch.export
文档中的preserve_module_call_signature
描述 - 改进反序列化自定义 triton 运算符时的错误信息
- 改进
lift_constants_pass
的类型注解 - 修复
detect_attr_assignment
中的 bug
Ahead-Of-Time Inductor (AOTI)
- 为 Intel GPU 重构 AOTInductor 运行时 API
- 改进稳定库 API
- 添加基础 shim 和
stable::Tensor is_contiguous
API
FX
- 当块模式(block mode)中没有差异时,优雅地退出 minimizer
Optimizer
- 改进优化器子类的装饰器类型
- 优化
lr_scheduler.py
中的类型注解 - 修复
step()
默认值的类型提示
Release Engineering(发布工程)
- 在 CI/CD 中添加对 CUDA 12.9 的支持
- 在 CI/CD 中添加对 ROCm 6.4 的支持
- 将 CI 从 Ubuntu 20.04 镜像迁移至 Ubuntu 22.04 和 24.04
- 将 CI 迁移至 CUDA 12.8
- 在 CI 中启用 MI300 测试
- 在 CI 中启用 H100 测试
- 启用 Windows Arm64 的 CD(持续交付)
- 在 CI/CD 中启用二进制 Docker 构建测试
- 添加冒烟测试(smoke test)以验证 PyPI 包中的 NCCL 和 cuDNN 版本
- 改进 macOS 上的基准测试与性能测试
- 在 Mac 测试中使用
setup-python
- 在 CI/CD 中移除对 CUDA 11.8 和 12.4 的支持
- 在 CI/CD 中移除对 Anaconda 的支持
总结
PyTorch 2.8.0 在推理性能、编译优化和分布式训练等方面带来了多项重要更新。开发者需注意部分向后不兼容的变更,并及时调整代码逻辑。建议在升级前充分测试现有代码,确保兼容性和稳定性。