NVIDIA 助力 DeepRec 為 vivo 推薦業(yè)務(wù)實(shí)現(xiàn)高性能 GPU 推理優(yōu)化

2023-01-17 16:42:48來源:中關(guān)村在線  

簡(jiǎn)介

本案例中,vivo 人工智能推薦算法組自研的推薦服務(wù)平臺(tái),使用阿里巴巴開源大規(guī)模稀疏模型訓(xùn)練和預(yù)測(cè)引擎 DeepRec,在稀疏模型訓(xùn)練(稀疏功能、I/O優(yōu)化)和高性能推理框架層面,實(shí)現(xiàn)其搜廣推各類業(yè)務(wù)場(chǎng)景下,算法開發(fā)和上線的全鏈路優(yōu)化。


【資料圖】

其中,在 GPU 線上推理服務(wù)優(yōu)化上,vivo 使用 DeepRec 提供的 Device Placement Optimization,以及 NVIDIA CUDA multi-stream,MPS (Multi-Process Service) / Multi-context 和 NVIDIA GPU 計(jì)算專家團(tuán)隊(duì)在multi-stream 基礎(chǔ)上開發(fā)的 MergeStream 功能,顯著提升了線上推理服務(wù)的 GPU 有效利用率。

客戶簡(jiǎn)介及應(yīng)用背景

vivo 人工智能推薦算法組的業(yè)務(wù)包含了信息流、視頻、音樂、廣告等搜索/廣告/推薦各類業(yè)務(wù),基本涵蓋了搜廣推各類型的業(yè)務(wù)。

為了支撐上述場(chǎng)景的算法開發(fā)上線,vivo 自研了集特征數(shù)據(jù)、模型開發(fā)、模型推理等流程于一體的推薦服務(wù)平臺(tái)。通過成熟、規(guī)范的推薦組件及服務(wù),該平臺(tái)為 vivo 內(nèi)各推薦業(yè)務(wù)(廣告、信息流等)提供一站式的推薦解決方案,便于業(yè)務(wù)快速構(gòu)建推薦服務(wù)及算法策略高效迭代。

圖片來源于 vivo

vivo人工智能推薦算法組在深耕業(yè)務(wù)同時(shí),在積極探索適用于搜索/廣告/推薦大規(guī)模性稀疏性算法訓(xùn)練框架。分別探索了TensorNet/XDL/TFRA等框架及組件,這些框架組件在分布式、稀疏性功能上做了擴(kuò)展,能夠彌補(bǔ) TensorFlow 在搜索/廣告/推薦大規(guī)模性稀疏性場(chǎng)景不足,但是在通用性、易用性以及功能特點(diǎn)上,這些框架存在各種不足。

作為 DeepRec 最早的一批社區(qū)用戶,vivo 在 DeepRec 還是內(nèi)部項(xiàng)目時(shí),就與 DeepRec 開發(fā)者保持密切的合作。經(jīng)過一年積累與打磨,vivo 見證了 DeepRec 從內(nèi)部項(xiàng)目到開源再到后續(xù)多個(gè) release 版本的發(fā)布。在合作中,DeepRec 賦能 vivo 各個(gè)業(yè)務(wù)增長(zhǎng),vivo 也作為 DeepRec 深度用戶,將業(yè)務(wù)中的需求以及使用中的問題積極回饋到 DeepRec 開源社區(qū)。

DeepRec (https://github.com/alibaba/DeepRec) 是阿里巴巴集團(tuán)提供的針對(duì)搜索、推薦、廣告場(chǎng)景模型的訓(xùn)練/預(yù)測(cè)引擎,在分布式、圖優(yōu)化、算子、Runtime 等方面對(duì)稀疏模型進(jìn)行了深度性能優(yōu)化,提供了豐富的高維稀疏特征功能的支持。基于 DeepRec 進(jìn)行模型迭代不僅能帶來更好的業(yè)務(wù)效果,同時(shí)在Training/Inference 性能有明顯的性能提升。

圖片來源于阿里巴巴

通過業(yè)務(wù)實(shí)踐,在稀疏模型訓(xùn)練層面,vivo 使用 DeepRec 提供的基于 Embedding Variable (官方文檔鏈接) 的動(dòng)態(tài) Embedding 功能和特征準(zhǔn)入 (官方文檔鏈接)/淘汰功能(官方文檔鏈接),解決了使用 TensorFlow 原生 Embedding Layer 的三個(gè)痛點(diǎn),包括可拓展性差,hash 沖突導(dǎo)致模型訓(xùn)練有損,無法處理冗余的稀疏特征;并在內(nèi)部嘗試對(duì)訓(xùn)練數(shù)據(jù)存儲(chǔ)格式做 I/O 優(yōu)化。

圖片來源于阿里巴巴

使用動(dòng)態(tài) Embedding 和特征準(zhǔn)入/淘汰功能實(shí)現(xiàn)的收益如下:

1.靜態(tài) Embedding 升級(jí)到動(dòng)態(tài) Embedding:使用 DeepRec 的動(dòng)態(tài) Embedding 替換 TensorFlow 的靜態(tài) Embedding 后,保證所有特征 Embedding 無沖突,離線 AUC 提升 0.5%,線上點(diǎn)擊率提升 1.2%,同時(shí)模型體積縮小 20%。

2. ID 特征的利用:在使用 TensorFlow 時(shí),vivo 嘗試過對(duì) ID 特征進(jìn)行 hash 處理輸入模型,實(shí)驗(yàn)表明這種操作對(duì)比基線具有負(fù)收益。這是由于 ID 特征過于稀疏,同時(shí) ID 具有唯一指示性,hash 處理會(huì)帶來大量的 Embedding 沖突?;趧?dòng)態(tài) Embedding,使用 ID 特征離線 AUC 提升0.4%,線上點(diǎn)擊率提升 0.6%。同時(shí)配合 global step 特征淘汰,離線 AUC 提升 0.1%,線上點(diǎn)擊率提升 0.5%。

Embedding Variable 流程示意圖,圖片來源于阿里巴巴

在 I/O 優(yōu)化上,目前 vivo 內(nèi)部使用的是 TFRecord 數(shù)據(jù)格式存儲(chǔ)訓(xùn)練數(shù)據(jù),存在占用存儲(chǔ)空間大,非明文存儲(chǔ)的兩個(gè)缺陷。而 DeepRec 的 Parquet 是一種列式存儲(chǔ)的數(shù)據(jù)格式,能夠節(jié)省存儲(chǔ)資源,加快數(shù)據(jù)讀取速度。使用 Parquet Dataset 支持讀取 Parquet 文件,開箱即用,無需額外安裝第三庫(kù),使用簡(jiǎn)單方便。同時(shí),Parquet Dataset 能夠加快數(shù)據(jù)讀取速度,提高模型訓(xùn)練的 I/O 性能。

vivo 內(nèi)部嘗試使用 Parquet Dataset 來替換現(xiàn)有 TFRecord,提高訓(xùn)練速度 30%,減少樣本存儲(chǔ)成本 38%,降低帶寬成本。同時(shí),vivo 內(nèi)部支持 hive 查詢 Parquet 文件,算法工程師能夠高效快捷地分析樣本數(shù)據(jù)。

在高性能推理框架層面,由于在業(yè)務(wù)逐漸發(fā)展過程中,廣告召回量增長(zhǎng) 3.5 倍,同時(shí)目標(biāo)預(yù)估數(shù)增加兩倍,推理計(jì)算復(fù)雜度增加,超時(shí)率超過 5%,嚴(yán)重影響線上服務(wù)可用性以及業(yè)務(wù)指標(biāo)。因此,vivo 嘗試探索升級(jí)改造現(xiàn)有推理服務(wù),保證業(yè)務(wù)可持續(xù)發(fā)展。vivo 借助 DeepRec 開源的諸多推理優(yōu)化功能,在CPU 推理改造以及 GPU 推理升級(jí)方面進(jìn)行探索,并取得一定收益。

客戶挑戰(zhàn)

在 CPU 推理優(yōu)化層面,vivo 在使用 DeepRec 提供的基于 ShareNothing 架構(gòu)的 SessionGroup 后,明顯緩解了直接使用 TensorFlow 的 C++ 接口調(diào)用 Session::Run 而導(dǎo)致的 CPU 使用率低的問題,在保證 latency 的前提下極大提高了 QPS,單機(jī) QPS 提升高達(dá) 80%,單機(jī) CPU 利用率提升 75%。

但是經(jīng)過 SessionGroup 的優(yōu)化,雖然 CPU 推理性能得到改善,超時(shí)率依舊無法得到緩解。鑒于多目標(biāo)模型目標(biāo)塔數(shù)較多、模型中使用 Attention、LayerNorm、GateNet 等復(fù)雜結(jié)構(gòu)、特征多,存在大量稀疏特征三點(diǎn)原因,vivo 嘗試探索 GPU 推理來優(yōu)化線上性能。

應(yīng)用方案

Device Placement Optimization

通常,對(duì)于稀疏特征的處理一般是將其 Embedding 化,由于模型中存在大量的稀疏特征,因此 vivo 的廣告模型使用大量的 Embedding 算子。從推理的 timeline 可以看出,Embedding 算子分散在 timeline 的各個(gè)階段,導(dǎo)致大量的 GPU kernel launch 以及數(shù)據(jù)拷貝,因此圖計(jì)算非常耗時(shí)。

圖片來源于阿里巴巴

Device Placement Optimization 完全將 Embedding Layer placed 到 CPU 上,解決了Embedding layer 內(nèi)部存在的 CPU 和 GPU 之間大量數(shù)據(jù)拷貝的問題。

圖片來源于阿里巴巴

Device Placement Optimization性能優(yōu)化明顯,CPU 算子(主要是Embedding Layer)的計(jì)算集中在 timeline 的最開端,之后 GPU 主要負(fù)責(zé)網(wǎng)絡(luò)層的計(jì)算。相較于 CPU 推理,Device Placement Optimization P99 降低 35%。

NVIDIA CUDA Multi-Stream 功能

在推理過程中,vivo 發(fā)現(xiàn)單流執(zhí)行導(dǎo)致 GPU 的利用率不高,無法充分挖掘 GPU 算力。DeepRec 支持用戶使用 multi-stream 功能,多 stream 并發(fā)計(jì)算,提升 GPU 利用率。多線程并發(fā) launch kernel 時(shí),存在較大的鎖開銷,極大影響了 kernel launch 的效率,這里的鎖與 CUDA Driver 中 的Context 相關(guān)。因此可以通過使用 MPS/Multi-context 來避免 launch 過程中鎖開銷,從而進(jìn)一步提升 GPU 的有效利用率。

圖片來源于阿里巴巴

此外,模型中存在大量的 H2D 以及 D2H 的數(shù)據(jù)拷貝,在原生代碼中,計(jì)算 stream 和拷貝 stream 是獨(dú)立的,這會(huì)導(dǎo)致 stream 之間存在大量同步開銷,同時(shí)對(duì)于在 Recv 算子之后的計(jì)算算子,必須等到MemCopy 完成之后才能被 launch 執(zhí)行,MemCopy 和 launch 難以 overlap 執(zhí)行。基于以上問題,NVIDIA GPU 計(jì)算專家團(tuán)隊(duì)在 multi-stream 功能基礎(chǔ)上進(jìn)一步優(yōu)化,開發(fā)了 MergeStream 功能,允許 MemCopy 和計(jì)算使用相同的 stream,從而減少上述的同步開銷以及允許 Recv 之后計(jì)算算子 launch 開銷被 overlap。

圖片來源于阿里巴巴

vivo 在線上推理服務(wù)中使用了 multi-stream 功能,P99 降低 18%。更進(jìn)一步地,在使用 MergeStream 功能后,P99 降低 11%。

編譯優(yōu)化-BladeDISC

BladeDISC(https://github.com/alibaba/BladeDISC)是阿里集團(tuán)自主研發(fā)的、原生支持存在動(dòng)態(tài)尺寸模型的深度學(xué)習(xí)編譯器。DeepRec中 集成了 BladeDISC,通過使用 BladeDISC 內(nèi)置的 aStitch 大尺度算子融合技術(shù)對(duì)于存在較多訪存密集型算子的模型有顯著的效果。利用 BladeDISC 對(duì)模型進(jìn)行編譯優(yōu)化,推理性能得到大幅度提升。

BladeDISC 將大量訪存密集型算子編譯成一個(gè)大的融合算子,可以大大減少框架調(diào)度和 kernel launch的開銷。區(qū)別于其他深度學(xué)習(xí)編譯器的是,BladeDISC 還會(huì)通過優(yōu)化 GPU 不同層次存儲(chǔ)(特別是 SharedMemory)的使用來提升了訪存操作和 Op 間數(shù)據(jù)交換的性能。圖中可以看到,綠色是 Blade DISC優(yōu)化合并的算子替代了原圖中大量的算子。

圖片來源于阿里巴巴

圖片來源于阿里巴巴

另外,由于線上模型比較復(fù)雜,為了進(jìn)一步減少編譯耗時(shí)、提升部署效率,vivo 啟用了 BladeDISC 的編譯緩存功能。開啟此功能時(shí),BladeDISC 僅會(huì)在新舊版本模型的 Graph 結(jié)構(gòu)發(fā)生改變時(shí)觸發(fā)編譯,如果新舊模型僅有權(quán)重變更則復(fù)用之前的編譯結(jié)果。經(jīng)過驗(yàn)證,編譯緩存在保證正確性的同時(shí),幾乎掩蓋了編譯模型的開銷,模型更新速度與之前幾乎相同。在使用 BladeDISC 功能后,線上服務(wù) P99 降低 21%。

使用效果及影響

DeepRec 提供大量的解決方案可以幫助用戶快速實(shí)施 GPU 推理。經(jīng)過一系列優(yōu)化,相較于 CPU 推理,GPU 推理 P99 降低 50%,GPU 利用率平均在 60% 以上。此外,線上一張 NVIDIA T4 Tensor Core GPU 的推理性能超過兩臺(tái) Xeon 6330 112Core 的 CPU 機(jī)器,節(jié)省了大量的機(jī)器資源。

基于 CPU 的分布式異步訓(xùn)練存在兩個(gè)問題:一是異步訓(xùn)練會(huì)損失訓(xùn)練精度,模型難以收斂到最佳;二是隨著模型結(jié)構(gòu)逐漸復(fù)雜,訓(xùn)練性能會(huì)急劇下降。未來,vivo 打算嘗試基于 GPU 的同步訓(xùn)練來加速?gòu)?fù)雜模型訓(xùn)練。DeepRec 支持兩種 GPU 同步框架:NVIDIA Merlin Sparse Operation Kit (SOK) 和HybridBackend。后續(xù) vivo 將嘗試這兩種 GPU 同步訓(xùn)練來加速模型訓(xùn)練。

NVIDIA 計(jì)算專家團(tuán)隊(duì)也與 DeepRec 技術(shù)團(tuán)隊(duì)深入合作,為在稀疏功能層面的 Embedding Variable GPU 支持、在同步訓(xùn)練層面的 Merlin SOK 集成,以及圖優(yōu)化層面的 Embedding 子圖 Fusion 功能開發(fā)提供技術(shù)支持。

Embedding Variable GPU 支持介紹(官方文檔鏈接)

DeepRec 設(shè)計(jì)并提供了一套支持動(dòng)態(tài) Embedding 語(yǔ)義的 Embedding Variable,在特征無損訓(xùn)練的同時(shí)以最經(jīng)濟(jì)的方式使用內(nèi)存資源,使得超大規(guī)模特征的模型更容易增量上線。進(jìn)一步地,因?yàn)?GPU 具有強(qiáng)大的并行計(jì)算能力,對(duì)于 Embedding Variable 底層的 Hash Table 查找、插入等操作也具有明顯的加速作用。同時(shí),對(duì)于模型計(jì)算部分若使用 GPU,則使用 GPU 上的 Embedding Variable 也可避免 Host 和Device 上的數(shù)據(jù)拷貝,提高整體性能。因此增加了 Embedding Variable 的 GPU 支持。

GPU 版本的 Embedding Variable 通過 NVIDIA cuCollection 作為底層 Hash Table 的實(shí)現(xiàn),可以明顯加速 Embedding 相關(guān)的操作,而且使用方便,在具有 NVIDIA GPU 的環(huán)境中會(huì)自動(dòng)啟用,也可以手動(dòng)放置在合適的 GPU 設(shè)備上。性能測(cè)試顯示 GPU 版本相比于 CPU 版本,Embedding 部分會(huì)有 2倍 以上的加速。

分布式訓(xùn)練集成 Merlin SOK介紹(官方文檔鏈接)

DeepMerlin SOK 是 NVIDIA Merlin 團(tuán)隊(duì)基于 Merlin SOK 提供的針對(duì)神經(jīng)網(wǎng)絡(luò)中稀疏操作的加速插件庫(kù),使用 DeepMerlin SOK 可對(duì) DeepRec 中相關(guān)的 Embedding 操作進(jìn)行加速和分布式訓(xùn)練的支持。

該 SOK 的設(shè)計(jì)理念就是希望同時(shí)兼容靈活性和高性能。在靈活性方面,使用 SOK 不會(huì)對(duì)用戶使用 DeepRec 本身的功能有影響,可以和 DeepRec 提供的 Embedding Variable 完全兼容,也會(huì)集成到 DeepRec 的高級(jí)接口方便用戶的使用。在高性能方面,SOK 主要從兩方面去考慮,一方面,在算法設(shè)計(jì)上,通過 reduce 操作來減少搬運(yùn)的數(shù)據(jù)量,另一方面,在實(shí)現(xiàn)上,主要通過算子融合技術(shù),融合多表的查詢和通信,提供稀疏操作的性能。性能測(cè)試顯示 SOK 能夠提供接近于線性的擴(kuò)展能力,在 8 GPU 下相比 1 GPU 能夠達(dá)到 6.5 倍的加速效果。

Embedding 子圖 Fusion功能介紹(官方文檔鏈接)

DeepRec 及 TensorFlow 原生的 embedding lookup 相關(guān) API,如 safe_embedding_lookup_sparse,會(huì)創(chuàng)建比較多細(xì)碎的算子,且部分算子只有 CPU 實(shí)現(xiàn)。因此在 GPU 上執(zhí)行時(shí)容易出現(xiàn) kernel launch bound 的問題以及額外H2D & D2H 拷貝,造成低 GPU 利用率,降低執(zhí)行速度。

針對(duì)此場(chǎng)景,NVIDIA 計(jì)算專家團(tuán)隊(duì)與 DeepRec 合作,共同定制開發(fā)了支持在 NVIDIA GPU 上執(zhí)行的 Embedding 子圖 Fusion 功能,并對(duì) GPU 高算力高吞吐的特點(diǎn)進(jìn)行了針對(duì)性優(yōu)化:提供一組接口以及相關(guān) Fusion 算子,通過算子融合,減少需要 launch 的 kernel 數(shù)量,優(yōu)化訪存,提供高性能的實(shí)現(xiàn),達(dá)到加速執(zhí)行的目的。

Embedding Fusion 功能易用,從 Python 層面提供接口及開關(guān),用戶無需修改代碼即可快速使用。加速效果方面,單獨(dú)從 Embedding 模塊看,GPU Embedding Fusion 可以提供 2 倍左右的加速。從整體模型來看,加速效果取決于 Embedding 模塊的耗時(shí)占比。在幾個(gè)測(cè)試模型上,此功能可以提供 1.2 倍左右的整體性能加速。

標(biāo)簽: 新聞資訊

相關(guān)閱讀

精彩推薦

相關(guān)詞

推薦閱讀