推薦系統在電商、短視頻、新聞、廣告等行業都有著廣泛的應用。推薦系統能夠比較準確理解終端用戶的興趣,提升終端用戶的瀏覽體驗。典型的工業界推薦系統一般采用多階段漏斗的方式,通常包括召回、粗排、精排、重排等階段,每個階段要處理的商品數量是依次遞減的,而對應的模型的參數量和計算復雜度通常是依次遞增的。隨著深度學習的發展,現在主流的推薦系統都是用深度學習模型來預估用戶對于不同商品的偏好。深度學習大幅度提升了模型預估的準確度,并且能夠支持多任務多場景的聯合建模。但隨之帶來的問題是模型參數量和計算復雜度的大幅度增加,這給模型訓練和在線推理服務都帶來了巨大的挑戰。為了提升模型的準確度,推薦模型通常需要在千億規模的樣本和特征上進行訓練。即便采用分布式訓練,訓練一個推薦排序模型也要持續數天的時間。這給算法工程師探索和優化模型結構帶來了巨大的壓力。在線推理服務通常需要在有限的時間內返回結果(< 500ms),而現代推薦模型的巨大參數量和復雜的模型結構需要的計算量通常難以滿足這樣要求。
為了解決這些挑戰,幫助用戶更好的落地深度學習推薦算法,阿里云PAI團隊研發了PAI-REC全鏈路解決方案,幫助用戶以白盒化的方式快速構建推薦全鏈路的方案。如圖1所示,PAI-REC平臺包含了推薦全鏈路所需要的功能: 特征構建,模型訓練,在線服務等。其中兩個關鍵的功能是模型訓練和模型推理,分別由EasyRec推薦算法框架和EasyRec Processor提供。 EasyRec推薦算法框架幫助用戶快速訓練推薦模型,其中提供了業界廣泛使用的推薦算法模型,如DeepFM, DIN, DBMTL等,并支持通過組件化和自定義模型的方式快速構建新的模型結構,進一步還支持通過PAI-NNI-HPO做超參搜索。EasyRec算法框架的相關代碼已經在github上開源。
圖1. PAI-REC推薦算法定制開發平臺
PAI-REC在線推理鏈路如圖2所示,其中EasyRec Processor負責模型推理環節。EasyRec Processor包含ItemFeatureCache, Feature Generator(特征交叉)和TF Model Serving三個部分,并能夠從Kafka/OSS獲取模型的增量更新,從FeatureStore獲取特征的實時更新。
圖2. PAI-REC在線推理鏈路
為了提升推薦模型訓練和在線推理的效率,我們聯合intel相關團隊結合硬件的特性做了深入的優化,提升了模型訓練的速度,同時提升了模型推理的QPS(每秒處理的請求次數),降低了模型推理的RT(響應時間),CPU的利用率也大幅度提升[20%->60%]。下面介紹一下EasyRec里面用到的一些優化方法。
AMX矩陣乘法優化
深度學習推薦模型里面通常會用到MLP和Attention等一般涉及到比較多的矩陣乘法計算,屬于計算密集型,不僅影響算子內部的計算效率,也影響了算子調度的效率。OneDNN和MKL針對矩陣運算做了深度優化,提升了矩陣乘法的計算能力,但仍然受限于硬件的計算能力。為了進一步提升矩陣乘法的計算效率,可以選擇使用英特爾® 第四代至強® 可擴展處理器Sapphire Rapids(SPR)來處理推薦系統的訓練和推理。該處理器通過創新架構增加了每個時鐘周期的指令,支持 8 通道 DDR5 內存,有效提升了內存帶寬與速度,并通過PCIe 5.0實現了更高的 PCIe 帶寬提升。該處理器不僅經過了一系列微架構的革新和技術規格的提升,還搭載了全新的AI加速引擎——英特爾®高級矩陣擴展(AMX)。
英特爾® AMX 技術與上一代深度學習加速技術——向量神經網絡指令 VNNI及BF16相比,從一維向量演變為二維矩陣,因此能夠充分利用計算資源,提高高速緩存的利用率,并且避免潛在的帶寬瓶頸。這種改進顯著提高了人工智能應用程序每個時鐘周期的指令數,為AI工作負載中的訓練和推理提供了顯著的性能提升。
(a)AMX架構圖 (b)單核單周期運算次數比較
圖3.AMX架構和性能
圖3a展示了英特爾® AMX的架構,其中包括了兩個主要組成部分:(1)Tiles: 由八個二維寄存器組成(命名為 tmm0, tmm1, …, tmm7),每個寄存器的最大尺寸為16行,每行有512位,尺寸為1KiB。整個Tiles的大小為8KiB。
(2)TMUL: 它是與 Tile連接的加速引擎,可用于矩陣乘法計算執行。
AMX 支持INT8 和 BF16數據類型,用于 AI 工作負載中的矩陣乘法運算。如圖3b所示,第四代英特爾® 至強® 可擴展處理器可在單位計算周期內可執行 1024 次 BF16 運算,與第三代英特爾® 至強® 可擴展處理器執行 FP32 運算的次數64 次相比,有16倍的性能提升。
混合精度運算
BFloat16浮點格式是一種計算機內存中占用16位的計算機數字格式。該格式是32位IEEE 754單精度浮點格式(float32)的截斷(16位)版本。它保留了32位浮點數的近似動態范圍。BFloat16用于降低存儲需求,提高機器學習算法的計算速度。BFloat16是用于機器學習的自定義16位浮點格式,采用與IEEE 754標準相似的布局,但對于指數和尾數字段進行了修改,由一個符號位、八個指數位和七個尾數位組成。相比之下,IEEE 754標準的半精度浮點數(Float16)使用1位符號位,5位指數和10位尾數。IEEE 754標準的單精度浮點數(Float32)使用1位符號位,8位指數和23位尾數,因此BFloat16具有和Float32等效的動態范圍。
BFloat16相比Float16的主要優勢在于其更大的動態范圍。由于具有更多的位數用于指數部分,BFloat16可以表示更大的數值范圍和更小的數值間隔。這使得它在深度學習中具有一定的優勢,因為在訓練深度神經網絡時,經常需要處理廣泛的數值范圍。另一個優勢在于能夠更快的與Float32進行相互轉換,轉換時只需要對最后16位進行填充或者移除即可實現快速轉換。
圖4. BFloat16 浮點格式介紹
在該優化方案中,在Embedding部分及矩陣乘部分,用戶可以選擇使用BFloat16來進行相應的運算操作。經過測試,使用BFloat16可以在不損失精度的情況下,減少一半的內存。此外,使用框架原生的BFloat16到Float32的轉換效率很低,在使用了AVX的硬件指令加速后,可大幅提高其性能。 進一步使用AMX可以提高BF16矩陣乘法的效率,使用AMX時處理器每個周期可以執行1,024次BFloat16(16位浮點數)操作。
算子融合和圖優化
從圖優化層面來看,算子融合通過將一系列算子融合成單個算子的方法,可有效提升性能。這是由于每個算子都需要一個Kernel啟動,有時啟動時間甚至會比實際的核心計算花費更多的時間。通過將一系列算子融合為一個單一的大算子,可以減少Kernel啟動的開銷。此外,算子融合還有助于提升CPU Cache的命中率,降低中間數據讀取和寫入內存的數據傳輸開銷。
推薦模型除了DNN部分之外,另一個主要的部分是 embedding_lookup的計算. 這個功能在Tensorflow提供的實現有很多個算子來實現, 包括Unique, Gather, Reshape, ExpandDims, SparseSegmentSum等等幾十個算子,如圖4所示,計算效率非常低。在EasyRec里面我們將這些功能融合到一個算子里面執行,降低了算子調度的開銷。進一步我們使用AVX指令優化embedding聚合(Combine)計算, 提升向量加法和乘法的計算效率。
為了降低部署的復雜度,針對常見的Embedding模型,我們設計了模板匹配算法,自動尋找和匹配embedding_lookup的子圖,并將其替換成融合之后的算子, 使得用戶現有模型,不需要經過任何調整,就能直接享受性能的上提升。embedding_lookup的前一步通常是string_to_hashbucket, bucketize, string_to_number等操作,如果能匹配到相應的OP,我們將其也融合到embedding_lookup的Op中,減少Kernel Launch的次數。優化之后,主流的推薦模型OP數量一般會減少一半以上,RT通常能降低50%以上。
(a) 優化前
(b) 優化后
圖5. embedding_lookup子圖優化案例
特征計算(FeatureGenerator)優化
推薦模型效果優化的一個關鍵的部分是關鍵特征的挖掘和構造。受限于反饋和特征稀疏的問題,推薦場景通常需要設計一些泛化性比較強的特征來提升模型的效果。其中泛化性比較好的一類特征是顯示交叉特征,如LookupFeature, MatchFeature等。這類特征通過構建一個u2i的映射,記錄用戶在不同item上的行為的統計信息,如用戶最近1小時在不同商品上的點擊次數,在對應的類目上的點擊次數等等。為了提高查找效率,這類信息在線通常以HashMap的形式存儲。離線存儲和傳輸考慮到數據分析和存儲的效率,通常以字符串格式存儲。從離線格式解析到HashMap的過程中字符串分割占用了比較多的計算量。為了加速字符串的解析,我們設計了一套新的StringSplit實現,如下圖所示,通過AVX512向量化指令,批量處理輸入的字符串字符,匹配分隔符,從而達到加速字符串的分割的目的。優化后的StringSplit實現實際測試速度是Tensorflow中原生的StringSplit實現速度的3倍。在讀取CSV格式的數據訓練進行訓練的過程中,也涉及到比較多的字符串解析的工作,使用優化的StringSplitOp訓練速度可以提升2倍以上。
圖6. StringSplit優化
為了實現特征計算和embedding_lookup的overlap執行,我們將特征計算的部分也封裝成了Tensorflow的算子(Operation)。模型部署時,EasyRec Processor會根據特征配置自動構造特征計算的子圖,并拼接到TFModel的graph里面,這個過程也是用戶無序感知的。整合到同一個圖里面之后,可以進一步開啟grappler, xla, trt等圖優化操作對整個大圖做進一步的優化。
業務落地效果
上述的優化都已經沉淀到EasyRec訓練框架和推理框架EasyRec Processor里面,并且在多個客戶場景落地,幫助用戶取得了顯著的性能提升:
1.某電商場景精排模型,約2000 Feature Slots,模型參數20G,使用EasyRec Processor之后比原生的tf-serving qps提升了8倍,rt降低了70%;
2.某游戲場景精排模型,約500 Feature Slots,模型參數10G,使用EasyRec Processor之后比原生的tf-serving qps提升了4倍;
3.某游戲場景精排模型,在訓練時采用了AMX優化,訓練速度為優化前的2倍。
展望
采用第四代英特爾® 至強® 可擴展處理器來優化推薦系統性能,有助于降低部署專用加速器(如獨立顯卡)的成本,并更有效地控制推薦系統的總體擁有成本(TCO),從而使用戶受益。為了提升更多深度學習模型的端到端性能,英特爾和阿里云正積極合作,探索創新方式來優化軟硬件集成,加速深度學習模型的性能,使更多的云上用戶獲得收益。
此外,值得關注的是,英特爾于近期推出了第五代英特爾®至強® 可擴展處理器Emerald Rapids(EMR),該處理器同樣搭載內置AI加速引擎AMX,相比上一代SPR提供多達3倍的LLC,單CPU支持8通道 5600MT/s DDR5。在2023年阿里云云棲大會上,阿里云ECS宣布第八代實例g8i的算力再升級,從SPR升級到EMR之后AI性能和整體性能均有顯著提升。