喜馬拉雅基於DeepRec構建AI平台實踐

語言: CN / TW / HK

喜馬拉雅作者:李超、陶雲、許晨昱、胡文俊、張爭光、張玉靜、趙雲鵬、張猛

快速落地大模型訓練和推理能力,帶來業務指標和後續算法優化空間的顯著提升。

業務介紹

喜馬拉雅app的主要推薦場景有:每日必聽、今日熱點、私人FM、猜你喜歡、VIP信息流、發現頁推薦等。

喜馬拉雅AI雲,是面向公司人員提供的一套從數據、特徵、模型到服務的全流程一站式算法工具平台。

其特點在於提供了數據、畫像、特徵、模型、組件、應用等多個資源管理能力,通過可視化建模界面以及算法組件化能力,支持用户通過拖拽鏈接方式生成完整的數據->特徵->樣本->模型->服務的完整工作流程。平台還支持豐富的特徵、模型參數化定製能力,使得用户不用頻繁修改代碼僅在UI界面填寫參數即完成調參、任務多場景支持等,極大的降低了用户的使用成本,提升了公司整體算法開發效率。

平台上一個常見的深度模型訓練DAG如下圖所示:

目前平台支持了喜馬拉雅多個app的推薦、廣告、搜索推薦等主流業務場景,以及畫像產出、數據分析、BI數據生成等多個定製化開發場景。

合作背景

隨着公司算法能力的迅速提升以及搜廣推業務的不斷增長,平台推薦技術棧快速從機器學習過渡到深度學習,並對樣本量級、特徵維度、模型複雜度有着不斷增長的需求。平台主要的深度技術框架是通過spark實現數據處理和parquet形式保存,通過k8s實現gpu資源調度,使用tensorflow實現模型訓練。在具體實現過程中,有2類主要的痛點:

高維稀疏特徵支持

  • hash衝突問題: 一般對高維ID的簡化操作就是hash。我們測試發現特定特徵在hash到千萬級別空間後衝突率能達到20%以上,要降低到5%以內需要擴充到五倍以上空間,失去了壓縮的意義。我們自研實現了一種多重hash方案,通過將高維id映射到3個萬級空間,相同場景下衝突率降低到0.2‰,參數量降低95%。但上線後發現也有缺陷,即對長序列id特徵列表,會擴充到原有3倍長度,顯著降低了模型的推理性能。
  • 特徵入場/退場/變長: 這些均是對高維ID特徵的基礎要求。通過合理的配置這些參數,可以實現高維稀疏大模型部署模型大小的縮減以及模型指標的穩定。使得支持十億特徵維度以上模型的訓練和部署成為可能。

模型快速迭代

  • 模型分鐘級別更新: 當前我司主要業務的模型更新一般是天級別。在特定需要高頻響應的業務中,需要提升到小時級或者分鐘級。其間隔主要受限於數據迴流、數據處理、模型訓練,以及模型上傳的總耗時。如果僅是將上述天級的流程加快(kafka數據流),最理想情況也就能做到小時級,無法做到更快迭代。同時,由於每次部署均是一個全量模型,模型增大後,線上服務加載模型時的不可用時間也會顯著增長。

綜上所述,為解決上述問題,以及為未來發展預留一定的技術可擴展空間,我們計劃採用業內主流開源技術+落地實施方案。在考察阿里的DeepRec、騰訊的TFRA/DynamicEmbedding,以及Nivida的HugeCTR框架後,我們決定採用阿里提供的開源DeepRec。

DeepRec功能落地

高維稀疏特徵

在搜索、推薦和廣告領域,特徵往往具有高維稀疏的特點,原生Tensorflow對稀疏參數支持是通過在圖中創建一個固定shape的variable,然後把稀疏特徵通過hash+mod的方式mapping到Variable中來實現的。這會帶來4個突出的問題:第一是稀疏特徵的衝突,比如不同的稀疏ID mapping到同一個行內,第二是設置shape 太大會導致內存的空洞,第三是static 的shape,當用户一旦確定該shape在後續訓練都不可以修改,在在線學習的場景中稀疏特徵量的變化也是合理的場景,第四點是低效的IO,在稀疏模型導出checkpoint的時候會全量的導出。

在DeepRec中,Embedding Variable使用動態的類似HashMap數據結構存儲稀疏參數,保證了稀疏特徵數目是可以彈性伸縮,在保證特徵不衝突的情況下,也一定程度的節約了內存資源。圍繞這個功能,Embedding Variable針對業務場景,支持了特徵的准入(特徵入場),特徵的淘汰(特徵退場),以及利用不同介質混合存儲Embedding Variable提高特徵規模,降低存儲成本等功能。

高維稀疏特徵ID支持

高維id特徵如用户id、商品id等一直是深度模型特徵的主要處理對象。模型引入這類特徵、以及其延伸的交叉特徵後,特徵維度可以輕易超出biillon級別。常見的hash解決方案往往又會陷入衝突率和模型參數的平衡問題中。通過使用DeepRec的EmbeddingVariable,以額外"EV"的op管理模型訓練中每個特徵id的更新使用情況,並輔以針對每個特徵的參數設置,可以有效的平衡高維稀疏id以及最終模型的參數量大小。同時,是否開啟"EV"也可以針對每個特徵進行配置,關閉後就是原生的tensorflow實現。用户可以針對是否高維id,自行判斷開啟或關閉該選項,使用非常靈活。以下是我們基於DeepRec高維稀疏特徵能力,在我們AI雲平台落地後的用户使用界面圖示:

特徵入場、退場

我們在實踐中選擇了基於Counter的特徵准入以及基於global step的特徵淘汰功能,經過嚴格測試,功能符合預期。在實際的使用過程中,我們的經驗是:全量特徵可以默認關閉"EV"選項,只針對高維稀疏特徵開啟;可以先開啟准入選項,設置一個比較大的值,訓練模型。然後基於EV分析工具查看具體情況做靈活調整。最終模型開始長週期滾動更新時,按照需求開啟退場選項。其中需要注意的是,入場和退場的次數設置,前者是這個id的更新頻次、後者是總訓練的step數(batchsize),有較大區別。還有就是驗證集的數據也會參與EV記錄。

未入場特徵

DeepRec對待未入場和入場後的特徵,其初始值邏輯是一樣的。即在訓練啟動時,初始化一個較小的embedding-table矩陣(類似標準的embedding初始化),上述id進入後,不做初始化而在該矩陣中查取(隨機)。未入場前,不參與梯度更新,入場後參與更新。線上serving時,統一返回默認值(0)。DeepRec支持了未入場特徵與入場特徵初始化值可靈活配置的功能。我們在實際使用中,對於上述的未入場的特徵,均統一設置初始化默認值為0,對齊了訓練和推理,也便於後續進行mask操作。對於入場後的特徵沿用之前的參數初始化方式。針對上述入場、退場,以及未入場的特徵的處理邏輯,我們做了以下示意圖幫助用户理解:

EV分析

EV分析是模型訓練調參中的一個重要工具。DeepRec提供了分析函數,我們將此做成一個功能組件供用户使用。以下是我們模型增量更新時的一個完整流程圖,模型EV分析組件可以在每次訓練結束後進行,提供特徵名稱、id值、向量、更新頻次、最近更新step等具體細節,幫助用户分析模型和樣本情況,從而進行相關參數配置,或者調整上游樣本數據:

特徵多級存儲

DeepRec的特徵多級存儲功能,主要解決訓練時模型參數量過大,pod內存無法承載的情況,這個正是我們目前碰到的主要問題。用户可以配置保存embedding參數要使用的存儲(HBM,DRAM以及SSD),之後多級存儲會基於一定的cache策略自動地選擇將高頻被訪問到的特徵保存到小容量的高速存儲中,其他特徵則放置到大容量的低速存儲。結合推薦場景中特徵訪問的傾斜性(20%的特徵訪問數佔總訪問數的80%以上),可以在訓練效率不受顯著影響的情況下有效地減少模型的內存使用量,降低模型訓練的成本。目前我們正在和阿里雲合作落地該功能。

實時訓練

DeepRec的另一個主要功能是提供了增量模型的導出功能。即僅將增量訓練的變化的參數導出成ckpt,線上僅新加載這部分文件。這樣能將模型更新所需的文件大小從上百G降低到幾KB大小。使用這個功能,可以解決模型部署上線的模型傳輸和模型加載耗時,使得線上分鐘級別的模型更新成為可能。我們重新優化了流批一體的訓練流程,完成了基於增量模型的全流程驗證。並在業務場景實現了10分鐘級別的模型迭代測試。以下是我們基於DeepRec流批一體模型訓練的流程示意圖:

線上推理

  • processor: DeepRec官網已經提供了對應的libserving_processor.so文件,也可以按照用户使用的版本自行編譯,支持模型自動識別、增量更新、SessionGroup等功能。滿足業務需要。
  • PAI-EAS: 阿里雲還提供了PAI-EAS在線推理服務。用户只需要將模型文件部署到oss上,可以直接使用其在線推理功能。該服務還提供了常見的壓測、擴縮容、線上debug、性能監控以及日誌等功能,可以滿足一站式部署需要。我們對此進行了測試,在專線開通的前提下,rt等性能指標符合上線要求。

總體收益

  • 模型訓練: 整體流程改造完畢之後,我們在單worker訓練中GPU平均利用率提升到40%以上(視具體模型),訓練環節整體耗時減少50%以上。
  • 模型上線收益: 我們目前在一個主流推薦場景中完成了全量上線。在對齊特徵和樣本情況下,在主要指標ctr、ptr等就有2%~3%+的正向收益,rt、超時率等推理指標基本持平。在引入簡單的高維id及交叉特徵後,其正向收益也有2%~3%+。其他主流業務場景模型也在逐步切換中。

未來規劃

我們對後續的一些功能也在進行探索,以便更好的支撐業務需求:

  • SessionGroup: DeepRec提供的線推理能力。在模型達到一定大小後,線上推理需要相應的內存。以實體物理機進行超大內存劃分,往往會造成對應的CPU資源無法得到重複利用。該功能即在同一pod上,模型內存共享的情況下,提供併發推理能力。使得單節點的資源利用率,以及支撐QPS上限得到顯著提升。我們已經開展對該功能的測試。
  • 模型壓縮和量化: 目前模型訓練過程以及模型導出的文件中,均包含相應的EV信息。在高維id場景中會佔用很大一部分空間。在線上推理階段可以捨棄該部分,加快模型傳輸及加載,以及降低內存使用。同時,基於DeepRec生成的模型量化裁剪,我們也在研究中。
  • 多模型推理、GPU推理等: 基於DeepRec提供的CUDA Multi-Stream和CUDA Graph的能力,可以極大的提升Inference場景下GPU的使用效率,基於GPU進行模型的推理可以進一步提升對複雜模型的推理的效率以及降低推理的成本。

感謝

感謝DeepRec社區在合作共建階段提供的技術支持,其技術精湛、服務熱情、響應快速。幫助我們快速落地大模型訓練和推理能力,帶來了業務指標和後續算法優化空間的顯著提升。特此感謝!