跳转到主要内容
博客

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

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

随着 PyTorch 1.11 发布,我们推出了 TorchRec 的 Beta 版本,并对现有的 PyTorch 领域库进行了一系列改进。这些更新表明我们专注于在所有领域开发通用且可扩展的 API,以便我们的社区更容易在 PyTorch 上构建生态系统项目。亮点包括:

  • 面向推荐系统的 PyTorch 领域库 TorchRec 已发布 Beta 版。在 GitHub 上查看
  • TorchAudio – 添加了基于 Enformer 和 RNN-T 的模型和方案,以支持流式 ASR 模型的完整开发生命周期。请参阅此处的发布说明。
  • TorchText – 添加了对 RoBERTa 和 XLM-R 模型的 Beta 支持、字节级 BPE 分词器,以及由 TorchData 支持的文本数据集。请参阅此处的发布说明。
  • TorchVision – 添加了 4 个新的模型家族和 14 个新的分类数据集,例如 CLEVR、GTSRB、FER2013。请参阅此处的发布说明。

TorchRec 0.1

几周前我们发布了 TorchRec,今天我们很高兴发布其 Beta 版本。回顾一下,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:音频和语音处理的构建块》的论文,描述了 TorchAudio 库的概述。如果您认为 TorchAudio 对您的研究有用,请引用我们的论文,帮助我们与社区分享。

(Beta) RNN-T 和 (原型) Emformer 模型及方案

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

TorchAudio v0.11 版本包括以下 Beta 功能:

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

此外,还有可通过夜间构建或主分支获得的原型功能。

  • 在 MuST-C 和 TED-LIUM3 数据集上训练的训练方案。(GitHub)
  • 与方案对应的预训练管道。(文档)
  • 逐步使用 RNN-T Emformer 模型执行在线语音识别的教程。(文档)

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

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

(Beta) 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

(Beta) RoBERTa 和 XLM-R 模型

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

更具体地说:

  • 这些模型是可 torchscript 的,因此可以用于生产用例。
  • 模型 API 允许用户轻松地将自定义任务特定头部与预训练编码器连接起来。
  • API 还配备了数据预处理转换,以匹配预训练权重和模型配置。

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

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

(Beta) 字节级 BPE 分词器

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

(Beta) 由 TorchData 支持的文本数据集

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

这些 DataPipes 可与 PyTorch DataLoader 即插即用,并将支持自动分片等新功能。用户现在可以使用用户定义的函数和转换,以函数式编程风格轻松进行数据操作和预处理。由 DataPipes 支持的数据集还支持批处理、整理、洗牌和桶化等标准流控制。

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

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

TorchVision 0.12

新模型

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

#1 目标检测

FCOS 是一种流行的、全卷积、无锚点目标检测模型。在此版本中,我们包含了社区贡献的模型实现以及预训练权重。该模型在 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 上的框 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 是两种流行的架构,可以用作图像分类器或下游视觉任务的骨干网络。在此版本中,我们包含了 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 问题上提供您的反馈。
  • 我们的弃用政策变更 – 到目前为止,torchvision 几乎从不删除已弃用的 API。为了与 pytorch 核心更一致,我们正在更新我们的弃用政策。我们现在遵循 2 个版本的弃用周期:已弃用的 API 将在 2 个版本中发出警告,之后将被删除。为了反映这些变化并平稳过渡,我们决定:
    • 删除所有在 v0.8 或之前版本中已弃用的 API,该版本于 1.5 年前发布。
    • 将所有其他已弃用 API 的删除时间表更新到 v0.14,以反映从 v0.12 开始的新 2 周期政策。

Captum 0.5

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

更具体地说,Captum 新增的“影响力”子部分包括:

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

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

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

干杯!

PyTorch 团队