今天,我们宣布了对多个 PyTorch 库的更新,以及 PyTorch 1.9 版本的发布。这些更新包括领域库(如 TorchVision、TorchText 和 TorchAudio)的新版本。这些版本,连同 PyTorch 1.9 版本,包含了许多新特性和改进,将为 PyTorch 社区提供一系列广泛的更新。
一些亮点包括:
- TorchVision - 添加了新的 SSD 和 SSDLite 模型,对象检测的量化内核,GPU Jpeg 解码,以及 iOS 支持。请参阅发布说明。
- TorchAudio - 添加了 wav2vec 2.0 模型,可在非 Python 环境中部署(包括 C++、Android 和 iOS)。在 lfilter、频谱操作、重采样等方面进行了许多性能改进。增加了采样质量控制的选项(即 Kaiser 窗口支持)。启动了复杂数张量操作的迁移。改进了 autograd 支持。请参阅发布说明。
- TorchText - 添加了一个新的高性能 Vocab 模块,为 NLP 工作流程提供常见的功能 API。请参阅发布说明。
我们想感谢社区对这次最新版本的支持和工作。
PyTorch 版本中的功能分为稳定版、测试版和原型版。您可以在本博客文章中了解更多关于定义的信息。
TorchVision 0.10
(稳定版)对象检测量化内核
nms 和 roi_align 算子的前向传播现在支持量化数据类型的张量,这有助于降低目标检测模型的内存占用,尤其是在移动环境中。更多详情请参阅文档。
(稳定) Tensor 变换的速度优化
调整大小和翻转变换已优化,其 CPU 运行时间提高了 5 倍。
(稳定) 文档改进
文档进行了重大改进。特别是,新增了一个示例画廊。这些示例直观地展示了每个转换对图像的作用,并正确地记录和展示了分割模型的输出。
示例画廊将在未来扩展,以提供更全面的示例,并作为常见 torchvision 任务的参考。更多详情请参阅文档。
(Beta)新的检测模型
SSD 和 SSDlite 是两种流行的目标检测架构,在速度方面效率高,对于低分辨率图片提供良好的结果。在本版本中,我们提供了原始 SSD 模型(VGG16 作为骨干网络)及其移动友好版本 SSDlite(MobileNetV3-Large 作为骨干网络)的实现。
模型在 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):
Model | 平均精度(mAP) | 50%召回率下的平均精度(mAP@50) | mAP@75 |
---|---|---|---|
SSD300 VGG16 | 25.1 | 41.5 | 26.2 |
SSDlite320 MobileNetV3-Large | 21.3 | 34.3 | 22.1 |
欲了解更多详情,请参阅文档。
(Beta) GPU 上 JPEG 解码
现在可以使用 nvjpeg 在 GPU 上解码 JPEG,这应该在您的 CUDA 设置中 readily 可用。单个图像的解码时间应该比 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
更多详细信息,请参阅文档。
(Beta) 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")
更多详情,请参阅文档。
(Beta)重采样改进
在 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 Transducer 损失
RNN transducer 损失用于训练 RNN transducer 模型,这是一种流行的语音识别任务架构。torchaudio 中的当前原型损失支持 autograd、torchscript、float16 和 float32,并且可以在 CPU 和 CUDA 上运行。更多详情,请参阅文档。
TorchText 0.10.0
(Beta) 新词汇模块
在本版本中,我们引入了一个新的词汇模块,该模块取代了当前的词汇类。新的词汇提供了 NLP 工作流程的常用功能 API。该模块由高效的 C++实现支持,将批量查找时间减少了高达 85%(有关基准测试的更多信息,请参阅#1248 和#1290 的总结),并支持 TorchScript。我们提供了配套的工厂函数,可用于通过 Python 有序字典或生成标记列表的迭代器来构建词汇对象。
#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 团队