今天,我们宣布了 PyTorch 库的一系列新功能和改进,以及 PyTorch 1.10 版本的发布。一些亮点包括:
一些亮点包括:
- TorchX – 一个新的 SDK,用于从研发到生产环境快速构建和部署机器学习(ML)应用程序。
- TorchAudio – 增加了语音合成(Text-to-Speech)流水线、自监督模型支持、多通道支持和 MVDR 波束成形模块、RNN 换能器(RNNT)损失函数,以及为
lfilter函数增加了批处理和滤波器组支持。查看 TorchAudio 发行说明请点击 这里。 - TorchVision – 增加了新的 RegNet 和 EfficientNet 模型,工具中增加了基于 FX 的特征提取功能,引入了两种新的自动增强(Automatic Augmentation)技术:Rand Augment 和 Trivial Augment,并更新了训练方案。查看 TorchVision 发行说明请点击 这里。
介绍 TorchX
TorchX 是一个新的 SDK,用于从研发到生产环境快速构建和部署机器学习应用程序。它提供了多种内置组件,这些组件编码了 MLOps 的最佳实践,并使分布式训练和超参数优化等高级功能变得易于访问。
用户无需额外设置成本即可开始使用 TorchX 0.1,因为它支持已在生产中广泛采用和部署的主流 ML 调度器和流水线编排器。没有完全相同的两个生产环境。为了适应各种用例,TorchX 的核心 API 在定义明确的扩展点上允许大量定制,因此即使是最独特的应用程序也无需定制整个垂直堆栈即可提供服务。
TorchAudio 0.10
[测试版] 语音合成(Text-to-speech)流水线
TorchAudio 现在增加了 Tacotron2 模型和预训练权重。现在可以使用现有的声码器实现(如 WaveRNN 和 Griffin-Lim)来构建语音合成流水线。构建 TTS 流水线需要匹配数据处理和预训练权重,这对用户来说往往并不简单。因此,TorchAudio 引入了 bundle 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 的详细信息,请参阅 文档。您还可以从 教程中进行尝试。
(测试版) 自监督模型支持
TorchAudio 增加了 HuBERT 模型架构以及对 wav2vec 2.0 和 HuBERT 的预训练权重支持。HuBERT 和 wav2vec 2.0 是音频表征学习的创新方法,在下游任务进行微调时能产生高精度。这些模型可作为未来研究的基准,因此,TorchAudio 提供了一种运行模型的简单方法。与 TTS 流水线类似,预训练权重和相关信息(如预期的采样率和输出类别标签(针对微调权重))被组合为一个 bundle,以便用于构建流水线。以下示例展示了这一点。
>>> 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
(测试版) 多通道支持和 MVDR 波束成形
与近场识别相比,远场语音识别是一项更具挑战性的任务。波束成形等多通道方法有助于减少噪声并增强目标语音。
TorchAudio 现在增加了对使用时频掩码(Time-Frequency masks)的多通道音频进行可微最小方差无失真响应(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 教程体验该功能。
(测试版) RNN 换能器损失函数
RNN 换能器(RNNT)损失函数是 RNN 换能器流水线的一部分,这是一种流行的语音识别任务架构。最近,它因在流式场景中的应用而受到关注,并且在 LibriSpeech 基准测试中实现了最先进的 WER。
TorchAudio 的损失函数支持 float16 和 float32 的 logits,具有自动求导(autograd)和 torchscript 支持,并且可以在 CPU 和 GPU 上运行,其中 GPU 版本具有自定义 CUDA 内核实现以提高性能。该实现与《Sequence Transduction with Recurrent Neural Networks》中的原始损失函数一致,但参考了《Alignment Restricted Streaming Recurrent Neural Network Transducer》中的代码。特别感谢 Jay Mahadeokar 和 Ching-Feng Yeh 的代码贡献和指导。
请参阅 文档以获取更多详细信息。
(测试版) 批处理支持和滤波器组支持
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 变体的权重。
(测试版) 基于 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 包方面提供的帮助。
更新的训练方案
我们更新了训练参考脚本,以增加对指数移动平均(EMA)、标签平滑(Label Smoothing)、学习率预热(Learning-Rate Warmup)、Mixup、Cutmix 以及其他 SOTA 原语的支持。上述改进使我们能够将某些预训练模型的分类 Acc@1 提高了 4 个点以上。预计在下一个版本中会对现有的预训练权重进行重大更新。
感谢阅读。如果您对这些更新感兴趣并希望加入 PyTorch 社区,我们鼓励您加入 讨论论坛并 在 GitHub 上提交问题。要获取 PyTorch 的最新消息,请关注我们的 Twitter、Medium、YouTube 和 LinkedIn。
祝好!PyTorch 团队