• 文档 >
  • TorchRec 高层架构
快捷方式

TorchRec 高层架构

在本节中,您将了解 TorchRec 的高层架构,该架构旨在通过 PyTorch 优化大规模推荐系统。您将了解 TorchRec 如何采用模型并行来跨多个 GPU 分布复杂模型,从而提高内存管理和 GPU 利用率,并了解 TorchRec 的基本组件和分片策略。

实际上,TorchRec 提供了并行原语,支持混合数据并行/模型并行、嵌入表分片、用于生成分片计划的规划器、流水线训练等。

TorchRec 的并行策略:模型并行

随着现代深度学习模型的规模不断扩大,分布式深度学习已成为在足够时间内成功训练模型所必需的。在此范例中,已开发出两种主要方法:数据并行和模型并行。TorchRec 专注于后一种,用于嵌入表的 Sharding(分片)。

Visualizing the difference of sharding a model in model parallel or data parallel approach

图 1. 模型并行和数据并行方法的比较

如上图所示,模型并行和数据并行是跨多个 GPU 分布工作负载的两种方法,

  • 模型并行

    • 将模型划分为多个段并将其分布在 GPU 上

    • 每个段独立处理数据

    • 适用于无法容纳单个 GPU 的大型模型

  • 数据并行

    • 在每个 GPU 上分发整个模型的副本

    • 每个 GPU 处理一部分数据并为整体计算做出贡献

    • 对于可以容纳单个 GPU 但需要处理大型数据集的模型有效

  • 模型并行的好处

    • 优化大型模型的内存使用和计算效率

    • 对于具有大型嵌入表的推荐系统尤其有益

    • 支持 DLRM 类型架构中嵌入的并行计算

嵌入表

为了让 TorchRec 能够推断出要推荐什么,我们需要能够表示实体及其关系,这就是嵌入的用途。嵌入是高维空间中的实数向量,用于表示词语、图像或用户等复杂数据中的含义。嵌入表是将多个嵌入聚合到一个矩阵中。最常见的是,嵌入表表示为具有 (B, N) 维度的二维矩阵。

  • B 是表中存储的嵌入数量

  • N 是每个嵌入的维度数量。

B 中的每一个也可以称为 ID(代表电影标题、用户、广告等信息),在访问 ID 时,我们会返回相应的嵌入向量,其大小为嵌入维度 N

还有对嵌入进行池化的选择,通常,我们会查找一个特征的多个行,这引发了一个问题:当我们查找多个嵌入向量时该怎么做。池化是一种常用技术,我们通过对行进行求和或平均等方式组合嵌入向量,以生成一个嵌入向量。这是 PyTorch nn.Embeddingnn.EmbeddingBag 之间的主要区别。

PyTorch 通过 nn.Embeddingnn.EmbeddingBag 表示嵌入。在此基础上,TorchRec 引入了 EmbeddingCollectionEmbeddingBagCollection,它们是相应的 PyTorch 模块的集合。此扩展使 TorchRec 能够批处理表并在单个内核调用中执行多个嵌入的查找,从而提高效率。

这是描述推荐模型训练过程中如何使用嵌入的端到端流程图

Demonstrating the full training loop from embedding lookup to optimizer update in backward

图 2. TorchRec 端到端嵌入流程

在上面的图中,我们展示了通用的 TorchRec 端到端嵌入查找过程,

  • 在前向传播中,我们进行嵌入查找和池化

  • 在后向传播中,我们计算输出查找的梯度,并将它们传递给优化器以更新嵌入表

请注意,此处嵌入的梯度是灰色的,因为我们不会将它们完全物化到内存中,而是将它们与优化器更新融合。这导致了显著的内存减少,我们将在后面的优化器概念部分进行详细介绍。

我们建议您浏览 TorchRec Concepts 页面,以了解一切如何端到端地结合在一起的基础知识。它包含大量有用的信息,可帮助您充分利用 TorchRec。

另请参阅

文档

访问全面的 PyTorch 开发者文档

查看文档

教程

为初学者和高级开发者提供深入的教程

查看教程

资源

查找开发资源并让您的问题得到解答

查看资源