跳转到主要内容
博客

PyTorch 1.10 中的新库发布,包括 TorchX、TorchAudio、TorchVision

作者: 2021 年 10 月 21 日2024 年 11 月 15 日暂无评论

今天,我们宣布 PyTorch 库的一系列新功能和改进,同时发布了 PyTorch 1.10。其中一些亮点包括:

一些亮点包括:

  • TorchX – 一个新的 SDK,用于快速构建和部署从研发到生产的机器学习应用程序。
  • TorchAudio – 新增了文本转语音管道、自监督模型支持、多通道支持和 MVDR 波束形成模块、RNN 变换器(RNNT)损失函数,以及对 lfilter 函数的批处理和滤波器组支持。请在此处查看 TorchAudio 发布说明:此处
  • TorchVision – 新增了 RegNet 和 EfficientNet 模型,实用程序中添加了基于 FX 的特征提取,两种新的自动增强技术:Rand Augment 和 Trivial Augment,以及更新的训练方案。请在此处查看 TorchVision 发布说明:此处

介绍 TorchX

TorchX 是一个新的 SDK,用于快速构建和部署从研发到生产的机器学习应用程序。它提供了各种内置组件,这些组件编码了 MLOps 最佳实践,并使分布式训练和超参数优化等高级功能对所有人开放。

用户可以零成本开始使用 TorchX 0.1,因为它支持已经在生产中广泛采用和部署的流行 ML 调度程序和管道编排器。没有两个生产环境是完全相同的。为了适应各种用例,TorchX 的核心 API 允许在明确定义的扩展点进行大量定制,即使是最独特的应用程序也可以得到服务,而无需定制整个垂直堆栈。

阅读文档以获取更多详细信息,并使用此快速入门教程试用此功能。

TorchAudio 0.10

[Beta] 文本转语音管道

TorchAudio 现在新增了 Tacotron2 模型和预训练权重。现在可以使用现有的声码器实现(如 WaveRNN 和 Griffin-Lim)构建文本转语音管道。构建 TTS 管道需要匹配数据处理和预训练权重,这对于用户来说通常并不容易。因此,TorchAudio 引入了捆绑 API,使构建特定预训练权重的管道变得容易。以下示例说明了这一点。

>>> import torchaudio
>>>
>>> bundle = torchaudio.pipelines.TACOTRON2_WAVERNN_CHAR_LJSPEECH
>>>
>>> # Build text processor, Tacotron2 and vocoder (WaveRNN) model
>>> processor = bundle.get_text_processor()
>>> tacotron2 = bundle.get_tacotron2()
Downloading:
100%|███████████████████████████████| 107M/107M [00:01<00:00, 87.9MB/s]
>>> vocoder = bundle.get_vocoder()
Downloading:
100%|███████████████████████████████| 16.7M/16.7M [00:00<00:00, 78.1MB/s]
>>>
>>> text = "Hello World!"
>>>
>>> # Encode text
>>> input, lengths = processor(text)
>>>
>>> # Generate (mel-scale) spectrogram
>>> specgram, lengths, _ = tacotron2.infer(input, lengths)
>>>
>>> # Convert spectrogram to waveform
>>> waveforms, lengths = vocoder(specgram, lengths)
>>>
>>> # Save audio
>>> torchaudio.save('hello-world.wav', waveforms, vocoder.sample_rate)

有关此 API 的详细信息,请参阅文档。您也可以从教程中尝试此功能。

(Beta)自监督模型支持

TorchAudio 添加了 HuBERT 模型架构和对 wav2vec 2.0 和 HuBERT 的预训练权重支持。HuBERT 和 wav2vec 2.0 是用于音频表示学习的新颖方法,在下游任务上进行微调时可以获得高精度。这些模型可以作为未来研究的基线,因此,TorchAudio 提供了一种运行模型的简单方法。与 TTS 管道类似,预训练权重和相关信息(例如预期的采样率和输出类标签(用于微调权重))捆绑在一起,以便它们可以用于构建管道。以下示例说明了这一点。

>>> import torchaudio
>>>
>>> bundle = torchaudio.pipelines.HUBERT_ASR_LARGE
>>>
>>> # Build the model and load pretrained weight.
>>> model = bundle.get_model()
Downloading:
100%|███████████████████████████████| 1.18G/1.18G [00:17<00:00, 73.8MB/s]
>>> # Check the corresponding labels of the output.
>>> labels = bundle.get_labels()
>>> print(labels)
('<s>', '<pad>', '</s>', '<unk>', '|', 'E', 'T', 'A', 'O', 'N', 'I', 'H', 'S', 'R', 'D', 'L', 'U', 'M', 'W', 'C', 'F', 'G', 'Y', 'P', 'B', 'V', 'K', "'", 'X', 'J', 'Q', 'Z')
>>>
>>> # Infer the label probability distribution
>>> waveform, sample_rate = torchaudio.load(hello-world.wav')
>>>
>>> emissions, _ = model(waveform)
>>>
>>> # Pass emission to (hypothetical) decoder
>>> transcripts = ctc_decode(emissions, labels)
>>> print(transcripts[0])
HELLO WORLD

请参阅文档以获取更多详细信息,并使用此教程试用此功能。

(Beta)多通道支持和 MVDR 波束形成

远场语音识别与近场识别相比是一项更具挑战性的任务。多通道方法(如波束形成)有助于降低噪音并增强目标语音。

TorchAudio 现在增加了对使用时频掩码在多通道音频上进行可微分最小方差无失真响应(MVDR)波束形成的支持。研究人员可以轻松地将其与任何多通道 ASR 管道集成。有三种解决方案(ref_channel、stv_evd、stv_power),它支持单通道和多通道(在方法中执行平均)掩码。它提供了一个在线选项,可以递归更新流式音频的参数。我们还在示例目录中提供了关于如何将 MVDR 波束形成应用于多通道音频的教程。

>>> from torchaudio.transforms import MVDR, Spectrogram, InverseSpectrogram
>>>
>>> # Load the multi-channel noisy audio
>>> waveform_mix, sr = torchaudio.load('mix.wav')
>>> # Initialize the stft and istft modules
>>> stft = Spectrogram(n_fft=1024, hop_length=256, return_complex=True, power=None)
>>> istft = InverseSpectrogram(n_fft=1024, hop_length=256)
>>> # Get the noisy spectrogram
>>> specgram_mix = stft(waveform_mix)
>>> # Get the Time-Frequency mask via machine learning models
>>> mask = model(waveform)
>>> # Initialize the MVDR module 
>>> mvdr = MVDR(ref_channel=0, solution=”ref_channel”, multi_mask=False)
>>> # Apply MVDR beamforming
>>> specgram_enhanced = mvdr(specgram_mix, mask)
>>> # Get the enhanced waveform via iSTFT
>>> waveform_enhanced = istft(specgram_enhanced, length=waveform.shape[-1])

请参阅文档以获取更多详细信息,并使用 MVDR 教程试用此功能。

(Beta)RNN 变换器损失

RNN 变换器 (RNNT) 损失是 RNN 变换器管道的一部分,它是语音识别任务中流行的架构。最近,它因用于流式设置而受到关注,并且还在 LibriSpeech 基准测试中取得了最先进的 WER。

TorchAudio 的损失函数支持 float16 和 float32 logits,具有自动求导和 torchscript 支持,并且可以在 CPU 和 GPU 上运行,其中 GPU 具有自定义 CUDA 内核实现以提高性能。该实现与 Sequence Transduction with Recurrent Neural Networks 中的原始损失函数一致,但依赖于 Alignment Restricted Streaming Recurrent Neural Network Transducer 中的代码。特别感谢 Jay Mahadeokar 和 Ching-Feng Yeh 的代码贡献和指导。

请参阅文档以获取更多详细信息。

(Beta)批处理支持和滤波器组支持

torchaudio.functional.lfilter 现在支持批处理和多个滤波器。

(原型)Emformer 模块

自动语音识别(ASR)的研究和产品化越来越关注设备上的应用。为了支持这些工作,TorchAudio 现在包含了 Emformer,这是一种内存高效的 transformer 架构,在低延迟流媒体场景中在 LibriSpeech 上取得了最先进的结果,作为一项原型功能。

请参阅文档以获取更多详细信息。

GPU 构建

TorchAudio 中增加了支持自定义 CUDA 内核的 GPU 构建,例如用于 RNN 变换器损失的内核。在此更改之后,TorchAudio 的二进制分发现在包括仅支持 CPU 的版本和支持 CUDA 的版本。要使用支持 CUDA 的二进制文件,PyTorch 也需要与 CUDA 兼容。

TorchVision 0.11

(稳定版)新模型

RegNetEfficientNet 是两种流行的架构,可以根据不同的计算预算进行扩展。在此版本中,我们为其分类变体提供了 22 个预训练权重。这些模型在 ImageNet 上进行训练,预训练模型在 ImageNet val 上获得的准确率如下所示(有关详细信息,请参阅 #4403#4530#4293)。

模型可以按如下方式使用:

import torch
from torchvision import models

x = torch.rand(1, 3, 224, 224)

regnet = models.regnet_y_400mf(pretrained=True)
regnet.eval()
predictions = regnet(x)

efficientnet = models.efficientnet_b0(pretrained=True)
efficientnet.eval()
predictions = efficientnet(x)

有关新模型的完整列表,请参阅 torchvision.models 文档页面。

我们要感谢 Ross Wightman 和 Luke Melas-Kyriazi 贡献了 EfficientNet 变体的权重。

(测试版)基于 FX 的特征提取

我们的实用程序中添加了一种新的特征提取方法。它使用 torch.fx,使我们能够检索网络的中间层的输出,这对于特征提取和可视化很有用。

以下是新实用程序的使用示例:

import torch
from torchvision.models import resnet50
from torchvision.models.feature_extraction import create_feature_extractor


x = torch.rand(1, 3, 224, 224)

model = resnet50()

return_nodes = {
"layer4.2.relu_2": "layer4"
}
model2 = create_feature_extractor(model, return_nodes=return_nodes)
intermediate_outputs = model2(x)

print(intermediate_outputs['layer4'].shape)

我们要感谢 Alexander Soare 开发了这个实用程序。

(稳定版)新的数据增强

新增了两种自动增强技术:RandAugmentTrivial Augment。它们对原始数据应用一系列转换以增强数据并提高模型性能。新技术建立在之前添加的 AutoAugment 之上,并专注于简化方法、减少最佳策略的搜索空间以及提高准确性方面的性能增益。这些技术使用户能够重现方案,以在所提供的模型上实现最先进的性能。此外,它还使用户能够应用这些技术进行迁移学习,并在新数据集上实现最佳准确性。

如下所示,这两种方法都可以作为 AutoAugment 技术的直接替代品:

from torchvision import transforms

t = transforms.RandAugment()
# t = transforms.TrivialAugmentWide()
transformed = t(image)

transform = transforms.Compose([
transforms.Resize(256),
transforms.RandAugment(), # transforms.TrivialAugmentWide()
transforms.ToTensor()])

阅读自动增强转换以获取更多详细信息。

我们要感谢 Samuel G. Müller 对 Trivial Augment 的贡献以及他在重构 AA 包方面的帮助。

更新的训练方案

我们更新了训练参考脚本,增加了对指数移动平均、标签平滑、学习率热身、MixupCutmix 和其他 SOTA 原语的支持。上述改进使我们能够将一些预训练模型的分类 Acc@1 提高 4 个多点。预计在下一个版本中将对现有预训练权重进行重大更新。

感谢阅读。如果您对这些更新感兴趣并希望加入 PyTorch 社区,我们鼓励您加入讨论论坛在 GitHub 上提出问题。要获取 PyTorch 的最新消息,请在 TwitterMediumYouTubeLinkedIn 上关注我们。

祝好!PyTorch 团队