選自Facebook博客,作者:Maxim Naumov等,機器之心編譯,參與:路、一鳴。

近日,Facebook 開源了深度學習

推薦模型 DLRM。DLRM 通過結合協同過濾演算法和預測分析方法,提供了推薦系統當前最優效果。

隨著深度學習的發展,基於神經網路的個性化和推薦模型成為在生產環境中構建推薦系統的重要工具。但是,這些模型與其他深度學習模型有顯著區別,它們必須能夠處理類別數據(categorical data),該數據類型用於描述高級屬性。對於神經網路而言,高效處理這種稀疏數據很有難度,缺乏公開可用的代表性模型和數據集也拖慢了社區在這方面的研究進展。

為了促進該子領域的進步,Facebook 開源了當前最優的深度學習推薦模型 DLRM,該模型使用 PyTorch 和 Caffe2 平台實現。DLRM 通過結合協同過濾演算法和預測分析方法,相比其他模型獲得進一步的提升,從而能夠高效處理生產級別數據,並提供當前最優結果。

Facebook 在官方博客中表示:開源 DLRM 模型以及公布相關論文,旨在幫助社區尋找新的方式,解決這類模型面臨的獨特挑戰。Facebook 希望鼓勵進一步的演算法實驗、建模、系統協同設計和基準測試。這將有助於新模型和更高效系統的誕生,從而為人們使用大量數字服務提供更具相關性的內容。

  • DLRM 開源地址:github.com/facebookrese

  • DLRM 論文:arxiv.org/abs/1906.0009

了解 DLRM 模型

DLRM 模型使用嵌入處理類別特徵,使用下方的多層感知機(MLP)處理連續特徵。然後顯式地計算不同特徵的二階相互作用(second-order interaction)。最後,使用頂部的多層感知機處理結果,並輸入 sigmoid 函數中,得出點擊的概率。

DLRM 模型處理描述用戶和產品的連續(密集)特徵和類別(稀疏)特徵。該模型使用了大量硬體和軟體組件,如內存容量和帶寬,以及通信和計算資源。

基準和系統協同設計

DLRM 的開源實現可用作基準,去衡量:

  • 模型(及其相關運算元)的執行速度;
  • 不同數值技術對模型準確率的影響。

這可以在不同的硬體平台上進行,比如 BigBasin AI 平台。

DLRM 基準提供兩個版本的代碼,分別使用 PyTorch 和 Caffe2。此外,DLRM 還有一個使用 Glow C++運算元實現的變體。為了適應不同框架,各個版本的代碼略有不同,但整體結構類似。

這些模型實現允許我們對比 Caffe2 框架和 PyTorch 框架,以及 Glow。或許最重要的一點是,未來我們可以從每個框架中選出最好的特徵,然後組合成一個框架。

Big Basin 具備模塊化、可擴展的架構。

DLRM 基準支持隨機輸入和合成輸入的生成。基準模型同時也支持模型自定義生成類別特徵對應的索引。這是因為多種原因:例如,如果某個應用使用了一個特定數據集,出於隱私原因我們無法共享數據,那麼我們或許可以通過分布表示類別特徵。此外,如果我們想要使用系統組件,如學習記憶行為,我們可能需要捕捉合成軌跡(synthetic trace)內原始軌跡的基本位置。

此外,Facebook 根據使用場景的不同,使用多種個性化推薦模型。例如,為了達到高性能,很多服務在單個機器上對輸入執行批處理並分配多個模型,從而在不同平台上實現並行化推斷。此外,Facebook 數據中心的大量伺服器具備架構異構性,從不同的 SIMD 帶寬到不同 cache hierarchy 的實現。架構異構性為軟硬體協同設計和優化提供了機會。(對 Facebook 神經推薦系統架構的深入分析參見論文《The Architectural Implications of Facebooks DNN-based Personalized Recommendation》。)

並行計算

正如第一幅圖所示,DLRM 基準模型由主要執行計算的多層感知機和受限於內存容量的嵌入構成。因此,它自然需要依賴數據並行計算提升多層感知機的表現,利用模型並行化解決嵌入對內存容量的需求。

DLRM 基準模型提供了並行化的解決方案。它通過一種名為 butterfly shuffle 的機制,將每個設備上 minibatch 的嵌入矩陣分割成多個部分,並分配到所有設備上。如下圖所示,每種顏色代表 minibatch 中的一個元素,每個數字代表一個設備及其分配到的嵌入矩陣。Facebook 研究團隊計劃優化這一系統,並在以後的博客中公開詳細的性能細節。

butterfly shuffle 圖示。

建模和演算法實驗

DLRM 基準模型使用 Python 語言編寫,支持靈活部署。模型的架構、數據集和其他參數都使用命令行定義。DLRM 可用於訓練和推斷。訓練過程中,DLRM 增加了反向傳播功能,使參數得到更新。

代碼是完整的,且可以使用公開數據集,包括 Kaggle 展示廣告挑戰賽數據集(Kaggle Display Advertising Challenge Dataset)。該數據集包含 13 種連續特徵和 26 種類別特徵,定義了 MLP 輸入層的大小,以及嵌入的數量,其他參數則可以使用命令行定義。例如,根據如下命令行運行 DLRM 模型,可以產生訓練結果。結果如下圖所示:

python dlrm_s_pytorch.py --arch-sparse-feature-size=16 --arch-mlp-bot="13-512-256-64-16" --arch-mlp-top="512-256-1" --data-generation=dataset --data-set=kaggle --processed-data-file=./input/kaggle_processed.npz --loss-function=bce --round-targets=True --learning-rate=0.1 --mini-batch-size=128 --print-freq=1024 --print-time

左圖展示了模型在訓練和測試集上的二值交叉熵損失。右圖則顯示了模型在訓練集和測試集上的準確率。

DLRM 模型可在真實數據集上運行,這可以幫助衡量模型的準確率,特別是使用不同的數值技術和模型進行對比實驗時。Facebook 團隊計劃對量化和演算法實驗對 DLRM 模型的影響進行深入分析。

DLRM 模型開源代碼

用戶怎樣使用模型呢?Facebook 官方在 GitHub 上開源了相關代碼。目前,DLRM 模型主要有兩個版本的實現:

  • DLRM PyTorch
  • DLRM Caffe2

通過使用 DLRM Data 相關的模塊,我們可以快速生成或載入數據,也能使用對應的腳本進行測試。此外,如果希望試試基準模型,還能查看./bench 目錄下的 DLRM 基準實現。

訓練和測試

下圖展示了如何訓練一個較小模型:

用戶還可以使用 Debug 模式訓練:

為了測試運行正常,可以使用如下的代碼:

模型的保存和載入

訓練時,模型可以使用 --save-model=保存。如果在測試時準確率提升,則模型會被保存。查看測試精確率的命令是: --test-freq intervals。

可以使用 --load-model=載入之前保存的模型。載入的模型可以繼續用於訓練,通過 checkpoint 文件保存。如果只要求用模型進行測試,則需要特別命令—inference-only。

原博客地址:ai.facebook.com/blog/dl

推薦閱讀:

相关文章