• 文件 >
  • TorchRec 高階架構
捷徑

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

還有另一種選擇是池化嵌入 (pooling embeddings)。通常,我們會為給定的特徵查詢多個列,這引發了一個問題:我們該如何處理查詢到的多個嵌入向量?池化是一種常見的技術,透過組合嵌入向量來產生一個嵌入向量,通常是將這些列加總或取平均值。這是 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 端到端嵌入查找過程。

  • 在正向傳播 (forward pass) 中,我們執行嵌入查找和池化。

  • 在反向傳播 (backward pass) 中,我們計算輸出查找的梯度,並將它們傳遞到優化器以更新嵌入表。

請注意,此處的嵌入梯度顯示為灰色,因為我們並未將它們完全具體化到記憶體中,而是將它們與優化器更新融合在一起。 這樣可以顯著減少記憶體使用量,我們將在後面的優化器概念部分詳細介紹。

我們建議您閱讀 TorchRec 概念頁面,以了解所有內容如何端到端地聯繫在一起的基本原理。 它包含許多有用的資訊,可讓您充分利用 TorchRec。

另請參閱

文件

存取 PyTorch 的完整開發者文件

檢視文件

教學課程

取得適合初學者和進階開發人員的深入教學課程

檢視教學課程

資源

尋找開發資源並獲得問題解答

檢視資源