博客

PyTorch 1.11 中引入 TorchRec 及其他领域库更新

作者 2022年3月10日2024年11月15日暂无评论

随着 PyTorch 1.11 版本的发布,我们正式推出 TorchRec 的测试版,并对当前的 PyTorch 领域库进行了一系列改进。这些更新体现了我们致力于在各个领域开发通用且可扩展的 API,旨在让我们的社区能够更轻松地在 PyTorch 之上构建生态系统项目。亮点包括:

  • TorchRec,作为 PyTorch 的推荐系统领域库,现已推出测试版。在 GitHub 上查看
  • TorchAudio – 增加了基于 Enformer 和 RNN-T 的模型及配方,以支持流式 ASR(自动语音识别)模型的完整开发生命周期。点击此处查看发行说明。
  • TorchText – 增加了对 RoBERTa 和 XLM-R 模型的测试版支持,添加了字节级 BPE 分词器,以及由 TorchData 支持的文本数据集。点击此处查看发行说明。
  • TorchVision – 增加了 4 个新的模型家族和 14 个新的分类数据集,例如 CLEVR、GTSRB、FER2013 等。点击此处查看发行说明。

TorchRec 0.1

我们几周前宣布了 TorchRec,今天很高兴发布其测试版本。简而言之,TorchRec 是一个用于推荐系统的 PyTorch 领域库。该新库提供了通用的稀疏性和并行性原语,使研究人员能够构建最先进的个性化模型并将其部署到生产环境中。TorchRec 曾用于训练一个 1.25 万亿参数的模型,并于 2022 年 1 月投入生产。

具体来说,该库包括:

  • 建模原语,例如嵌入包(embedding bags)和锯齿张量(jagged tensors),使用混合数据并行和模型并行,可以轻松构建大型、高性能的多设备/多节点模型。
  • FBGEMM 驱动的优化 RecSys 内核,包括对稀疏和量化操作的支持。
  • 一个分片器(sharder),可以采用多种不同策略对嵌入表进行分区,包括数据并行、按表、按行、按表按行和按列分片。
  • 一个规划器(planner),可以自动为模型生成优化的分片计划。
  • 流水线(Pipelining),用于重叠数据加载设备传输(复制到 GPU)、设备间通信(input_dist)和计算(前向、后向),以提高性能。
  • GPU 推理支持。
  • 推荐系统的常用模块,例如模型和公共数据集(Criteo 和 Movielens)。

请查看 TorchRec 公告帖此处视频教程、安装指南此处,通过此教程在此处进行试用,并参考参考文档此处

TorchAudio 0.11

TorchAudio:音频和语音处理的构建模块

我们发表了一篇论文《TorchAudio: Building Blocks for Audio and Speech Processing》,概述了 TorchAudio 库。如果您发现 TorchAudio 对您的研究有用,请通过引用我们的论文来帮助我们分享给社区。

(测试版) RNN-T 和 (原型) Emformer 模型及配方

Emformer 是一种高效的基于内存 Transformer 的流式声学模型,在低延迟、资源受限的场景(如端侧设备应用)中展示了最先进的流式自动语音识别 (ASR) 性能(引用:https://arxiv.org/abs/2010.10759)。

TorchAudio v0.11 版本包含以下测试版功能:

  • Emformer 的实现 (文档)
  • 使用 Emformer 作为其转录网络的循环神经网络换能器 (RNN-T) 流式 ASR 模型 (文档)
  • 支持 TorchScript 的 RNN-T 集束搜索 (beam search) 解码器 (文档)
  • LibriSpeech Emformer RNN-T 训练配方 (GitHub) 及相应的预训练流式 ASR 推理流水线 (文档)

此外,还有可通过每日构建版或主分支获取的原型功能:

  • 在 MuST-C 和 TED-LIUM3 数据集上训练的训练配方。(GitHub)
  • 与配方对应的预训练流水线。(文档)
  • 演示如何使用 RNN-T Emformer 模型进行在线语音识别的教程。(文档)

总的来说,这些功能涵盖了流式 ASR 模型的完整开发生命周期(从定义到训练和推理),使用户能够轻松开发自己的基于 Emformer 和 RNN-T 的模型。

特别感谢 Yangyang Shi、Jay Mahadeokar 和 Gil Keren 的代码贡献与指导。

(测试版) HuBERT 预训练模型

HuBERT 模型的掩码预测训练需要掩码后的 logits、未掩码的 logits 和特征范数作为输出。Logits 用于交叉熵损失,特征范数用于惩罚损失。此版本添加了 HuBERTPretrainModel 及相应的工厂函数(hubert_pretrain_base、hubert_pretrain_large 和 hubert_pretrain_xlarge),以支持从零开始训练。

(原型) CTC 集束搜索解码器

在最近的版本中,TorchAudio 增加了对在 CTC 损失上微调的 ASR 模型的支持。添加推理时的 CTC 集束搜索解码器,使得能够使用 TorchAudio 工具进行端到端的 ASR 评估。

TorchAudio 中的 CTC 解码器支持带有词汇约束的可定制集束搜索解码。它还具有可选的 KenLM 语言模型支持。

有关更多详细信息,请查看 API 教程。此原型功能可通过每日构建版获取。

(原型) 流式 API

TorchAudio 最初是作为补充 PyTorch 的简单音频 I/O API。随着最近 ASR 模型和训练配方的加入,该项目收到了支持高层应用开发的需求。

流式 API 使得开发和测试在线推理模型变得简单。它在底层利用 ffmpeg,支持从在线服务和硬件设备读取媒体,以增量方式解码媒体,并应用过滤器和预处理。

请查看 API 教程文档。此外还有 流式 ASR 教程和 设备流式 ASR 教程。此功能可从每日构建版本中获取。关于如何安装每日构建版,请参考 pytorch.org

TorchText 0.12

(测试版) RoBERTa 和 XLM-R 模型

TorchText 增加了对预训练 RoBERTa 和 XLM-R 模型的支持。这将允许用户使用 TorchText 在标准 NLP 任务上训练基于 Transformer Encoder 的端到端模型。

具体来说:

  • 这些模型支持 TorchScript,因此可用于生产环境。
  • 模型 API 允许用户轻松地将自定义的任务特定头部(head)与预训练编码器结合使用。
  • 该 API 还配备了数据预处理转换,以匹配预训练权重和模型配置。

我们添加了一个教程,展示了使用预训练 XLM-R 基础架构进行的 SST-2 二元文本分类任务。

有关模型 API 和使用示例的更多详细信息,请参阅文档

(测试版) 字节级 BPE 分词器

TorchText 增加了对字节级 BPE 分词器的支持,正如 GPT-2 中所使用的那样。此分词器也用于对前述预训练 RoBERTa 模型的输入进行分词。除了 RoBERTa 词表,用户还可以加载自己的自定义 BPE 词表来使用该分词器。此外,该分词器完全支持 TorchScript,因此可用于生产环境。有关模型 API 和使用示例的更多详细信息,请参阅文档

(测试版) 由 TorchData 支持的文本数据集

TorchText 通过从旧式 Iterable Datasets 迁移到 TorchData 的 DataPipes,对其数据集进行了现代化改造。TorchData 是一个提供模块化/可组合原语的库,允许用户在高性能数据流水线中加载和转换数据。

这些 DataPipes 可以与 PyTorch DataLoader 直接配合使用,并支持自动分片 (auto-sharding) 等新功能。用户现在可以使用函数式编程风格,利用自定义函数和转换轻松进行数据操作和预处理。由 DataPipes 支持的数据集也支持批处理、整理 (collation)、洗牌 (shuffling) 和桶化 (bucketizing) 等标准流程控制。

总的来说,DataPipes 以一种 Python 风格且灵活的方式,为模型训练中的数据预处理和张量化需求提供了全面的体验。我们添加了一个教程,演示了如何使用现代化数据集进行二元文本分类的数据处理流水线。

您可以在其官方文档中了解更多关于 TorchData DataPipe API 的信息。

TorchVision 0.12

新模型

最新版本发布了四个新的模型家族,并提供了其变体的预训练权重。

#1 对象检测

FCOS 是一种流行的、全卷积的、无锚点(anchor-free)的对象检测模型。在此版本中,我们包含了社区贡献的模型实现以及预训练权重。该模型在 COCO train2017 上进行了训练,可以按以下方式使用。

import torch
from torchvision import models

x = [torch.rand(3, 224, 224)]
fcos = models.detection.fcos_resnet50_fpn(pretrained=True).eval()
predictions =  fcos(x)

预训练模型在 COCO val2017 上的 Box AP 为 39.2(详情见 #4961)。

我们要感谢 Hu YeZhiqiang Wang 对模型实现和初步训练的贡献。这是长期以来第一个由社区贡献的模型,鉴于其成功,我们决定借鉴此过程的经验,制定新的模型贡献指南

#2 光流支持和 RAFT 模型

TorchVision 现在支持光流!光流模型试图预测视频中的运动:给定两个连续的帧,模型预测第一帧的每个像素在第二帧中的位置。查看我们关于光流的新教程

我们实现了一个兼容 TorchScript 的 RAFT 模型,带有预训练权重(包括普通版和“小型”版),并增加了对训练和评估光流模型的支持。我们的训练脚本支持跨进程和节点的分布式训练,训练速度比原始实现快得多。我们还添加了 5 个新的光流数据集:Flying Chairs、Flying Things、Sintel、Kitti 和 HD1K。

#3. 图像分类

Vision Transformer (ViT) 和 ConvNeXt 是两种流行的架构,可用作图像分类器或下游视觉任务的骨干网络 (backbone)。在此版本中,我们包含了 8 个其分类变体的预训练权重。这些模型在 ImageNet 上进行了训练,可以按以下方式使用。

import torch
from torchvision import models

x = torch.rand(1, 3, 224, 224)
vit = models.vit_b_16(pretrained=True).eval()
convnext = models.convnext_tiny(pretrained=True).eval()
predictions1 = vit(x)
predictions2 = convnext(x)

预训练模型在 ImageNet val 上的准确率如下所示:

模型Acc@1Acc@5
vit_b_1681.07295.318
vit_b_3275.91292.466
vit_l_1679.66294.638
vit_l_3276.97293.07
convnext_tiny82.5296.146
convnext_small83.61696.65
convnext_base84.06296.87
convnext_large84.41496.976

上述模型均使用我们新训练配方的调整版本进行训练,这使我们能够提供比原始论文中准确率显著更高的模型。

#4. GPU 视频解码

在此版本中,我们在视频读取 API 中增加了对 GPU 视频解码的支持。要使用硬件加速解码,只需将一个 cuda 设备传递给视频读取 API,如下所示:

import torchvision

reader = torchvision.io.VideoReader(file_name, device="cuda:0")
for frame in reader:
    print(frame)

我们还支持在读取前搜索视频中的任意帧或关键帧,如下所示:

reader.seek(seek_time)

新数据集

我们实现了 14 个新的分类数据集:CLEVR、GTSRB、FER2013、SUN397、Country211、Flowers102、fvgc_aircraft、OxfordIIITPet、DTD、Food 101、Rendered SST2、Stanford cars、PCAM 和 EuroSAT。

作为我们光流支持工作的一部分(详情见上文),我们还添加了 5 个新的光流数据集:Flying Chairs、Flying Things、Sintel、Kitti 和 HD1K。

其他更新

  • 新的文档布局:每个函数/类现在都在单独的页面中记录,清理了模块页面中的一些空间,并简化了对所提议 API 的发现。例如,对比我们的旧文档新文档。如果您有任何反馈,请告诉我们!
  • 新的模型贡献指南:继FCOS 模型(由社区贡献)获得成功后,我们发布了这份指南。这些指南旨在为任何想要建议、实现和训练新模型的人提供模型贡献过程的概述。
  • 即将推出的原型 API:我们目前正在开发一个原型 API,为我们所有的模型构建方法添加多权重支持。这将使我们能够提供多个预训练权重,并关联其元数据和推理转换。该 API 仍在审查中,因此未包含在此版本中,但您可以在我们的博客文章中了解更多信息,并在专门的 Github Issue 上提供反馈。
  • 弃用政策的变更:到目前为止,torchvision 几乎从不删除弃用的 API。为了与 PyTorch 核心更加统一和一致,我们正在更新我们的弃用政策。我们现在遵循 2 个版本的弃用周期:弃用的 API 将发出警告 2 个版本,之后会被移除。为了反映这些变化并平滑过渡,我们决定:
    • 移除所有在 1.5 年前发布的 v0.8 或之前弃用的 API。
    • 将所有其他已弃用 API 的移除时间更新为 v0.14,以反映从 v0.12 开始实施的新的 2 周期政策。

Captum 0.5

Captum 是一个用于模型可解释性的 PyTorch 库。在此版本中,我们扩展了 Captum 的影响力实例,并增加了对基于相似性的影响和新算法 TracIn 及其变体的支持。TracIn 变体通过全连接层的随机投影,提供了对影响分数的更快近似。

具体来说,Captum 的新 influence 子部分包括:

  • SimilarityInfluence:使用默认(余弦或欧几里得)或用户自定义的度量,针对给定的输入模型层,计算测试样本和训练样本之间的相似度分数。
  • TracInCP:基于模型参数的损失梯度之间的点积相似度,近似计算每个训练样本对给定测试样本的影响分数。注意,如果我们使用训练样本作为测试样本,则计算的是自影响。此方法及其下述变体还会返回 top-k 支持样本和反对样本,即分别为影响最大的正样本和负样本。
  • TracInCPFast:这是 TracInCP 的一种近似方法,避免了计算相对于大型参数矩阵的梯度。它基于训练和测试样本的最后全连接层激活值与相对于该层的损失梯度之间的点积来近似影响分数。
  • TracInCPFastRandProj:使用诸如 annoy 之类的最近邻近似库来计算训练和测试量之间的点积。为了降低层激活值及其对应梯度的维度,该方法还允许使用随机投影矩阵将这些向量投影到低维空间中。

有关有影响力实例的实现的更多信息,请访问我们的 GitHub 页面和教程

感谢阅读,如果您对这些更新感兴趣并希望加入 PyTorch 社区,我们鼓励您加入 讨论论坛提交 GitHub issue。要获取 PyTorch 的最新消息,请在 TwitterMediumYouTubeLinkedIn 上关注我们。

干杯!

PyTorch 团队