跳转到主要内容
博客

新版本发布:PyTorch 1.2、torchtext 0.4、torchaudio 0.3 和 torchvision 0.4

作者: 2019年8月8日2024年11月16日暂无评论

自 PyTorch 1.0 发布以来,我们看到社区不断壮大,增加了新工具,为 PyTorch Hub 中不断增长的模型集做出了贡献,并持续增加了在研究和生产中的使用。

从核心角度来看,PyTorch 不断增加功能以支持研究和生产用途,包括通过 TorchScript 连接这两个世界的能力。今天,我们很高兴地宣布,我们发布了四个新版本,包括 PyTorch 1.2、torchvision 0.4、torchaudio 0.3 和 torchtext 0.4。您现在就可以在 pytorch.org 开始使用这些版本。

PyTorch 1.2

通过 PyTorch 1.2,这个开源机器学习框架在生产使用方面迈出了重要一步,增加了改进和更完善的 TorchScript 环境。这些改进使得发布生产模型变得更加容易,扩展了对导出 ONNX 格式模型的支持,并增强了 Transformer 的模块级支持。除了这些新功能,TensorBoard 现在不再是实验性的功能——您只需输入 from torch.utils.tensorboard import SummaryWriter 即可开始使用。

TorchScript 改进

自 PyTorch 1.0 发布以来,TorchScript 为急切执行的 PyTorch 模型提供了通往生产的途径。TorchScript 编译器将 PyTorch 模型转换为静态类型的图表示,为在 Python 不可用的受限环境中进行优化和执行创造了机会。您可以逐步将模型转换为 TorchScript,将编译代码与 Python 无缝混合。

PyTorch 1.2 显著扩展了 TorchScript 对 PyTorch 模型中使用的 Python 子集的支持,并提供了一个新的、更易于使用的 API,用于将模型编译为 TorchScript。有关详细信息,请参阅迁移指南。下面是新 API 的使用示例

import torch

class MyModule(torch.nn.Module):
    def __init__(self, N, M):
        super(MyModule, self).__init__()
        self.weight = torch.nn.Parameter(torch.rand(N, M))

    def forward(self, input):
        if input.sum() > 0:
          output = self.weight.mv(input)
        else:
          output = self.weight + input
        return output

# Compile the model code to a static representation
my_script_module = torch.jit.script(MyModule(3, 4))

# Save the compiled code and model data so it can be loaded elsewhere
my_script_module.save("my_script_module.pt")

要了解更多信息,请参阅我们的 TorchScript 简介在 C++ 中加载 PyTorch 模型教程。

扩展的 ONNX 导出

ONNX 社区在开放的 治理结构 以及额外的指导委员会成员、特殊兴趣小组(SIGs)和工作组(WGs)的推动下持续发展壮大。与 Microsoft 合作,我们增加了对导出 ONNX Opset 版本 7(v1.2)、8(v1.3)、9(v1.4) 和 10 (v1.5) 的全面支持。我们还增强了常量折叠通道以支持最新的 ONNX 版本 Opset 10。ScriptModule 也得到了改进,包括支持多个输出、张量工厂以及作为输入和输出的元组。此外,用户现在可以注册自己的符号以导出自定义操作,并在导出期间指定输入的动态维度。以下是所有主要改进的总结:

  • 支持多个 Opsets,包括在 Opset 10 中导出 dropout、slice、flip 和 interpolate 的能力。
  • ScriptModule 的改进,包括支持多个输出、张量工厂以及作为输入和输出的元组。
  • 支持十多个额外的 PyTorch 运算符,包括导出自定义运算符的能力。
  • 许多重要的 bug 修复和测试基础设施改进。

您可以在此处试用由 Microsoft 的 @lara-hdr 贡献的最新教程。非常感谢整个 Microsoft 团队为实现此版本所做的辛勤工作!

nn.Transformer

在 PyTorch 1.2 中,我们现在包含了一个标准的 nn.Transformer 模块,基于论文“Attention is All You Need”。nn.Transformer 模块完全依赖于 注意力机制 来建立输入和输出之间的全局依赖关系。nn.Transformer 模块的各个组件设计为可以独立采用。例如,nn.TransformerEncoder 可以单独使用,而无需更大的 nn.Transformer。新的 API 包括

  • nn.Transformer
  • nn.TransformerEncodernn.TransformerEncoderLayer
  • nn.TransformerDecodernn.TransformerDecoderLayer

有关更多信息,请参阅 Transformer 层文档。有关 PyTorch 1.2 完整发行说明,请参阅此处

领域 API 库更新

像 torchvision、torchtext 和 torchaudio 这样的 PyTorch 领域库提供了方便的访问通用数据集、模型和转换,可以快速创建最先进的基线。此外,它们还提供了通用的抽象,以减少用户可能不得不重复编写的样板代码。由于研究领域有不同的要求,围绕 PyTorch 出现了一个专门库(称为领域 API (DAPI))生态系统,以简化许多领域中新旧算法的开发。我们很高兴发布三个更新的 DAPI 库,分别用于文本、音频和视觉,它们与 PyTorch 1.2 核心版本相辅相成。

Torchaudio 0.3:兼容 Kaldi,新增转换

Torchaudio 专注于音频波形的机器理解。它是一个机器学习库,提供相关的信号处理功能(但不是通用的信号处理库)。它利用 PyTorch 的 GPU 支持,为波形提供了许多工具和转换,使数据加载和标准化变得更容易、更具可读性。例如,它使用 sox 为波形提供了数据加载器,以及频谱图、重采样和 μ-law 编码和解码等转换。

我们很高兴地宣布 torchaudio 0.3.0 的发布,其重点是标准化和复数、一个转换(resample)和两个新功能(phase_vocoder、ISTFT)、Kaldi 兼容性以及一个新的教程。Torchaudio 被重新设计为 PyTorch 的扩展,并且是领域 API (DAPI) 生态系统的一部分。

标准化

解决机器学习问题的大量工作都投入到数据准备中。在这个新版本中,我们更新了 torchaudio 转换的接口,以围绕以下词汇和约定进行标准化。

张量假设通道作为第一个维度,时间作为最后一个维度(如果适用)。这使其与 PyTorch 的维度保持一致。对于大小名称,使用前缀 n_(例如,“大小为 (n_freq, n_mel) 的张量”),而维度名称没有此前缀(例如,“维度为 (channel, time) 的张量”)。所有变换和函数的输入现在都假定通道优先。这样做是为了与 PyTorch 保持一致,PyTorch 的通道后跟样本数。所有变换和函数的通道参数现在已弃用。

STFT 的输出是 (channel, frequency, time, 2),这意味着对于每个通道,列是某个窗口的傅里叶变换,因此当我们水平移动时,我们可以看到每列(傅里叶变换后的波形)随时间变化。这与 librosa 的输出匹配,因此我们不再需要在与 SpectrogramMelScaleMelSpectrogramMFCC 进行测试比较时进行转置。此外,由于这些新约定,我们弃用了用于从一种信号形状传输到另一种形状的 LC2CLBLC2CBL

作为此版本的一部分,我们还引入了通过维度为 (..., 2) 的张量支持复数,并提供 magphase 将此类张量转换为其幅度和相位,类似地还有 complex_normangle

标准化的详细信息在README中提供。

功能、转换和 Kaldi 兼容性

在标准化之前,我们将状态和计算分离到 torchaudio.transformstorchaudio.functional 中。

作为转换的一部分,我们在 0.3.0 中添加了一个新的转换:ResampleResample 可以将波形上采样或下采样到不同的频率。

作为功能的一部分,我们引入了:`phase_vocoder`,一个用于在不改变音高的情况下改变波形速度的移相声码器,以及 `ISTFT`,与 PyTorch 提供的 STFT 兼容实现的逆 STFT。这种分离使我们能够使功能弱脚本化,并在 0.3.0 中利用 JIT。因此,我们对以下转换具有 JIT 和 CUDA 支持:`Spectrogram`、`AmplitudeToDB`(以前名为 `SpectrogramToDB`)、`MelScale`、`MelSpectrogram`、`MFCC`、`MuLawEncoding`、`MuLawDecoding`(以前名为 `MuLawExpanding`)。

我们现在还提供与 Kaldi 的兼容接口,以简化入门并减少用户对 Kaldi 的代码依赖。我们现在有 spectrogramfbankresample_waveform 的接口。

新教程

为了展示新的约定和转换,我们有一个新教程,演示如何使用 torchaudio 预处理波形。本教程通过一个加载波形并对其应用一些可用转换的示例。

我们很高兴看到 torchaudio 活跃的社区,并渴望进一步发展和支持它。我们鼓励您继续尝试此教程以及两个可用数据集:VCTK 和 YESNO!它们有一个接口可以下载数据集并以方便的格式预处理它们。您可以在此处的发行说明中找到详细信息。

Torchtext 0.4 带有监督学习数据集

torchtext 的一个关键重点领域是提供基本元素,以帮助加速 NLP 研究。这包括轻松访问常用数据集和用于处理原始文本数据的基本预处理管道。torchtext 0.4.0 版本包含几个流行的监督学习基线,并提供“一键式”数据加载。一个教程也包含在内,展示了如何使用新数据集进行文本分类分析。我们还添加并改进了一些函数,例如 get_tokenizer 和 build_vocab_from_iterator,以使其更容易实现未来的数据集。更多示例可在此处找到。

文本分类是自然语言处理中一项重要的任务,具有许多应用,例如情感分析。新版本包含几个流行的用于监督学习的文本分类数据集,包括:

  • AG_NEWS
  • SogouNews
  • DBpedia
  • YelpReviewPolarity
  • YelpReviewFull
  • YahooAnswers
  • AmazonReviewPolarity
  • AmazonReviewFull

每个数据集都包含两个部分(训练集和测试集),并且可以通过单个命令轻松加载。数据集还支持 N-gram 功能,以捕获有关局部词序的部分信息。请查看此处的教程,了解如何使用新数据集解决文本分类分析等监督问题。

from torchtext.datasets.text_classification import DATASETS
train_dataset, test_dataset = DATASETS['AG_NEWS'](ngrams=2)

除了领域库之外,PyTorch 还提供了许多工具来简化数据加载。用户现在可以使用一些受良好支持的工具(如 torch.utils.data.DataLoadertorch.utils.data.IterableDataset)加载和预处理文本分类数据集。以下是使用 DataLoader 封装数据的几行代码。更多示例可在此处找到。

from torch.utils.data import DataLoader
data = DataLoader(train_dataset, collate_fn=generate_batch)

请查看此处的发行说明以了解更多信息,并尝试此处的教程。

Torchvision 0.4 支持视频

视频现在是 torchvision 中的一等公民,支持数据加载、数据集、预训练模型和转换。torchvision 的 0.4 版本包括:

  • 高效的 IO 原语,用于读取/写入视频文件(包括音频),支持任意编码和格式。
  • 标准视频数据集,与 torch.utils.data.Datasettorch.utils.data.DataLoader 兼容。
  • 基于 Kinetics-400 数据集的预训练模型,用于视频动作分类(包括训练脚本)。
  • 用于训练您自己的视频模型的参考训练脚本。

我们希望在 PyTorch 中处理视频数据尽可能简单,同时不过多牺牲性能。因此,我们避免了需要预先重新编码视频的步骤,因为这会涉及:

  • 一个预处理步骤,它复制数据集以重新编码。
  • 时间和空间的开销,因为这种重新编码非常耗时。
  • 通常,应该使用外部脚本执行重新编码。

此外,我们还提供了诸如实用类 VideoClips 等 API,它通过创建一组视频中所有剪辑的索引,简化了枚举视频文件列表中所有固定大小剪辑的任务。它还允许您为视频指定固定的帧率。下面提供了 API 的示例:

from torchvision.datasets.video_utils import VideoClips

class MyVideoDataset(object):
    def __init__(self, video_paths):
        self.video_clips = VideoClips(video_paths,
                                      clip_length_in_frames=16,
                                      frames_between_clips=1,
                                      frame_rate=15)

    def __getitem__(self, idx):
        video, audio, info, video_idx = self.video_clips.get_clip(idx)
        return video, audio

    def __len__(self):
        return self.video_clips.num_clips()

大部分面向用户的 API 都是用 Python 编写的,类似于 PyTorch,这使得它易于扩展。此外,底层实现速度很快——torchvision 尽可能少地从视频中实时解码,以便返回视频中的剪辑。

有关更多详细信息,请查看 torchvision 0.4 的发行说明

我们期待继续与社区合作,并听取您的反馈,以进一步改进和扩展 PyTorch 深度学习平台。

我们要感谢整个 PyTorch 团队和社区对这项工作的所有贡献!