PyTorch 团队在官方博客宣布 PyTorch 1.9 发布。该版本包括了 1.8 版本发布以来,398 位贡献者提交的 3400 多条 PR,详情访问 Here

在官方博客中,团队总结了 PyTorch 1.9 版本的亮点,包括:

  • 为支持科学计算进行了重大改进,包括 torch.linalg 、 torch.special 和 Complex Autograd;
  • 针对移动开发,对解释器适配设备上的二进制大小的重大改进;
  • 通过将 TorchElastic 上传到 PyTorch Core 中,实现了对弹性容错训练的本地支持;
  • 对 PyTorch RPC 框架的重大更新,以支持具有 GPU 支持的大规模分布式训练;
  • 为优化模型推理部署的性能和包装,设计的新 API;
  • 在 PyTorch 分析器中支持分布式训练、GPU 利用率和 SM 效率;

在发布 1.9 版本的同时,官方还发布了 PyTorch 库的重大更新。

PyTorch 版本中的功能被分为稳定版、测试版和原型版。你可以在官方 blog 中了解详情。

前端 APIs

  • (稳定版) torch.linalg

在 1.9 版本中, torch.linalg 模块正在向稳定版本过渡。线性代数对于深度学习和科学计算至关重要,torch.linalg 模块通过实现 NumPy 线性代数模块(现在支持加速器和 autograd)中的每个函数, 如 torch.linalg.matrix_norm 和 torch.linalg.householder_product ,扩展了 PyTorch 对它的支持。

曾使用过 NumPy 的用户对该模块会非常熟悉。

  • (稳定版) Complex Autograd

在 PyTorch 1.8 中作为测试版发布的 Complex Autograd 功能现在已经稳定可用。 自测试版发布以来,我们在 PyTorch 1.9 中为 98% 以上的运算符扩展了对 Complex Autograd 的支持,通过增加更多的 OpInfos 改进了对复杂运算符的测试,并通过 TorchAudio 迁移到本地复杂张量增加了更多的验证。

  • (稳定版) torch.use_deterministic_algorithms()

为了便于调试和编写可重复的程序,PyTorch 1.9 包括一个 torch.use_determinstic_algorithms 选项。启用该设置后,如果可能的话,操作将以确定的方式进行,如果可能以非确定的方式进行,则抛出运行时错误。这里有几个例子。

>>> a = torch.randn(100, 100, 100, device='cuda').to_sparse()
>>> b = torch.randn(100, 100, 100, device='cuda')

# Sparse-dense CUDA bmm is usually nondeterministic
>>> torch.bmm(a, b).eq(torch.bmm(a, b)).all().item()
False

>>> torch.use_deterministic_algorithms(True)

# Now torch.bmm gives the same result each time, but with reduced performance
>>> torch.bmm(a, b).eq(torch.bmm(a, b)).all().item()
True

# CUDA kthvalue has no deterministic algorithm, so it throws a runtime error
>>> torch.zeros(10000, device='cuda').kthvalue(1)
RuntimeError: kthvalue CUDA does not have a deterministic implementation...
  • (Beta版) torch.special

类似于 SciPy 的 special 模块的 torch.special 模块,现在已经有了测试版本。这个模块包含了许多对科学计算和处理 IV、VE、ERFCX、logerfc 和 logerfcx 等分布有用的功能。

  • (Beta版) nn.Module parameterization

nn.Module 允许用户对 nn.Module 的任何参数或缓冲区进行参数化,而无需修改 nn.Module 本身。它允许你约束你的参数所处的空间,而不需要特殊的优化方法。

这也包含了 PyTorch 1.9 的 spectral_norm 参数化的一个新实现。更多的参数化将被添加到该功能中(权重_norm、矩阵约束和部分修剪),以便该功能在 1.10 中更稳定。更多细节,请参考文档和教程。

PyTorch 移动端

  • (Beta 版) Mobile Interpreter

发布 Mobile Interpreter,这是 PyTorch 运行时的精简版,处于测试阶段。解释器将在边缘设备中执行 PyTorch 程序,并减少二进制大小的足迹。

移动解释器是 PyTorch Mobile 最受欢迎的功能之一。与目前的设备上运行时间相比,这个新版本将大大减少二进制大小。目前在 arm64-v8a 安卓系统中,使用 MobileNetV2 的 pt 大小为 8.6 MB,未压缩为 17.8 MB。使用 Mobile Interpreter,我们的目标是压缩后的大小低于 4MB,未压缩的大小低于 8MB 。更多细节,请参考该教程。

  • TorchVision Library

从 1.9 版本开始,用户可以在其 iOS/Android 应用程序中使用 TorchVision 库。Torchvision 库包含了 C++ TorchVision 操作,对于 iOS 来说,它需要与 PyTorch 主库链接在一起,对于 Android 来说,它可以作为 gradle 依赖项添加。这允许使用 TorchVision 预先构建的 MaskRCNN 操作符进行对象检测和分割。要了解更多关于该库的信息,请参考我们的教程和演示应用程序。

  • Demo apps

我们正在发布一个基于 PyTorch 视频库的新视频应用和一个基于最新 torchaudio、wave2vec 模型的更新的语音识别应用。两者都可以在 iOS 和 Android 上使用。此外,我们还用 PyTorch Mobile v1.9 更新了七个计算机视觉和三个自然语言处理演示应用程序,包括 HuggingFace DistilBERT,以及 DeiT 视觉变换器模型。随着这两个应用程序的加入,我们现在提供了一整套涵盖图像、文本、音频和视频的演示应用程序。要开始使用,请查看我们的 iOS 演示 app和 Android 演示 app。

pytorch cifar10下载 pytorch1.9_pytorch

分布式训练

  • (Beta) TorchElastic is now part of core

TorchElastic 是一年多前在 pytorch/elastic github 仓库中开源的,是 PyTorch 工作进程的运行器和协调器。从那时起,它已经被各种分布式 Torch 的使用场景所采用。1) deepspeech.pytorch 2) pytorch-lightning 3) Kubernetes CRD。现在,它是 PyTorch 核心的一部分。

正如其名称所示,TorcheElastic 的核心功能是优雅地处理缩放事件。弹性的一个值得注意的推论是,对等体发现和等级分配是内置于 TorchElastic 的,使用户能够在可抢占的实例上运行分布式训练,而不需要帮派调度器。顺便提一下,etcd 曾经是 TorchElastic 的一个硬依赖。在上游版本中,这种情况不再存在,因为我们已经添加了一个基于 c10d::Store 的 "独立 "交会点。更多细节,请参考文档。

  • (Beta 版) Distributed Training Updates

除了 TorchElastic 之外,在分布式软件包中还有一些测试版的功能。

  1. (测试版)在 RPC 中提供了 CUDA 支持。
  2. (测试版)ZeroRedundancyOptimizer。ZeroRedundancyOptimizer 可以和 DistributedDataParallel 一起使用,以减少每个进程优化器状态的大小。
  3. (测试版)支持对分布式集体进行性能分析。PyTorch 的性能分析工具 torch.profiler 和 torch.autograd.profiler 能够优化分布式集体和点对点通信原语,包括 allreduce、alltoall、allgather、send/recv 等。

性能优化与工具

  • (稳定版) Freezing API

模块冻结是将模块参数和属性值作为常量纳入 TorchScript 内部表示的过程。这允许进一步优化和专门化你的程序,既可用于 TorchScript 的优化,又可降低到其他后端。它被 optimation_for_mobile API、ONNX 等使用。

冻结被推荐用于模型部署。它可以帮助 TorchScript JIT 优化消除训练、调整或调试 PyTorch 模型所需的开销和簿记。它可以实现在非冻结图上语义上无效的图融合–比如融合 Conv-BN。更多细节,请参考文档。

  • (Beta 版) PyTorch Profiler

pytorch cifar10下载 pytorch1.9_API_02


新的 PyTorch profiler 已经升级为测试版,利用 Kineto 进行 GPU 进行性能分析,利用 TensorBoard 进行可视化,现在是我们整个教程和文档的标准。

PyTorch 1.9 将对新的 torch.profiler API 的支持扩展到了更多的构建中,包括 Windows 和 Mac,并在大多数情况下推荐使用,而不是以前的 torch.autograd.profiler API。新的 API 支持现有的性能分析功能,集成了 CUPTI 库(仅限 Linux)以跟踪设备上的 CUDA 内核,并提供了对长期运行的作业的支持,例如。

def trace_handler(p):
    output = p.key_averages().table(sort_by="self_cuda_time_total", row_limit=10)
    print(output)
    p.export_chrome_trace("/tmp/trace_" + str(p.step_num) + ".json")

with profile(
    activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA],
    # schedule argument specifies the iterations on which the profiler is active
    schedule=torch.profiler.schedule(
        wait=1,
        warmup=1,
        active=2),
    # on_trace_ready argument specifies the handler for the traces
    on_trace_ready=trace_handler
) as p:
    for idx in range(8):
        model(inputs)
        # profiler will trace iterations 2 and 3, and then 6 and 7 (counting from zero)
        p.step()

更多的使用例子可以在性能分析页面找到。

PyTorch Profiler Tensorboard 插件具有以下新功能。

  1. 带有 NCCL 通信概述的分布式训练摘要视图
  2. 追踪视图和 GPU 操作者视图中的 GPU 利用率和 SM 效率
  3. 内存分析视图
  4. 从微软 VSCod e启动时跳到源头
  5. 能够从云对象存储系统加载轨迹
  • (Beta 版) Inference Mode API

推理模式 API 可以显著提高推理工作负载的速度,同时保持安全,确保永远不会计算出错误的梯度。当 no autograd 状态时,它提供了最好的性能。更多的细节,请参考推理模式本身的文档和解释何时使用它以及与 no_grad 模式区别的文档。

  • (Beta 版) torch.package

torch.package 是一种将 PyTorch 模型以独立、稳定的格式打包的新方法。一个包将包括模型的数据(如参数、缓冲区)和它的代码(模型架构)。将一个模型与它的全套 Python 依赖关系打包,再加上一个带有钉子的版本的 conda 环境描述,可以用来轻松复制训练。在一个独立的工件中表示一个模型,也将允许它在整个生产 ML 管道中发布和传输,同时保留纯 Python 表示的灵活性。更多细节,请参考文档。

  • (原型版) prepare_for_inference (for TorchScript Modules)

prepare_for_inference 是一个新的原型功能,它可以接收一个模块并进行图级优化,以提高推理性能,具体取决于设备。它旨在成为 PyTorch 的原生选项,需要对用户的工作流程进行最小的改动。更多细节,请参见文档。

  • (原型版) Profile-directed typing in TorchScript

TorchScript 有一个硬性要求,即源代码必须有类型注释,这样才能编译成功。长期以来,我们只能通过尝试和错误(即通过逐一修复 torch.jit.script 产生的类型检查错误)来添加缺失或不正确的类型注释,这既低效又费时。现在,我们通过利用现有的工具(如 MonkeyType),为 torch.jit.script 启用了配置文件定向键入,这使得这个过程更加简单、快速和高效。更多细节,请参考文档。