由 PyTorch 团队

我们非常高兴地宣布 PyTorch 1.12(发布说明)的发布!这次发布包含超过 3124 个提交,433 位贡献者。除了 1.12 版本,我们还发布了 AWS S3 集成、PyTorch 在 CPU 上使用 Channels Last 的视觉模型、通过 Bfloat16 和 FSDP API 增强 PyTorch 在 Intel® Xeon®可扩展处理器上的功能。我们衷心感谢我们的忠实社区成员的贡献。

摘要:

  • 使用给定的参数以功能方式应用模块计算的功能 API
  • PyTorch 中的 Complex32 和复卷积
  • TorchData 的 DataPipes 与 DataLoader 完全向后兼容
  • functorch 对 API 的覆盖范围进行了改进
  • nvFuser:PyTorch 的深度学习编译器
  • 在 Ampere 及以后 CUDA 硬件上对 float32 矩阵乘法精度的更改
  • TorchArrow,一个针对批量数据机器学习预处理的全新 beta 库

前端 API

介绍 TorchArrow

我们为您准备好了新版本的 Beta 发布版,供您尝试和使用:TorchArrow。这是一个针对批量数据机器学习预处理的库。它提供了一个性能优异且易于使用的 Pandas 风格 API,以加快您的预处理工作流程和开发。

目前,它提供了以下功能的 Python DataFrame 接口:

  • 高性能 CPU 后端,支持 Velox 的矢量化且可扩展的用户自定义函数(UDFs)
  • 与 PyTorch 或其他模型编写无缝对接,例如 Tensor 整理,轻松集成到 PyTorch DataLoader 和 DataPipes
  • 通过 Arrow 内存列式格式实现外部读取的零拷贝

更多详情,请参阅我们的 10 分钟教程、安装说明、API 文档以及 TorchRec 中的数据预处理原型

(Beta) 模块功能 API

PyTorch 1.12 引入了一个新的 Beta 功能,可以以给定的参数集功能性地应用模块计算。有时,传统的 PyTorch 模块使用模式,即内部维护一个静态的参数集,过于限制。这在实现元学习算法时尤为常见,在元学习算法中,可能需要在优化器步骤中维护多个参数集。

新的 torch.nn.utils.stateless.functional_call() API 允许:

  • 对使用的参数集进行完全灵活的模块计算
  • 无需以函数式方式重新实现您的模块
  • 模块中存在的任何参数或缓冲区都可以用外部定义的值进行交换,以用于调用。参数/缓冲区的命名遵循模块的完全限定形式 state_dict()

例如:

import torch
from torch import nn
from torch.nn.utils.stateless import functional_call

class MyModule(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(3, 3)
        self.bn = nn.BatchNorm1d(3)
        self.fc2 = nn.Linear(3, 3)

    def forward(self, x):
        return self.fc2(self.bn(self.fc1(x)))

m = MyModule()

# Define parameter / buffer values to use during module computation.
my_weight = torch.randn(3, 3, requires_grad=True)
my_bias = torch.tensor([1., 2., 3.], requires_grad=True)
params_and_buffers = {
    'fc1.weight': my_weight,
    'fc1.bias': my_bias,
    # Custom buffer values can be used too.
    'bn.running_mean': torch.randn(3),
}

# Apply module computation to the input with the specified parameters / buffers.
inp = torch.randn(5, 3)
output = functional_call(m, params_and_buffers, inp)

(Beta) PyTorch 中的 Complex32 和复数卷积

今天 PyTorch 原生支持复数、复数自动微分、复数模块以及众多复数操作,包括线性代数和快速傅里叶变换(FFT)算子。许多库,包括 torchaudio 和 ESPNet,已经在 PyTorch 中使用复数,PyTorch 1.12 进一步通过复数卷积和实验性的 complex32(复数半精度)数据类型扩展了复数功能,该数据类型可以启用半精度 FFT 操作。由于 CUDA 11.3 软件包中的错误,如果您正在使用复数,我们建议使用 CUDA 11.6 软件包。

(Beta) 前向自动微分

前向自动微分允许在正向传播中积极计算方向导数(或等价地,雅可比-向量积)。PyTorch 1.12 显著提高了前向自动微分的算子覆盖范围。请参阅我们的教程以获取更多信息。

TorchData

BC DataLoader + DataPipe

`DataPipe` 从 TorchData 完全与现有的 `DataLoader` 兼容,在多进程和分布式环境中的洗牌确定性和动态分片方面。

(Beta) AWS S3 集成

基于 AWSSDK 的 DataPipes 已集成到 TorchData 中。它提供了以下由原生 AWSSDK 支持的功能:

  • 根据前缀从每个 S3 存储桶检索 URL 列表
    • 支持超时以防止无限期挂起
    • 支持指定 S3 存储桶区域
  • 从 S3 URL 加载数据
    • 支持缓冲和多部分下载
    • 支持指定 S3 存储桶区域

AWS 原生 DataPipes 仍处于测试阶段。我们将持续调整以提升其性能。

(原型)DataLoader2

DataLoader2 已以原型模式推出。我们正在引入新的方式来交互 DataPipes、DataLoading API 和后端(即 ReadingServices)。在 API 方面功能稳定,但功能上尚未完善。我们欢迎早期采用者、反馈以及潜在贡献者。

更多详情,请查看链接。

functorch

受 Google JAX 的启发,functorch 是一个提供可组合的 vmap(向量化)和自动微分变换的库。它使得在 PyTorch 中难以表达的高级自动微分用例成为可能。这些用例的例子包括:

我们非常高兴地宣布 functorch 0.2.0 版本,该版本包含多项改进和新实验性功能。

显著提升覆盖率

我们显著提升了 functorch.jvp (我们的前向模式自动微分 API)以及其他依赖它的 API( functorch.{jacfwd, hessian} )的覆盖率。

(原型)functorch.experimental.functionalize

给定一个函数 f, functionalize(f) 返回一个不进行修改的新函数(存在限制)。这在构建 PyTorch 函数的跟踪时非常有用,可以避免原地操作。例如,您可以使用 make_fx(functionalize(f)) 来构建一个无修改的 PyTorch 函数跟踪。欲了解更多信息,请参阅文档。

欲获取更多详细信息,请参阅我们的安装说明、文档、教程和发布说明。

性能提升

介绍 nvFuser,PyTorch 的深度学习编译器

在 PyTorch 1.12 中,Torchscript 正在更新其默认的 fuser(针对 Volta 及以后的 CUDA 加速器)为 nvFuser,它支持更广泛的操作,并且比之前的 CUDA 设备 fuser NNC 更快。即将发布的博客文章将详细介绍 nvFuser,并展示它是如何加速各种网络训练的。

请参阅 nvFuser 文档以获取更多关于使用和调试的详细信息。

在 Ampere 及以后 CUDA 硬件上对 float32 矩阵乘法的精度进行了更改

PyTorch 支持多种“混合精度”技术,如 torch.amp(自动混合精度)模块,以及在 Ampere 及以后 CUDA 硬件上使用 TensorFloat32 数据类型执行 float32 矩阵乘法,以实现更快的内部计算。在 PyTorch 1.12 版本中,我们将 float32 矩阵乘法的默认行为更改为始终使用完整的 IEEE fp32 精度,这比使用 TensorFloat32 数据类型进行内部计算更精确但速度较慢。对于 TensorFloat32 与 float32 吞吐量比率特别高的设备,如 A100,这种默认设置的改变可能会导致速度大幅下降。

如果您一直在使用 TensorFloat32 矩阵乘法,则可以通过设置 torch.backends.cuda.matmul.allow_tf32 = True 继续这样做。

自 PyTorch 1.7 开始支持,从 PyTorch 1.12 开始,也可以使用新的矩阵乘精度 API: torch.set_float32_matmul_precision(“highest”|”high”|”medium”)

再次强调,PyTorch 对所有设备类型的新默认精度为“最高”。我们认为这为不同设备类型的矩阵乘法提供了更好的一致性。新精度 API 的文档可以在这里找到。将精度设置为“高”或“中”将启用 Ampere 和后续 CUDA 设备上的 TensorFloat32。如果您正在更新到 PyTorch 1.12,为了保留 Ampere 设备上矩阵乘法的当前行为和更快性能,请将精度设置为“高”。

使用混合精度技术对于高效训练许多现代深度学习网络至关重要,如果您已经使用 torch.amp,则此更改不太可能影响您。如果您不熟悉混合精度训练,请参阅我们即将发布的“关于 PyTorch 混合精度训练的每个用户都应该知道的内容”博客文章。

(Beta)在 CPU 上使用 Channels Last 加速 PyTorch 视觉模型

内存格式对运行视觉模型时的性能有重大影响,通常从性能角度来看,通道最后(Channels Last)更为有利,因为其数据局部性更好。1.12 版本包括内存格式的基本概念,并展示了在 Intel® Xeon® Scalable 处理器上使用通道最后(Channels Last)对流行的 PyTorch 视觉模型进行性能提升的示例。

  • 支持 CV 领域常用操作符的通道最后(Channels Last)内存格式,适用于推理和训练。
  • 对 ATen 的通道最后(Channels Last)内核提供原生级别的优化,适用于 AVX2 和 AVX512。
  • 在 Intel® Xeon® Ice Lake(或更高版本)CPU 上,相对于通道第一(Channels First),TorchVision 模型可提供 1.3 倍至 1.8 倍的推理性能提升。

(Beta) 在 Intel® Xeon® 可扩展处理器上赋能 PyTorch,支持 Bfloat16

降低了精度的数值格式如 bfloat16 可提升 PyTorch 在多个深度学习训练工作负载中的性能。PyTorch 1.12 版本包含了最新的 bfloat16 软件增强功能,适用于更广泛的用户场景,并展示了更高的性能提升。主要改进包括:

  • 与 float32 相比,新的 bfloat16 原生指令 VDPBF16PS(在 Intel® Xeon® Cooper Lake CPU 上引入)提供了 2 倍的硬件计算吞吐量
  • 相比 float32 内存占用减少一半,对内存带宽密集型操作符速度更快
  • 在 Intel® Xeon® Cooper Lake(或更高版本)CPU 上,TorchVision 模型相较于 float32 推理性能提升 1.4 倍至 2.2 倍

(原型)介绍在 Mac 上加速 PyTorch 训练

随着 PyTorch 1.12 版本的发布,开发者和研究人员现在可以利用 Apple 硅 GPU 显著加速模型训练。这解锁了在 Mac 上本地执行机器学习工作流程(如原型设计和微调)的能力。加速 GPU 训练通过使用 Apple 的 Metal Performance Shaders(MPS)作为后端来实现。这些好处包括加速 GPU 训练带来的性能提升以及本地训练更大网络或批量大小的能力。了解更多信息请点击此处。

与仅 CPU 相比,加速的 GPU 训练和评估速度提升(倍数)

在新的 MPS 设备支持的同时,过去几个版本中可用的 M1 二进制文件(针对 Core 和 Domain 库)现在成为官方原型功能。这些二进制文件可用于在 Apple 硅上原生运行 PyTorch。

(原型)BetterTransformer:Transformer 编码器推理的 Fastpath 执行

PyTorch 现在支持 CPU 和 GPU 的 Fastpath 实现(“BetterTransformer”),包括 TransformerEncoder、TransformerEncoderLayer 和 MultiHeadAttention(MHA)等几个 Transformer 编码器模块。BetterTransformer 的 Fastpath 架构在许多常见执行场景中始终更快——对于许多场景来说,速度提升 2 倍,具体取决于模型和输入特征。新的 BetterTransformer 模块与 PyTorch Transformer API 的先前版本 API 兼容,如果它们满足 Fastpath 执行要求,将加速现有模型,同时也能读取使用先前版本的 PyTorch 训练的模型。PyTorch 1.12 包括:

  • BetterTransformer 集成到 Torchtext 的预训练 RoBERTa 和 XLM-R 模型
  • 基于 PyTorch Transformer API 的 Torchtext
  • 通过融合内核将多个算子合并为一个,以减少执行开销,从而实现快速路径执行以提高性能
  • 通过在创建 TransformerEncoder 时设置 enable_nested_tensor=True,利用自然语言处理中填充标记处理过程中的数据稀疏性,实现额外的加速
  • 诊断工具,帮助用户理解为什么没有发生快速路径执行

分布式

(Beta) 全分片数据并行(FSDP)API

FSDP API 通过将模型的参数、梯度和优化器状态分片到数据并行工作器,同时保持数据并行的简单性,帮助轻松扩展大型模型训练。原型版本在 PyTorch 1.11 中发布,具有最小功能集,有助于扩展测试具有高达 1T 参数的模型。

在这个测试版中,FSDP API 添加了以下功能以支持各种生产工作负载。本测试版中新添加的功能亮点包括:

  1. 通用分片策略 API - 用户可以通过单行更改轻松切换分片策略,从而比较和使用 DDP(仅数据分片)、FSDP(全模型和数据分片)或 Zero2(仅优化器和梯度分片)来优化特定训练需求的内存和性能
  2. 精细粒度混合精度策略 - 用户可以通过混合精度策略指定模型参数、梯度通信和缓冲区的半精度(bfloat16、fp16 或 fp32)数据类型混合。模型自动以 fp32 格式保存,以实现最大程度的可移植性
  3. Transformer 自动包装策略 - 通过注册模型层类,允许对基于 Transformer 的模型进行最佳包装,从而加速训练性能
  4. 使用 device_id init 加速模型初始化 - 初始化以流式方式进行,以避免内存溢出问题并优化初始化性能与 CPU 初始化相比
  5. 大型模型全模型保存的 Rank0 流式处理 - 所有 GPU 可以通过将它们的分片流式传输到 Rank 0 GPU 来保存完全分片模型,模型在 Rank 0 CPU 上以完整状态构建以保存

更多详情和示例代码,请查看文档和教程。

感谢阅读,如果您对这些更新感兴趣并想加入 PyTorch 社区,我们鼓励您加入讨论论坛和 GitHub 问题。要获取 PyTorch 的最新消息,请关注我们的 Twitter、Medium、YouTube 和 LinkedIn。

喝彩!

PyTorch 团队