今天,我们宣布了 PyTorch 库的诸多新功能和改进,以及 PyTorch 1.10 的发布。部分亮点包括:
一些亮点包括:
- TorchX – 一个用于快速构建和部署机器学习应用的新 SDK,涵盖了从研究开发到生产环境的全流程。
- TorchAudio – 增加了文本转语音(TTS)流水线、自监督模型支持、多通道支持和 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
[测试版] 文本转语音 (TTS) 流水线
TorchAudio 现已添加 Tacotron2 模型及预训练权重。现在可以使用 WaveRNN 和 Griffin-Lim 等现有声码器实现构建文本转语音流水线。构建 TTS 流水线需要匹配数据处理方式和预训练权重,这对于用户来说通常并不简单。因此,TorchAudio 引入了捆绑 API(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 流水线类似,预训练权重及相关信息(如期望采样率和输出类别标签,针对微调权重)被封装为一个捆绑包,以便用于构建流水线。以下示例说明了这一点。
>>> 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 现已增加对使用时频掩码的多通道音频进行可微分最小方差无失真响应(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 转换器(RNNT)损失函数
RNN 转换器(RNNT)损失函数是 RNN 转换器流水线的一部分,这是一种流行的语音识别任务架构。最近,它因在流式场景中的应用而受到关注,并在 LibriSpeech 基准测试中实现了顶尖的 WER(词错率)。
TorchAudio 的损失函数支持 float16 和 float32 logit,支持自动求导(autograd)和 TorchScript,并可在 CPU 和 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 内核(如用于 RNN 转换器损失函数的内核)的 GPU 构建。在此变更后,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)、标签平滑、学习率预热、Mixup、Cutmix 及其他 SOTA 原语的支持。上述更新使我们能够将部分预训练模型的 Acc@1 分类准确率提高了 4 个百分点以上。预计在下一次发布中,我们将对现有的预训练权重进行重大更新。
感谢阅读。如果您对这些更新感兴趣并希望加入 PyTorch 社区,我们鼓励您参与 讨论论坛并 在 GitHub 上提交议题。要获取 PyTorch 的最新消息,请关注我们的 Twitter、Medium、YouTube 和 LinkedIn。
祝好!PyTorch 团队