今天,我们宣布了多项 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 窗口支持)。启动了复杂张量操作的迁移。改进了自动微分支持。请在此处查看 发布说明。
- TorchText – 添加了新的高性能 Vocab 模块,为 NLP 工作流提供通用功能 API。请在此处查看 发布说明。
我们感谢社区对此次最新版本的支持和贡献。
PyTorch 版本中的功能分为稳定版 (Stable)、测试版 (Beta) 和原型版 (Prototype)。您可以在这篇博客文章中了解更多定义。
TorchVision 0.10
(稳定版) 用于目标检测的量化内核
nms 和 roi_align 运算符的前向传播现在支持具有量化 dtype 的张量,这有助于降低目标检测模型的内存占用,尤其是在移动环境中。有关更多详细信息,请参阅 文档。
(稳定版) Tensor 变换的速度优化
resize 和 flip 变换已优化,在 CPU 上的运行时性能提升了多达 5 倍。
(稳定版) 文档改进
文档得到了显著改进。特别是,一个新的示例库已经可用。这些示例直观地说明了每个变换如何作用于图像,并正确地记录和说明了分割模型的输出。
示例库将来会扩展,以提供更全面的示例,并作为常见 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,nvjpeg 应该在您的 CUDA 设置中随时可用。单张图像的解码时间应该比 CPU 上的 libjpeg 快 2 到 3 倍。虽然生成的张量将存储在 GPU 设备上,但输入原始张量仍然需要驻留在主机(CPU)上,因为解码过程的第一个阶段发生在主机上:从 torchvision.io.image 导入 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 Transducer Loss
RNN transducer loss 用于训练 RNN transducer 模型,这是一种用于语音识别任务的流行架构。torchaudio 中的原型损失目前支持自动微分、torchscript、float16 和 float32,并且可以在 CPU 和 CUDA 上运行。有关更多详细信息,请参阅 文档。
TorchText 0.10.0
(测试版) 新的 Vocab 模块
在此版本中,我们引入了一个新的 Vocab 模块,它取代了当前的 Vocab 类。新的 Vocab 为 NLP 工作流提供了通用的功能 API。该模块由高效的 C++ 实现提供支持,可将批量查找时间缩短多达约 85%(有关基准的更多信息,请参阅 #1248 和 #1290 的摘要),并提供对 TorchScript 的支持。我们提供配套的工厂函数,可用于通过 python 有序字典或生成令牌列表的迭代器来构建 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 团队