今天,我们宣布了多个 PyTorch 库的更新,伴随 PyTorch 1.9 版本一同发布。此次更新涵盖了包括 TorchVision、TorchText 和 TorchAudio 在内的领域库的新版本。这些更新以及 PyTorch 1.9 本身的发布,包含了一系列新功能和改进,将为 PyTorch 社区带来广泛的升级。
一些亮点包括:
- TorchVision – 增加了新的 SSD 和 SSDLite 模型、用于目标检测的量化内核、GPU JPEG 解码以及 iOS 支持。点击此处查看发行说明。
- TorchAudio – 增加了可在非 Python 环境(包括 C++、Android 和 iOS)中部署的 wav2vec 2.0 模型。在 lfilter、频谱运算和重采样方面进行了多项性能改进。增加了采样质量控制选项(如 Kaiser 窗支持)。启动了复数张量运算的迁移工作。改进了自动求导(autograd)支持。点击此处查看发行说明。
- TorchText – 增加了一个新的高性能 Vocab 模块,为 NLP 工作流提供了通用的功能性 API。点击此处查看发行说明。
我们要感谢社区对此次最新版本的支持与贡献。
PyTorch 版本中的功能分为稳定版 (Stable)、测试版 (Beta) 和原型版 (Prototype)。您可以在这篇博客文章中了解更多定义。
TorchVision 0.10
(稳定版) 用于目标检测的量化内核
nms 和 roi_align 算子的前向传播现在支持量化数据类型的张量,这有助于降低目标检测模型的内存占用,特别是在移动端环境下。更多详情,请参阅文档。
(稳定版) 张量变换的速度优化
resize(调整大小)和 flip(翻转)变换已得到优化,其 CPU 运行速度提升了高达 5 倍。
(稳定版) 文档改进
文档进行了显著改进。特别是增加了一个新的示例库(gallery of examples)。这些示例直观地展示了每个变换如何作用于图像,并正确记录和说明了分割模型的输出。
该示例库未来将进行扩展,以提供更全面的示例,并作为常见 torchvision 任务的参考。更多详情,请参阅文档。
(测试版) 用于检测的新模型
SSD 和 SSDlite 是两种流行的目标检测架构,在速度方面效率很高,并为低分辨率图片提供了良好的结果。在此版本中,我们提供了带有 VGG16 主干的原始 SSD 模型实现,以及其移动端友好型变体——带有 MobileNetV3-Large 主干的 SSDlite。
这些模型在 COCO train2017 数据集上进行了预训练,使用方法如下
import torch
import torchvision
# Original SSD variant
x = [torch.rand(3, 300, 300), torch.rand(3, 500, 400)]
m_detector = torchvision.models.detection.ssd300_vgg16(pretrained=True)
m_detector.eval()
predictions = m_detector(x)
# Mobile-friendly SSDlite variant
x = [torch.rand(3, 320, 320), torch.rand(3, 500, 400)]
m_detector = torchvision.models.detection.ssdlite320_mobilenet_v3_large(pretrained=True)
m_detector.eval()
predictions = m_detector(x)
在 COCO val2017 上可获得以下准确率(完整结果可在 #3403 和 #3757 中查看)
| 模型 | mAP | mAP@50 | mAP@75 |
|---|---|---|---|
| SSD300 VGG16 | 25.1 | 41.5 | 26.2 |
| SSDLite320 MobileNetV3-Large | 21.3 | 34.3 | 22.1 |
更多详情,请参阅文档。
(测试版) GPU 上的 JPEG 解码
现在可以使用 nvjpeg 在 GPU 上进行 JPEG 解码,这在您的 CUDA 环境中应已就绪。单个图像的解码时间大约比 CPU 上的 libjpeg 快 2 到 3 倍。虽然结果张量将存储在 GPU 设备上,但输入的原始张量仍需保留在宿主机(CPU)上,因为解码过程的第一阶段是在宿主机上进行的:from torchvision.io.image import read_file, decode_jpeg
data = read_file('path_to_image.jpg') # raw data is on CPU
img = decode_jpeg(data, device='cuda') # decoded image in on GPU
更多详情,请参阅文档。
(测试版) iOS 支持
TorchVision 0.10 现在为其 C++ 算子提供预编译的 iOS 二进制文件,这意味着您可以在 iOS 上运行 Faster R-CNN 和 Mask R-CNN。关于如何构建利用这些算子的程序的示例应用可以在这里找到。
TorchAudio 0.9.0
(稳定版) 复数张量迁移
TorchAudio 拥有处理复数张量的函数。这些函数遵循使用额外维度来表示实部和虚部的惯例。PyTorch 1.6 引入了原生的复数类型。随着其 API 趋于稳定,torchaudio 已开始迁移到原生复数类型。
在此版本中,我们增加了对原生复数张量的支持,您可以选择启用它们。我们已验证,使用原生复数类型后,受影响的函数继续支持自动求导和 TorchScript;此外,切换到原生复数类型提高了它们的性能。更多详情,请参阅 pytorch/audio#1337。
(稳定版) 滤波改进
在 0.8 版本中,我们添加了 CPU 版 lfilter 核心部分的 C++ 实现,提高了性能。在此版本中,我们优化了 CPU 实现的一些内部操作,以进一步提升性能。我们还增加了对 CPU 和 GPU 的自动求导支持。现在,lfilter 和所有的 biquad 滤波器(biquad、band_biquad、bass_biquad、treble_biquad、allpass_biquad、lowpass_biquad、highpass_biquad、bandpass_biquad、equalizer_biquad 和 bandrefect_biquad)都受益于性能提升并支持自动求导。我们还为了提高性能将 overdrive 的实现移至 C++。更多详情,请参阅文档。
(稳定版) 改进的自动求导支持
伴随复数张量迁移和滤波改进工作,我们还为变换增加了自动求导测试。现在可以保证 lfilter、biquad 及其变体以及大多数变换都支持自动求导。更多详情,请参阅发行说明。
(稳定版) 改进的 Windows 支持
Torchaudio 出于性能和与第三方库集成等原因,使用 C++ 实现了一些操作。这些 C++ 组件此前仅在 Linux 和 macOS 上可用。在此版本中,我们增加了对 Windows 的支持。因此,上述提到的高效滤波实现现在也可在 Windows 上使用。
但是,请注意并非所有 C++ 组件都在 Windows 上可用。“sox_io” 后端和 torchaudio.functional.compute_kaldi_pitch 尚不支持。
(稳定版) I/O 函数迁移
自 0.6 版本以来,我们持续改进了 I/O 功能。具体而言,在 0.8 版本中,我们将默认后端从“sox”更改为“sox_io”,并对“soundfile”后端的 API 进行了同样的切换。0.9 版本通过移除已弃用的后端完成了此次迁移。更多详情,请参阅 #903。
(测试版) Wav2Vec2.0 模型
我们添加了来自 Wav2Vec2.0 的模型架构。您可以导入发布在 fairseq 和 Hugging Face Hub 上的微调模型参数。我们的模型定义支持 TorchScript,并且可以将模型部署到非 Python 环境,例如 C++、Android 和 iOS。
以下代码片段展示了此类用例。请查看我们的 C++ 示例目录以获取完整示例。目前它专为运行推理而设计。如果您需要更多关于训练的支持,请提交功能请求。
# Import fine-tuned model from Hugging Face Hub
import transformers
from torchaudio.models.wav2vec2.utils import import_huggingface_model
original = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-base-960h")
imported = import_huggingface_model(original)
# Import fine-tuned model from fairseq
import fairseq
from torchaudio.models.wav2vec2.utils import import_fairseq_model
original, _, _ = fairseq.checkpoint_utils.load_model_ensemble_and_task(
["wav2vec_small_960h.pt"], arg_overrides={'data': "<data_dir>"})
imported = import_fairseq_model(original[0].w2v_encoder)
# Build uninitialized model and load state dict
from torchaudio.models import wav2vec2_base
model = wav2vec2_base(num_out=32)
model.load_state_dict(imported.state_dict())
# Quantize / script / optimize for mobile
quantized_model = torch.quantization.quantize_dynamic(
model, qconfig_spec={torch.nn.Linear}, dtype=torch.qint8)
scripted_model = torch.jit.script(quantized_model)
optimized_model = optimize_for_mobile(scripted_model)
optimized_model.save("model_for_deployment.pt")
更多详情,请参阅文档。
(测试版) 重采样改进
在 0.8 版本中,我们向量化了 torchaudio.compliance.kaldi.resample_waveform 中的操作,这提高了 resample_waveform 和 torchaudio.transforms.Resample 的性能。在此版本中,我们进一步修改了重采样算法的实现方式。
我们已经
- 增加了 Kaiser 窗支持,以实现更广泛的重采样质量。
- 增加了用于抗混叠控制的
rolloff参数。 - 增加了预计算内核并将其缓存在
torchaudio.transforms.Resample中的机制,以实现更快的操作。 - 将实现从
torchaudio.compliance.kaldi.resample_waveform移动到torchaudio.functional.resample,并弃用了torchaudio.compliance.kaldi.resample_waveform。
更多详情,请参阅文档。
(原型) RNN 转导损失 (RNN Transducer Loss)
RNN 转导损失用于训练 RNN 转导模型,这是语音识别任务中流行的架构。torchaudio 中的原型损失目前支持自动求导、TorchScript、float16 和 float32,并且可以在 CPU 和 CUDA 上运行。更多详情,请参阅文档。
TorchText 0.10.0
(测试版) 新的 Vocab 模块
在此版本中,我们引入了一个新的 Vocab 模块,用以取代当前的 Vocab 类。新的 Vocab 为 NLP 工作流提供了通用的功能性 API。该模块由高效的 C++ 实现提供支持,将批处理查找时间缩短了多达 ~85%(关于基准测试的更多信息请参阅 #1248 和 #1290 的摘要),并提供对 TorchScript 的支持。我们提供了配套的工厂函数,可用于通过 Python 有序字典或生成 Token 列表的迭代器来构建 Vocab 对象。
#creating Vocab from text file
import io
from torchtext.vocab import build_vocab_from_iterator
#generator that yield list of tokens
def yield_tokens(file_path):
with io.open(file_path, encoding = 'utf-8') as f:
for line in f:
yield line.strip().split()
#get Vocab object
vocab_obj = build_vocab_from_iterator(yield_tokens(file_path), specials=["<unk>"])
#creating Vocab through ordered dict
from torchtext.vocab import vocab
from collections import Counter, OrderedDict
counter = Counter(["a", "a", "b", "b", "b"])
sorted_by_freq_tuples = sorted(counter.items(), key=lambda x: x[1], reverse=True)
ordered_dict = OrderedDict(sorted_by_freq_tuples)
vocab_obj = vocab(ordered_dict)
#common API usage
#look-up index
vocab_obj["a"]
#batch look-up indices
vocab_obj.looup_indices(["a","b"])
#support forward API of PyTorch nn Modules
vocab_obj(["a","b"])
#batch look-up tokens
vocab_obj.lookup_tokens([0,1])
#set default index to return when token not found
vocab_obj.set_default_index(0)
vocab_obj["out_of_vocabulary"] #prints 0
更多详情,请参阅文档。
感谢您的阅读。如果您对这些更新感兴趣并希望加入 PyTorch 社区,我们鼓励您加入讨论论坛并提交 GitHub 问题。要获取 PyTorch 的最新消息,请关注我们的 Facebook、Twitter、Medium、YouTube 或 LinkedIn。
干杯!
- PyTorch 团队