今天,我们宣布 PyTorch 1.6 的可用性,以及更新后的领域库。我们还非常高兴地宣布,微软团队现在正在维护 Windows 构建和二进制文件,并将支持 GitHub 上的社区以及 PyTorch Windows 讨论论坛。
PyTorch 1.6 版本包括许多新的 API、性能改进和性能分析工具,以及对基于分布式数据并行(DDP)和远程过程调用(RPC)的分布式训练的重大更新。其中一些亮点包括:
- 现已原生支持自动混合精度(AMP)训练,这是一个稳定的功能(更多信息请见此处)——感谢 NVIDIA 的贡献;
- 现已添加原生 TensorPipe 支持,专为机器学习构建的 tensor 感知、点对点通信原语;
- 前端 API 界面支持复杂张量;
- 新增提供张量级内存消耗信息的分析工具;
- 对分布式数据并行(DDP)训练和远程过程调用(RPC)包的众多改进和新功能;
此外,从本版本开始,功能将被分类为稳定版、测试版和原型版。原型功能不包括在二进制发行版中,而是可以通过从源代码构建、使用夜间版本或通过编译器标志获取。您可以在以下帖子中了解更多关于此更改的含义。您还可以在此处找到完整的发行说明。
性能与性能分析
[稳定] 自动混合精度(AMP)训练
AMP 允许用户轻松启用自动混合精度训练,在 Tensor Core GPU 上实现高达 50%的性能提升和内存节省。使用原生支持的 torch.cuda.amp
API,AMP 提供了混合精度的便捷方法,其中一些操作使用 torch.float32 (float)
数据类型,其他操作使用 torch.float16 (half)
。一些操作,如线性层和卷积,在 float16
中运行得更快。其他操作,如归约,通常需要 float32
的动态范围。混合精度试图将每个操作匹配到适当的数据类型。
- 设计文档(链接)
- 文档说明(链接)
- 使用示例(链接)
[测试版] Fork/Join 并行
本版本增加了对语言级构造的支持,以及 TorchScript 代码中对粗粒度并行的运行时支持。这种支持对于在并行运行模型、或并行运行循环网络的正向和反向组件等场景非常有用,并允许解锁并行架构(例如多核 CPU)的计算能力,以实现任务级并行。
通过两个原语 torch.jit.fork
和 torch.jit.wait
启用 TorchScript 程序的并行执行。在下面的示例中,我们并行化执行 foo
:
import torch
from typing import List
def foo(x):
return torch.neg(x)
@torch.jit.script
def example(x):
futures = [torch.jit.fork(foo, x) for _ in range(100)]
results = [torch.jit.wait(future) for future in futures]
return torch.sum(torch.stack(results))
print(example(torch.ones([])))
- 文档(链接)
[Beta] 内存分析器
现在的 torch.autograd.profiler
API 包含了一个内存分析器,允许您检查 CPU 和 GPU 模型中不同操作符的张量内存成本。
这里是 API 的一个示例用法:
import torch
import torchvision.models as models
import torch.autograd.profiler as profiler
model = models.resnet18()
inputs = torch.randn(5, 3, 224, 224)
with profiler.profile(profile_memory=True, record_shapes=True) as prof:
model(inputs)
# NOTE: some columns were removed for brevity
print(prof.key_averages().table(sort_by="self_cpu_memory_usage", row_limit=10))
# --------------------------- --------------- --------------- ---------------
# Name CPU Mem Self CPU Mem Number of Calls
# --------------------------- --------------- --------------- ---------------
# empty 94.79 Mb 94.79 Mb 123
# resize_ 11.48 Mb 11.48 Mb 2
# addmm 19.53 Kb 19.53 Kb 1
# empty_strided 4 b 4 b 1
# conv2d 47.37 Mb 0 b 20
# --------------------------- --------------- --------------- ---------------
- PR(链接)
- 文档(链接)
分布式训练与 RPC
[Beta] TensorPipe 后端用于 RPC
PyTorch 1.6 引入了一个新的 RPC 模块后端,该后端利用 TensorPipe 库,这是一个面向机器学习的张量感知点对点通信原语,旨在补充 PyTorch(Gloo、MPI 等)当前的分布式训练原语,这些原语是集体和阻塞的。TensorPipe 的成对和异步特性使其适用于超越数据并行的新的网络范式:客户端-服务器方法(例如,嵌入参数服务器、Impala 风格 RL 中的演员-学习者分离等)以及模型和流水线并行训练(例如 GPipe)、Gossip SGD 等。
# One-line change needed to opt in
torch.distributed.rpc.init_rpc(
...
backend=torch.distributed.rpc.BackendType.TENSORPIPE,
)
# No changes to the rest of the RPC API
torch.distributed.rpc.rpc_sync(...)
- 设计文档(链接)
- 文档(链接)
[Beta] DDP+RPC
PyTorch 分布式支持两种强大的范式:DDP 用于模型的全同步数据并行训练,以及允许分布式模型并行的 RPC 框架。之前,这两个功能是独立工作的,用户无法混合使用它们来尝试混合并行范式。
从 PyTorch 1.6 版本开始,我们已使 DDP 和 RPC 无缝协作,以便用户可以将这两种技术结合起来实现数据并行和模型并行。例如,用户可能希望将大型嵌入表放在参数服务器上,并使用 RPC 框架进行嵌入查找,但将较小的密集参数存储在训练器上,并使用 DDP 同步密集参数。下面是一个简单的代码片段。
// On each trainer
remote_emb = create_emb(on="ps", ...)
ddp_model = DDP(dense_model)
for data in batch:
with torch.distributed.autograd.context():
res = remote_emb(data)
loss = ddp_model(res)
torch.distributed.autograd.backward([loss])
- DDP+RPC 教程(链接)
- 文档(链接)
- 使用示例(链接)
[Beta] RPC - 异步用户函数
RPC 异步用户函数支持在执行用户定义函数时在服务器端进行 yield 和 resume 的能力。在此功能之前,当被调用方处理请求时,一个 RPC 线程会等待用户函数返回。如果用户函数包含 IO(例如,嵌套 RPC)或信号(例如,等待另一个请求解锁),相应的 RPC 线程将空闲等待这些事件。因此,一些应用程序必须使用非常多的线程并发送额外的 RPC 请求,这可能导致性能下降。为了使用户函数在此类事件上 yield,应用程序需要:1)使用 @rpc.functions.async_execution
装饰器装饰函数;2)让函数返回 torch.futures.Future
并在 Future
对象上安装 resume 逻辑作为回调。以下是一个示例:
@rpc.functions.async_execution
def async_add_chained(to, x, y, z):
return rpc.rpc_async(to, torch.add, args=(x, y)).then(
lambda fut: fut.wait() + z
)
ret = rpc.rpc_sync(
"worker1",
async_add_chained,
args=("worker2", torch.ones(2), 1, 1)
)
print(ret) # prints tensor([3., 3.])
- 异步用户函数的批量 RPC 性能教程
- 文档(链接)
- 使用示例(链接)
前端 API 更新
[Beta]复数
PyTorch 1.6 版本带来了对复数张量的 beta 级别支持,包括 torch.complex64 和 torch.complex128 数据类型。复数是可以表示为 a + bj 形式的数,其中 a 和 b 是实数,j 是方程 x^2 = −1 的解。复数在数学和工程中经常出现,尤其是在信号处理和复神经网络领域,这是一个活跃的研究领域。复数张量的 beta 版本将支持常见的 PyTorch 和复数张量功能,以及 Torchaudio、ESPnet 等所需的函数。虽然这是该功能的早期版本,我们预计它将随着时间的推移而改进,但总体目标是提供与 NumPy 兼容的用户体验,利用 PyTorch 在加速器上运行的能力以及与 autograd 一起工作,以更好地支持科学界。
移动更新
PyTorch 1.6 版本为移动端设备推理带来了性能提升和整体稳定性。我们修复了一些 bug,继续维护并添加了一些新功能,同时提高了在 CPU 后端对各种机器学习模型推理的 fp32 和 int8 性能。
[Beta] 移动功能与性能
- 无状态和有状态 XNNPACK 卷积和线性算子
- 无状态 MaxPool2d + JIT 优化过程
- JIT 过程优化:卷积 + 批归一化融合,图重写以用 xnnpack 操作替换 conv2d/linear,relu/hardtanh 融合,dropout 移除
- QNNPACK 集成移除重新量化尺度约束
- 卷积、线性动态线性通道量化
- 禁用移动客户端跟踪以在 full-jit 构建中节省约 600 KB
更新领域库
torchvision 0.7
torchvision 0.7 引入了两个新的预训练语义分割模型,FCN ResNet50 和 DeepLabV3 ResNet50,两者均在 COCO 上训练,且内存占用比 ResNet101 骨干网络更小。我们还为 torchvision 模型和算子引入了对 AMP(自动混合精度)自动转换的支持,该功能自动选择不同 GPU 操作的浮点精度,以提高性能同时保持精度。
- 发布说明(链接)
torchaudio 0.6
torchaudio 现已正式支持 Windows。此次发布还引入了新的模型模块(包括 wav2letter),新的功能(对比、cvm、dcshift、overdrive、vad、phaser、flanger、biquad),数据集(GTZAN、CMU),以及支持 TorchScript 的新可选 sox 后端。
- 发布说明(链接)
其他更新
黑客马拉松
全球 PyTorch 夏季黑客马拉松再次回归!今年,团队可以在线参加三个类别比赛:
- PyTorch 开发者工具:旨在提高研究人员和开发者 PyTorch 使用效率和生产力工具或库
- 基于 PyTorch 的 Web/移动应用程序:具有 Web/移动界面和/或嵌入式设备的基于 PyTorch 的应用程序
- PyTorch 负责任 AI 开发工具:用于负责任 AI 开发的工具、库或 Web/移动应用程序
这是一次与社区建立联系并练习您的机器学习技能的绝佳机会。
LPCV 挑战赛
2020 年 CVPR 低功耗视觉挑战赛(LPCV)- 无人机视频提交在线赛道截止日期即将到来。您有直到 2020 年 7 月 31 日的时间来构建一个系统,该系统能够使用 PyTorch 和 Raspberry Pi 3B+准确地在无人机捕获的视频中识别字符。
原型功能
重复一下,PyTorch 中的原型功能是我们希望收集反馈、评估其有用性并在它们毕业到 Beta 或稳定版之前进行改进的早期功能。以下功能不是 PyTorch 1.6 版本的一部分,而是可在 nightlies 中找到,并附带单独的文档/教程,以帮助促进早期使用和反馈。
分布式 RPC/分析器
允许用户使用 autograd profiler 对使用 torch.distributed.rpc
的训练作业进行配置,并远程调用分析器以收集跨不同节点的分析信息。相关 RFC 可以在这里找到,有关如何使用此功能的简短教程可以在这里找到。
TorchScript 模块冻结
模块冻结是将模块参数和属性值内联到 TorchScript 内部表示的过程。参数和属性值被视为最终值,在冻结的模块中不能被修改。此功能的 PR 可以在这里找到,有关如何使用此功能的简短教程可以在这里找到。
图模式量化
激活急切模式量化需要用户对模型进行修改,包括显式量化激活、模块融合、使用 torch ops 的改写以及函数的量化不支持。如果我们能够追踪或编写模型,那么可以使用图模式量化自动进行量化,无需急切模式中的任何复杂性,并且可以通过 qconfig_dict
进行配置。有关如何使用此功能的教程,请在此处查看。
量化数值套件
量化在它起作用时很好,但当它不满足预期的精度时,很难知道出了什么问题。现在有一个原型可用,用于测量量化模块和浮点模块之间的比较统计信息。目前仅支持在 CPU 上使用急切模式进行测试,并将提供更多支持。有关如何使用此功能的教程,请在此处查看。
喝彩!
PyTorch 团队