DLRM 模型使用 Facebook 的開源框架 PyTorch 和 Caffe2 實(shí)現(xiàn)。DLRM 通過(guò)結(jié)合協(xié)同過(guò)濾和基于預(yù)測(cè)分析方法的原理,,相比于其他模型有所提升,,從而使其能夠有效地處理生產(chǎn)規(guī)模的數(shù)據(jù),并得到目前最佳結(jié)果,。 Facebook 開源該模型并且公布相關(guān)論文,,旨在幫助該領(lǐng)域的研究人員解決這類模型所面臨的獨(dú)特挑戰(zhàn)。Facebook 希望鼓勵(lì)進(jìn)一步的算法實(shí)驗(yàn),、建模,、系統(tǒng)協(xié)同設(shè)計(jì)和基準(zhǔn)測(cè)試。這有助于發(fā)掘新的模型和更高效的系統(tǒng),,從而為使用各種數(shù)字服務(wù)的人們提供更具相關(guān)性的內(nèi)容,。 了解 DLRM 模型 DLRM 模型使用嵌入表示處理類別特征,而使用底部的多層感知器(MLP)處理連續(xù)特征,。然后計(jì)算不同特征的二階交互作用(second-order interaction),。最后,,使用頂部的 MLP 對(duì)結(jié)果進(jìn)行處理,并輸入到 sigmoid 函數(shù)中,,得到某次點(diǎn)擊的概率,。 圖 1 DLRM 模型處理描述用戶和產(chǎn)品的連續(xù)(密集)特征和類別(稀疏)特征,如圖所示,。該模型使用了各類硬件和軟件組件,,如內(nèi)存容量和帶寬,以及通信和計(jì)算資源,。 基準(zhǔn)與系統(tǒng)協(xié)同設(shè)計(jì) DLRM 的開源實(shí)現(xiàn)可以用作基準(zhǔn),,衡量以下各項(xiàng)指標(biāo):
這可以在不同的硬件平臺(tái)上完成,,如 BigBasin 人工智能平臺(tái)。 DLRM 基準(zhǔn)提供了兩個(gè)版本的代碼,,分別使用 PyTorch 和 Caffe2,。此外,還有另一個(gè) 使用 Glow C 算子實(shí)現(xiàn)的版本,。(為了適應(yīng)每個(gè)框架的具體情況,,各框架的代碼略有不同,但總體結(jié)構(gòu)是相似的,。)這些實(shí)現(xiàn)允許我們將 Caffe2 框架與 PyTorch 框架,,以及當(dāng)前專注于加速器的 Glow 進(jìn)行對(duì)比。也許我們可以提取每個(gè)框架中的最佳特征,,未來(lái)將其整合到一個(gè)框架中,。 DLRM 基準(zhǔn)支持生成隨機(jī)輸入和合成輸入。同時(shí)支持模型自定義生成與類別特征對(duì)應(yīng)的索引,,這有許多原因:例如,如果某個(gè)應(yīng)用程序使用了一個(gè)特定的數(shù)據(jù)集,,但出于隱私考慮我們不能共享數(shù)據(jù),,那么我們可以選擇通過(guò)分布表示類別特征。另外,,如果我們想利用系統(tǒng)組件,,如研究記憶行為,我們可能需要捕捉合成軌跡(synthetic trace)內(nèi)原始軌跡的基本位置,。 此外,,F(xiàn)acebook 根據(jù)用戶場(chǎng)景的不同,使用了多種個(gè)性化的推薦模型,。例如,,為了在一定規(guī)模上實(shí)現(xiàn)高性能服務(wù),,可以在單個(gè)機(jī)器上對(duì)輸入進(jìn)行批處理并分配多個(gè)模型,從而并行執(zhí)行推理過(guò)程,。此外,,F(xiàn)acebook 數(shù)據(jù)中心的大量服務(wù)器具有架構(gòu)異構(gòu)性,從不同的 SIMD 寬度到不同的緩存結(jié)構(gòu)的實(shí)現(xiàn),。架構(gòu)異質(zhì)性為軟硬件協(xié)同設(shè)計(jì)和優(yōu)化提供了額外機(jī)會(huì),。(參見(jiàn)論文:《The Architectural Implications of Facebook's DNN-based Personalized Recommendation》 該文對(duì) Facebook 神經(jīng)推薦系統(tǒng)的體系結(jié)構(gòu)進(jìn)行了深入分析。) 并行計(jì)算 如圖 1 所示,,DLRM 基準(zhǔn)由計(jì)算主導(dǎo)的 MLP 和內(nèi)存容量有限的嵌入組成,。因此,它自然需要依靠數(shù)據(jù)并行性來(lái)提升 MLP 的性能,,并且依賴模型并行化來(lái)滿足內(nèi)嵌對(duì)內(nèi)存容量的需求,。DLRM 基準(zhǔn)測(cè)試提供了一個(gè)遵循此方法的并行實(shí)現(xiàn)。在交互過(guò)程中,,DLRM 需要一個(gè)高效的全通信原語(yǔ),,我們稱之為蝴蝶式洗牌(butterfly shuffle)。它將每個(gè)設(shè)備上 minibatch 的嵌入查找結(jié)果重新洗牌,,分配到所有設(shè)備上,,成為 minibatch 嵌入查找的一部分。如下圖所示,,每種顏色表示 minibatch 的不同元素,,每個(gè)數(shù)字表示設(shè)備及其分配的嵌入。我們計(jì)劃優(yōu)化系統(tǒng),,并在以后的博客中公布性能研究細(xì)節(jié),。 圖 3 DLRM butterfly shuffle 示意圖 建模與算法實(shí)驗(yàn) DLRM 基準(zhǔn)測(cè)試使用 Python 編寫,支持靈活實(shí)現(xiàn),,模型結(jié)構(gòu),、數(shù)據(jù)集和其他參數(shù)由命令行定義。DLRM 可用于推理和訓(xùn)練,。在訓(xùn)練階段,,DLRM 將反向傳播算子添加到計(jì)算圖中,允許參數(shù)更新,。 該代碼是完整的,,可以使用公開數(shù)據(jù)集,包括 Kaggle display advertising challenge 數(shù)據(jù)集,。該數(shù)據(jù)集包含 13 種連續(xù)特征和 26 種類別特征,,這些特征定義了 MLP 輸入層的大小以及模型中使用的嵌入數(shù)量,而其他參數(shù)可以通過(guò)命令行定義,。例如,,根據(jù)如下命令行運(yùn)行 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 訓(xùn)練結(jié)果如下圖所示 : 圖 4 左圖展示了在訓(xùn)練階段和測(cè)試階段的二值交叉熵?fù)p失,,右圖為訓(xùn)練階段和測(cè)試階段準(zhǔn)確率 DLRM 模型可以在真實(shí)數(shù)據(jù)集上運(yùn)行,可以幫助我們測(cè)量模型的準(zhǔn)確率,,這對(duì)于使用不同的數(shù)值技術(shù)和其他模型進(jìn)行試驗(yàn)時(shí)尤其有用,。我們計(jì)劃在接下來(lái)的工作中對(duì)量化和算法實(shí)驗(yàn)對(duì)該模型的影響進(jìn)行更深入的分析。 從長(zhǎng)遠(yuǎn)來(lái)看,,開發(fā)新的,、更好的方法,將深度學(xué)習(xí)用于推薦和個(gè)性化工具(并提高模型的效率和性能),,能夠帶來(lái)將人們與相關(guān)的內(nèi)容聯(lián)系起來(lái)的新方法,。 DLRM 模型開源代碼 DLRM 模型輸入由稠密特征和稀疏特征組成。稠密特征為浮點(diǎn)數(shù)矢量,,稀疏特征為嵌入表的稀疏索引,。選擇的矢量傳入 MLP 網(wǎng)絡(luò)(圖中三角形),某些情況下矢量通過(guò)算子進(jìn)行交互,。 DLRM 實(shí)現(xiàn) DLRM 模型有兩個(gè)實(shí)現(xiàn)版本:
DLRM 數(shù)據(jù)生成和加載: dlrm_data_pytorch.py, dlrm_data_caffe2.py, data_utils.py DLRM 測(cè)試命令(./test 路徑下): dlrm_s_test.sh DLRM 基準(zhǔn)模型(./bench 路徑下): dlrm_s_benchmark.sh, dlrm_s_criteo_kaggle.sh訓(xùn)練 訓(xùn)練一個(gè)較小模型:
使用 Debug 模式訓(xùn)練: 測(cè)試測(cè)試代碼是否正常運(yùn)行: 基準(zhǔn)模型表現(xiàn)基準(zhǔn) ./bench/dlrm_s_benchmark.sh 該模型支持 Kaggle 展示廣告挑戰(zhàn)數(shù)據(jù)集,,數(shù)據(jù)集需完成如下準(zhǔn)備工作: 指定原始數(shù)據(jù)文件:--raw-data-file=<path/train.txt> 預(yù)處理 處理數(shù)據(jù)存儲(chǔ)在.npz 文件,路徑為<root_dir>/input/kaggle_data/ .npz 可以用處理文件運(yùn)行:--processed-data-file=<path/ .npz> ./bench/dlrm_s_criteo_kaggle.sh模型保存與加載 訓(xùn)練過(guò)程中模型保存:--save-model=<path/model.pt>,。如果測(cè)試準(zhǔn)確率有所提升,,則保存模型。保存的模型可以通過(guò) --load-model=<path/model.pt>加載,。模型加載后可以用于繼續(xù)訓(xùn)練,,也可以用于在測(cè)試數(shù)據(jù)集上測(cè)試,需要指定 --inference-only,。 |
|