今天,我们宣布了 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
[测试版] 文本到语音管道
TorchAudio 现在增加了 Tacotron2 模型和预训练权重。现在可以使用现有的 vocoder 实现,如 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 Transducer Loss
RNN 译码器(RNNT)损失是 RNN 译码器管道的一部分,这是一种用于语音识别任务的流行架构。最近它因在流式设置中的应用而受到关注,并在 LibriSpeech 基准测试中实现了最先进的 WER。
TorchAudio 的损失函数支持 float16 和 float32 的 logits,具有 autograd 和 torchscript 支持,可以在 CPU 和 GPU 上运行,并具有针对性能改进的定制 CUDA 内核实现。该实现与《基于循环神经网络的序列转换》中的原始损失函数一致,但依赖于来自对齐限制流式循环神经网络译码器的代码。特别感谢 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
(稳定) 新模型
RegNet 和 EfficientNet 是两种流行的架构,可以根据不同的计算预算进行扩展。在本版本中,我们包括了它们分类变体的 22 个预训练权重。这些模型在 ImageNet 上进行了训练,预训练模型在 ImageNet 验证集上的准确率如下(更多详情请见#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 变体的权重做出贡献。
(Beta) 基于 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 开发了这个实用工具。
(稳定) 新增数据增强
增加了两种新的自动增强技术:RandAugment 和 Trivial 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 包方面的帮助。
更新后的训练食谱
我们已更新训练参考脚本,以添加对指数移动平均、标签平滑、学习率预热、Mixup、Cutmix 和其他 SOTA 原语的支持。这使我们能够将某些预训练模型的分类 Acc@1 提高超过 4 个百分点。预计在下一个版本中会有现有预训练权重的重大更新。
感谢阅读。如果您对这些更新感兴趣并想加入 PyTorch 社区,我们鼓励您加入讨论论坛和 GitHub 问题。要获取 PyTorch 的最新消息,请关注我们的 Twitter、Medium、YouTube 和 LinkedIn。
干杯!PyTorch 团队