今天,我们宣布了 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 开始,无需额外的设置成本,因为它支持已经广泛采用并在生产中部署的流行机器学习调度程序和管道编排器。没有两个生产环境是相同的。为了适应各种用例,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,具有 autograd 和 torchscript 支持,并且可以在 CPU 和 GPU 上运行,其中包含自定义 CUDA 内核实现以提高性能。该实现与 带有循环神经网络的序列转换 中的原始损失函数一致,但依赖于 对齐受限流式循环神经网络变换器 中的代码。特别感谢 Jay Mahadeokar 和 Ching-Feng Yeh 的代码贡献和指导。
请参阅 文档 以获取更多详细信息。
(Beta) 批处理支持和滤波器组支持
torchaudio.functional.lfilter
现在支持批处理和多个滤波器。
(原型) Emformer 模块
自动语音识别 (ASR) 的研究和产品化越来越关注设备上的应用。为了支持这些努力,TorchAudio 现在包含了 Emformer,这是一种内存效率高的变换器架构,在低延迟流媒体场景中在 LibriSpeech 上取得了最先进的结果,作为原型功能。
请参阅 文档 以获取更多详细信息。
GPU 构建
已添加支持 TorchAudio 中自定义 CUDA 内核的 GPU 构建,例如用于 RNN 变换器损失的构建。在此更改之后,TorchAudio 的二进制分发现在包括仅 CPU 版本和启用 CUDA 的版本。要使用启用 CUDA 的二进制文件,PyTorch 也需要与 CUDA 兼容。
TorchVision 0.11
(稳定) 新模型
RegNet 和 EfficientNet 是两种流行的架构,可以根据不同的计算预算进行扩展。在此版本中,我们为它们的分类变体包含了 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 变体的权重。
(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 团队