博客

PyTorch 1.13 发布,包括 functorch 的 beta 版本和对 Apple 新 M1 芯片的改进支持。

作者: 2022年10月28日2024年11月15日暂无评论

我们非常高兴地宣布发布 PyTorch® 1.13 (发布说明)!本次发布包含了 BetterTransformer 的稳定版。我们弃用了 CUDA 10.2 和 11.3,并完成了向 CUDA 11.6 和 11.7 的迁移。测试版功能包括对苹果 M1 芯片的改进支持,以及将 functorch(一个提供可组合 vmap(向量化)和自动微分变换的库)集成到 PyTorch 发行版中。自 1.12.1 版本以来,本次发布包含超过 3,749 次提交和 467 位贡献者。我们要衷心感谢我们敬业的社区所做出的贡献。

总结

  • BetterTransformer 功能集支持在推理过程中对常见的 Transformer 模型进行开箱即用的快速路径执行,无需修改模型。其他改进包括针对 Transformer 模型中常用尺寸的加速 add+matmul 线性代数内核,且嵌套张量(Nested Tensors)现已默认启用。
  • 及时弃用旧版 CUDA 使我们能够随着 Nvidia® 的节奏引入最新 CUDA 版本,从而使 PyTorch 能够支持 C++17 和最新的 NVIDIA 开源 GPU 内核模块。
  • 此前,functorch 是作为独立包在外部发布的。现在,用户在安装 PyTorch 后,无需安装其他包即可直接 import functorch 并使用它。
  • PyTorch 现为使用苹果新款 M1 芯片的苹果芯片机器提供原生构建版本作为测试功能,并在整个 PyTorch API 中提供改进的支持。
稳定版Beta原型
Better Transformer启用 Intel® VTune™ Profiler 的仪器与追踪技术 (ITT) API针对 AWS Graviton 的 Arm® Compute Library 后端支持
CUDA 10.2 和 11.3 CI/CD 弃用扩展 NNC 以支持 channels last 和 bf16CUDA Sanitizer
 Functorch 现已进入 PyTorch 核心库 
 M1 设备测试版支持 

在发布 1.13 的同时,我们还对 PyTorch 各类库进行了重大更新,更多详情可参见此博客

稳定功能

(稳定版) BetterTransformer API

首次发布于 PyTorch 1.12 的 BetterTransformer 功能集现已稳定。PyTorch BetterTransformer 支持在推理期间对常见的 Transformer 模型进行开箱即用的快速路径执行,无需修改模型。作为对 Better Transformer 改进的补充,我们还针对 Transformer 模型中常用尺寸的 add+matmul 线性代数内核进行了加速。

考虑到对许多 NLP 用户的性能提升,Better Transformer 的嵌套张量使用现已默认启用。为确保兼容性,系统会执行掩码检查以确保提供的是连续掩码。在 Transformer Encoder 中,可以通过设置 mask_check=False 来禁止 src_key_padding_mask 的掩码检查。这对于能够保证仅提供对齐掩码的用户来说,可以加速处理。最后,我们提供了更好的错误消息来诊断错误的输入,并改进了诊断信息,解释了为什么无法使用快速路径执行。

Better Transformer 已直接集成到 PyTorch TorchText 库中,使 TorchText 用户能够透明且自动地利用 BetterTransformer 的速度和效率优势。(教程)

图: BetterTransformer 快速路径执行现已稳定,并默认支持使用嵌套张量表示进行稀疏性优化

引入 CUDA 11.6 和 11.7,并弃用 CUDA 10.2 和 11.3

及时弃用旧版 CUDA 版本使我们能够随着 Nvidia® 的节奏引入最新的 CUDA 版本,从而使开发者能够使用 CUDA 的最新功能,并受益于最新版本提供的正确性修复。

停用 CUDA 10.2。CUDA 11 是第一个支持 C++17 的 CUDA 版本。因此,停用旧版 CUDA 10.2 是 PyTorch 增加对 C++17 支持的重要一步。这也有助于通过消除旧版 CUDA 10.2 特有的指令来改进 PyTorch 代码。

停用 CUDA 11.3 并引入 CUDA 11.7,为新的 NVIDIA 开源 GPU 内核模块提供了兼容支持,另一个显著亮点是延迟加载(lazy loading)支持。CUDA 11.7 随附 cuDNN 8.5.0,其中包含多项加速基于 Transformer 模型的优化、减少了 30% 的库大小,并改进了运行时融合引擎。通过我们的发布说明了解更多关于 CUDA 11.7 的信息。

测试版功能

(测试版) functorch

Google® JAX 的启发,functorch 是一个提供可组合 vmap(向量化)和自动微分变换的库。它实现了高级自动微分用例,这些用例在 PyTorch 中原本很难表达。示例如下:

我们很高兴地宣布,作为与 PyTorch 更紧密集成的一步,functorch 已移入 PyTorch 库内部,不再需要安装单独的 functorch 包。通过 conda 或 pip 安装 PyTorch 后,您可以在程序中直接 `import functorch`。通过我们的详细说明每日构建版发布说明了解更多信息。

(测试版) Intel® VTune™ Profiler 的仪器与追踪技术 (ITT) API 集成

当 PyTorch 用户需要在 Intel 平台上分析带有底层性能指标的逐算子性能时,他们可以在 Intel® VTune™ Profiler 中可视化 PyTorch 脚本执行的操作级时间线。

with torch.autograd.profiler.emit_itt():
    for i in range(10):
        torch.itt.range_push('step_{}'.format(i))
        model(input)
        torch.itt.range_pop()

通过我们的教程了解更多。

(测试版) NNC:添加 BF16 和 Channels last 支持

通过向 NNC 添加 channels last 和 BF16 支持,x86 CPU 上的 TorchScript 图模式推理性能得到了提升。PyTorch 用户可以在大多数流行的 x86 CPU 上从 channels last 优化中受益,并在 Intel Cooper Lake 和 Sapphire Rapids 处理器上从 BF16 优化中受益。在 Intel Cooper Lake 处理器上,通过这两项优化,广泛的视觉模型性能提升了超过 2 倍(几何平均值)。

性能提升可通过现有的 TorchScript、channels last 和 BF16 Autocast API 获得。请参阅下面的代码片段。我们将把 NNC 中的优化迁移到新的 PyTorch DL 编译器 TorchInductor。

import torch
import torchvision.models as models
model = models.resnet50(pretrained=True)
# Convert the model to channels-last
model = model.to(memory_format=torch.channels_last)
model.eval()
data = torch.rand(1, 3, 224, 224)
# Convert the data to channels-lastdata = data.to(memory_format=torch.channels_last)
# Enable autocast to run with BF16
with torch.cpu.amp.autocast(), torch.no_grad():
# Trace the model
model = torch.jit.trace(model, torch.rand(1, 3, 224, 224))
	model = torch.jit.freeze(model)
	# Run the traced model
	model(data)

(测试版) M1 设备支持

自 v1.12 起,PyTorch 一直为使用苹果新款 M1 芯片的苹果芯片机器提供原生构建版本作为原型功能。在本次发布中,我们将此功能升级为测试版,并在整个 PyTorch API 中提供改进的支持。

我们现在在 M1 macOS 12.6 实例上运行除 torch.distributed 之外的所有子模块测试。通过这种改进的测试,我们能够修复如 cpp 扩展和某些输入下的卷积正确性等功能。

要开始使用,只需在运行 macOS 12 或更高版本的苹果芯片 Mac 上安装带有原生版本 (arm64) Python 的 PyTorch v1.13。通过我们的发布说明了解更多信息。

原型功能

(原型) 针对 AWS Graviton 的 Arm® Compute Library (ACL) 后端支持

我们利用 Arm Compute Library (ACL) 在 aarch64 CPU 上实现了 CV 和 NLP 推理的显著改进,为 PyTorch 和 torch-xla 模块启用了 ACL 后端。亮点包括:

  • 将 mkldnn + acl 启用为 aarch64 torch wheel 的默认后端。
  • 为 aarch64 bf16 设备启用了 mkldnn matmul 算子。
  • 将 TensorFlow xla+acl 功能引入了 torch-xla。我们利用 Arm Compute Library 运行时为 aarch64 CPU 增强了 TensorFlow xla。这些更改已包含在 TensorFlow 主分支以及即将发布的 TF 2.10 中。一旦 torch-xla 仓库更新以匹配 tensorflow 提交,它将具备编译 torch-xla 的支持。在 Graviton3 上,与 torch 1.12 wheel 相比,我们观察到 MLPerf Bert 推理有约 2.5-3 倍的提升。

(原型) CUDA Sanitizer

启用后,该清理器(Sanitizer)将开始分析因用户 PyTorch 代码而调用的底层 CUDA 操作,以检测由来自不同 CUDA 流的未同步数据访问引起的数据竞争错误。发现的错误将连同错误访问的堆栈跟踪一起打印出来,就像 Thread Sanitizer 所做的那样。一个简单的错误示例以及清理器产生的输出可以在这里查看。这对于机器学习应用特别有用,因为损坏的数据对人类来说很容易被忽视,且错误可能并不总是显现出来;而清理器将始终能够检测到它们。

(原型) 有限的 Python 3.11 支持

支持 Python 3.11 的 Linux 二进制文件可通过 pip 下载。请按照入门页面上的说明操作。请注意,Python 3.11 支持仅为预览版。特别是 Distributed、Profiler、FX 和 JIT 等功能可能尚未完全正常工作。