跳转到主要内容
博客

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:音频和语音处理的构建模块,描述了 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 波束搜索解码器(文档
  • 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 编码器的端到端模型。

更具体地说:

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

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

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

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

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

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

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

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

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

您可以在其官方文档中了解更多关于 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)。

我们要感谢 胡野王志强 为模型实现和初始训练做出的贡献。这是很长一段时间以来第一个社区贡献的模型,鉴于其成功,我们决定利用这个过程中的经验教训并创建新的 模型贡献指南

#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 上获得的准确率如下所示

模型前1准确率前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 根据测试样本和训练样本关于模型参数的损失梯度之间的点积相似性,近似计算每个训练样本对给定测试样本的影响分数。请注意,如果我们将训练样本用作测试样本,则计算自影响。此方法及其下述变体还会返回前 k 个支持者和反对者,它们分别是前 k 个最大的正影响样本和负影响样本。
  • TracInCPFast 是 TracInCP 的一种近似方法,它避免了计算与大型参数矩阵相关的梯度。它基于训练和测试样本的最后全连接层激活与该层损失梯度之间的点积来近似影响分数。
  • TracInCPFastRandProj 使用最近邻近似库(如 annoy)计算训练和测试量之间的点积。为了降低层激活和相应梯度的维度,此方法还允许使用随机投影矩阵将这些向量投影到较低维空间中。

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

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

干杯!

PyTorch 团队