• Docs >
  • TorchRec High Level Architecture
Shortcuts

TorchRec 高级架构

在本节中,您将了解TorchRec的高级架构,该架构旨在使用PyTorch优化大规模推荐系统。您将学习TorchRec如何利用模型并行性将复杂模型分布在多个GPU上,从而增强内存管理和GPU利用率,并介绍TorchRec的基本组件和分片策略。

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

TorchRec的并行策略:模型并行

随着现代深度学习模型的规模扩大,分布式深度学习已成为在足够时间内成功训练模型的必要条件。在这种范式下,已经发展出两种主要方法:数据并行和模型并行。TorchRec专注于后者,用于嵌入表的分片。

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)的2D矩阵。

  • 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概念页面,以了解所有内容如何端到端地结合在一起的基本原理。它包含大量有用的信息,以充分利用TorchRec。

另请参阅