今天,我们宣布了与 PyTorch 1.9 版本一起发布的多个 PyTorch 库的更新。这些更新包括 TorchVision、TorchText 和 TorchAudio 等领域库的新版本。这些版本与 PyTorch 1.9 版本一起,包含了许多新功能和改进,将为 PyTorch 社区提供广泛的更新。
一些亮点包括:
- TorchVision – 添加了新的 SSD 和 SSDLite 模型,用于目标检测的量化内核,GPU Jpeg 解码和 iOS 支持。请在此处查看发布说明。
- TorchAudio – 添加了可在非 Python 环境(包括 C++、Android 和 iOS)中部署的 wav2vec 2.0 模型。lfilter、频谱操作、重采样方面有许多性能改进。增加了采样质量控制选项(即支持 Kaiser 窗)。启动了复杂张量操作的迁移。改进了自动求导支持。请在此处查看发布说明。
- TorchText – 添加了一个新的高性能 Vocab 模块,为 NLP 工作流提供通用功能 API。请在此处查看发布说明。
我们要感谢社区对最新版本的支持和工作。
PyTorch 版本中的功能分为稳定版 (Stable)、测试版 (Beta) 和原型版 (Prototype)。您可以在这篇博客文章中了解更多定义。
TorchVision 0.10
(稳定版)用于目标检测的量化内核
nms 和 roi_align 运算符的前向传播现在支持量化 dtype 的张量,这有助于降低目标检测模型的内存占用,尤其是在移动环境中。有关更多详细信息,请参阅文档。
(稳定版)Tensor 转换的速度优化
resize 和 flip 转换已优化,在 CPU 上的运行时性能提高了 5 倍。
(稳定版)文档改进
文档得到了显著改进。特别是,提供了一个新的示例库。这些示例直观地展示了每个转换如何作用于图像,并正确地记录和说明了分割模型的输出。
示例库将来会扩展,以提供更全面的示例,并作为常见 torchvision 任务的参考。有关更多详细信息,请参阅文档。
(Beta 版)新的检测模型
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 |
有关更多详细信息,请参阅文档。
(Beta 版)GPU 上的 JPEG 解码
现在可以使用 nvjpeg 在 GPU 上解码 jpeg,nvjpeg 应该在您的 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
有关更多详细信息,请参阅文档。
(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`)都受益于性能改进并支持自动求导。我们还将过载的实现移至 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。
(Beta 版)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 换能器损失
RNN 换能器损失用于训练 RNN 换能器模型,这是一种用于语音识别任务的流行架构。torchaudio 中的原型损失目前支持自动求导、torchscript、float16 和 float32,并且还可以在 CPU 和 CUDA 上运行。有关更多详细信息,请参阅文档。
TorchText 0.10.0
(Beta 版)新词汇模块
在此版本中,我们引入了一个新的 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 团队