深度解析开源推荐算法框架EasyRec的核心概念和优势
簡介:如何通過機器學習PAI實現快速構建推薦模型
作者:程孟力 - 機器學習PAI團隊
隨著移動app的普及,個性化推薦和廣告成為很多app不可或缺的一部分。他們在改善用戶體驗和提升app的收益方面帶來了巨大的提升。深度學習在搜廣推領域的應用也已經非常深入,并且給各種場景的效果帶來了巨大的提升。針對推薦流程的各個階段,業界已經有很多的模型,這些模型大部分也有開源的實現,但是這些實現通常散落在github的各個角落,其數據處理和特征構造的方式各有差異。如果我們想要在一個新的場景里面應用這些模型,通常需要做比較多的改動:
- 輸入的改造,開源的實現的輸入格式和特征構造通常和線上不一致,適配一個算法通常需要1-2周左右的時間,還難免因為對代碼的不熟悉引入bug,如果要嘗試5個算法的話,就需要5倍的改造時間。如果算法資源有限,這時候是不是就要忍痛割愛,放棄一些可能有效果的嘗試了?
- 開源的實現很多只是在公開數據集上取得了比較好的效果,在公開數據集上的最優參數也不一定適合實際的場景,因此參數調優也需要較大的工作量;有時候效果不好,并不是因為方法不行,而是選的參數不太好。如果沒有系統化的調參方法,很多算法也就是簡單試一下,沒有deep explore,哪來對算法的深入理解呢? 為什么看似簡單的改進,你沒有能夠發現呢? 為什么你也嘗試了類似的方向,但是沒有搞出來效果呢? 效果通常都是用算力和數不盡的嘗試堆出來的;
- 開源的實現用的是tensorflow 1.4,而線上用的tensorflow 2.3,好多函數的參數都變掉了(此處心里是不是想罵google一百遍,當初信誓旦旦說好的api不再變呢); ?很多開源的實現由于沒有在實際場景中驗證過,所以其可靠性也是存疑的,可能就會少了個dropout,少了一個bn,效果相差甚遠;
- 費了九牛二虎之力把模型效果調好了,發現上線也會有很多問題,比如訓練速度太慢、內存占用太大、推理qps跟不上、離線效果好在線效果跪等等。遇到這么多問題,你還有精力去做你的下一個idea嗎?你還能斗志昂揚,堅持不懈的去探索新方向嗎?
這些問題搞得我們心有余而力不足、天天加班到深夜、不知何時是個頭:想要驗證一個簡單的idea都要使出九牛二虎之力。所謂天下武功,唯快不破,對于搜廣推領域的算法同學來說,尤其如此:通過快速迭代才能驗證更多的想法,發現更多的問題,找出最優的特征和模型結構。速度慢了的話,可能你的模型還沒調好,業務目標就變了,前端的布局也改了,你的業務方可能都不相信你了,你也就沒機會上線了。
說到這里,我們的訴求就比較明確了,我們就是想少寫代碼,甚至不寫代碼就能驗證我們的想法。針對這些問題和訴求,我們推出一個全新的、一步到位的推薦建??蚣?#xff0c;致力于幫助大家解決在推薦建模、特征構造、參數調優、部署等方面的問題,讓大家少寫代碼,少干重復的沒有意義的臟活累活(這些EasyRec都承包了),少趟一些坑少踩一些雷(這些EasyRec都替你趟了),讓大家能夠快速上線驗證新的idea,提升推薦模型的迭代效率。
優勢
和其他建??蚣芟啾?#xff0c;EasyRec在以下幾個方面具備顯著的優勢:
- 支持多平臺和多數據源訓練
- 支持的平臺包括: MaxCompute(原ODPS), DataScience(基于Kubernete), ?DLC(deep learning container), Alink, 本地;
- 支持的數據源包括: OSS, HDFS, HIVE, MaxCompute Table, Kafka, Datahub;
- 用戶通常只需要定義自己的模型,在本地測試通過后,就可以在多種分布式平臺上進行訓練;
- 支持多種Tensorflow版本(>=1.12, <=2.4, PAI-TF),能夠無縫的對接用戶的環境,不需要對代碼做遷移和改動;
- 支持主流的特征工程的實現,特別是顯示交叉特征,能夠顯著得提升效果;
- 支持HPO自動調參,顯著降低了用戶的調參工作量,并在多個場景中提升了模型效果;
- 實現了主流的深度模型,覆蓋召回、排序、粗排、重排、多目標、多興趣等;
- 支持EarlyStop, BestExport, 特征重要性,特征選擇、模型蒸餾等高級功能。
架構
EasyRec建??蚣苷w上是基于Estimator的數據并行訓練方式,通過Parameter Server的結構支持多機多卡的訓練。EasyRec的主要模塊包括輸入、特征構造、深度模型、Loss和Metric,每個模塊都可以自定義。針對用戶在用TF進行訓練可能遇到的多種問題,如worker退出失敗、使用num_epoch evaluator無法退出、auc計算不準確等,EasyRec做了深度優化。針對AdamOptimizer訓練速度慢,異步訓練慢機,hash沖突,大樣本空間負采樣等問題,EasyRec結合PAI TF(PAI優化過的tensorflow)和AliGraph也做了深度優化。
模型
EasyRec內置了業界先進的深度學習模型, 覆蓋了推薦全鏈路的需求,包括召回、粗排、排序、重排、多目標、冷啟動等。
同時EasyRec也支持用戶自定義模型。如下所示,在EasyRec里面實現自定義模型,只需要定義模型結構、Loss、Metric三個部分,數據處理和特征工程是可以直接復用框架提供的能力的,因此能夠顯著節省用戶的建模時間和成本,能夠將精力focus在模型結構的探索上。針對常見的模型類型如RankModel、MultiTaskModel等,Loss和Metric部分也可以直接復用父類的定義。
自動調參和自動特征工程
EasyRec自動調參接入了PAI automl自動調參的能力,實現了對多種參數的自動調優。EasyRec里面定義的任意參數都是可以搜索的,常見的參數包括hash_bucket_size, embedding_dim, learning_rate,dropout, batch_norm, 特征選擇等。當你對某些參數拿不準時,就可以啟動自動調參來幫助你尋找最優的設置;通過自動尋優得到的參數通常會比拍腦袋設置的參數要好,有時候還會帶來意外的驚喜。
特征工程通常是提升推薦效果的關鍵,做高階的特征組合通常有助于提升模型效果,但是高階組合的空間非常大,無腦組合會導致特征爆炸,拖累訓練和推理的速度。因此,EasyRec引入了自動特征工程(AutoFeature)的能力,自動尋找有提升的高階特征,進一步提升模型的效果。
搜索結果(top5):
模型部署
EasyRec模型可以一鍵部署到PAI EAS環境,也可以通過tf serving部署。為了提升inference性能,EasyRec引入了PAI Blade的能力做placement優化,op fusion,子圖去重等功能,通過上述優化qps提升30%以上,rt下降50%。未來還將引入FP16的功能,進一步提升inference性能,降低memory的消耗。為了支持超大規模的Embedding,EasyRec對大模型做了拆分和op替換,將Embedding存儲到Redis等分布式緩存里面,突破了內存的限制。從Redis獲取embedding會比內存慢,通過對高頻id進行cache等來降低對redis的訪問來提升embedding lookup的速度。
特征一致性
特征工程是搜廣推流程里面的關鍵部分,也通常是造成線上線下效果不一致的原因。為了能夠在快速迭代中保持離線在線的一致性,通常采用的方法是線上線下采用同一套代碼。離線訓練數據的構造流程:首先構造user feature(包含實時和離線兩部分), item feature和context_feature,然后join上訓練樣本(包含label),最后經過特征工程的jar包生成輸入EasyRec的訓練樣本。上線的流程:將user feature(離線部分)和item feature導入Redis、Hologres等分布式存儲,推薦引擎根據user_id和item_id去查詢對應的特征,調用特征工程的庫進行加工之后,送入EasyRec模型預測。在線部分的實時特征通常是使用blink、alink等支持流式計算的平臺來生成的,而離線部分的實時特征構造有兩種方式:離線模擬和在線落特征。這兩種方式各有優缺點:由于日志丟失等問題,離線模擬通常會和線上有少量的不一致;在線落特征如果要增加新的特征通常要等待比較長的時間才能攢夠樣本。我們的解決方案是在線將用戶行為的序列落下來,然后離線通過相同的jar包來加工出各種統計特征,如1h/2h/../24h的點擊次數。
在線特征工程對計算效率要求比較高,而計算量也比離線要大:離線計算的樣本通常是1個user配對m個曝光的item(召回模型的話,會增加一些隨機采樣的負樣本), 而線上計算的樣本是1個user配對n個item(n>>m)。在線計算如果采用naive的計算方式,將一次請求展開成n個樣本分別進行計算,效率通常是跟不上的。不難發現其中user feature的部分做了比較多的重復計算,對user feature做計算效率的優化,能夠顯著提升線上的qps。 我們結合淘系內部使用的Feature Generation模塊做了深度優化,包括內存分配、字符串解析、重復計算消除、多線程并行計算等,在保證一致性的前提下,顯著提高了計算的效率。
增量訓練和實時訓練
增量訓練通常能夠帶來效果的顯著提升,原因在于增量訓練見過了更多的樣本,對embeding部分訓練的更加充分。EasyRec支持從上一天的checkpoint restore,然后在新的一天的數據上繼續訓練。為了快速適應新聞、節假日、大促等場景的樣本分布發生快速變化的場景,我們提供了對實時訓練的支持。EasyRec通過Blink來構造實時樣本和特征,并調用Feature Generation對特征進行加工,然后通過Kafka、DataHub讀取實時的樣本流進行訓練。實時訓練的穩定性比較重要,我們在訓練過程中對正負樣本比、特征的分布、模型的auc等做實時的監控,當樣本和特征的分布變化超過閾值時,報警并停止更新模型。保存checkpoint時,EasyRec會同步記錄當前訓練的offsets(多個worker一起訓練時,會有多個offset),當系統發生故障重啟時,會從保存的offsets恢復訓練。
效果驗證
EasyRec在多個用戶場景(20+)中得到了驗證,場景中包括商品推薦、信息流廣告、社交媒體、直播、視頻推薦等。以下是部分客戶在他們場景中使用EasyRec取得的提升:
- 某APP廣告推送: AUC提升1個點,線上ctr提升4%,資源消耗降低一半;
- 某大型直播APP: 基于EasyRec MultiTower模型AUC提升2%;
- 某大型社交媒體: 基于EasyRec MultiTower模型AUC提升6%,線上效果提升50%;
- 某大型電商平臺:基于Easyrec DSSM模型,線上UV價值提升11%, UVCTR提升4%;
- 某短視頻APP:基于EasyRec DBMTL模型,線上時長提升30%,+多模態特征進一步提升10%。
最后,EasyRec已經通過github開源(https://github.com/alibaba/EasyRec),在此歡迎各位同路人共建,包括:豐富各個場景的特征構造,引入更多在實際場景中驗證過的模型,提升模型離線在線推理的性能,等等。在這個日益內卷的行業(可以想象tensorflow為什么越做越差,跟內卷應該關系非常大,api的修改比較隨意、存在過度設計擴展困難的問題、bug層出不窮,天下苦TF久矣),我們希望能夠通過這樣一個開源的工作,形成大家的合力,照亮我們共同的路。在這里,我們也像前輩xgboost致敬,希望這個工作能夠像xgboost一樣發揚光大,影響深遠。
原文鏈接
本文為阿里云原創內容,未經允許不得轉載。?
總結
以上是生活随笔為你收集整理的深度解析开源推荐算法框架EasyRec的核心概念和优势的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lakehouse 架构解析与云上实践
- 下一篇: 2021云栖大会开源引力峰会发布的战略合