背景介紹
隨著人工智慧技術在愛奇藝視訊業務線的廣泛應用,深度學習演算法在雲端的部署對計算資源,尤其是 GPU 資源的需求也在飛速增長。如何提高深度學習應用部署效率,降低雲平臺執行成本,幫助演算法及業務團隊快速落地應用和服務,讓 AI 發揮真正的生產力,是深度學習雲平臺團隊努力的目標 。
從基礎架構的角度,GPU資源的緊缺和GPU 利用率的不足是我們面臨的主要挑戰。由於大量的演算法訓練及推理服務需求,雲端 GPU 資源經常處於短缺狀態;而使用 CPU 進行的推理服務常常由於效能問題,無法滿足服務指標。除此之外,線上服務通常有較高的實時性要求,需要獨佔 GPU,但由於較低的 QPS,GPU 利用率經常處於較低的狀態(<20%)。
在此背景下,我們嘗試進行了基於CPU的深度學習推理服務優化,通過提升推理服務在CPU上的效能,完成服務從GPU遷移到CPU上的目的,以利用叢集中大量的 CPU伺服器,同時節省GPU計算資源 。
1. 深度學習推理服務及優化流程
1.1 什麼是深度學習推理服務?
深度學習推理服務通常是指將訓練好的深度學習模型部署到雲端,並對外提供gRPC/HTTP介面請求的服務。推理服務內部實現的功能包括模型載入,模型版本管理,批處理及多路支援,以及服務介面的封裝等,如圖2所示:
業界常用的深度學習推理服務框架包括 Google的tensorflow serving、Nvidia的Tensor RT inference server,Amazon的Elastic Inference等。目前愛奇藝深度學習雲平臺(Jarvis)提供以tensorflow serving 為框架的自動推理服務部署功能,已支援的深度學習模型包括 tensorflow,caffe,caffe2,mxnet,tensorrt 等,未來還會支援包括 openvino,pytorch。除此之外,業務團隊也可以根據自身需求實現和定製特定的深度學習服務化容器,並通過QAE進行服務的部署和管理。
1.2 服務優化的流程是怎樣的?
服務優化流程如圖3所示,是一個不斷朝優化目標迭代的過程。
進行深度學習推理服務的優化,首先需要明確服務的型別和主要效能指標,以確定服務優化的目標。從系統資源的角度,深度學習服務可以分為計算密集或者I/O 密集類服務,例如基於CNN的影象/視訊類演算法通常對計算的需求比較大,屬於計算密集型服務,搜尋推薦類的大資料演算法輸入資料的特徵維度較高,資料量大,通常屬於I/O 密集型服務。從服務質量的角度,又可以分為延時敏感類服務和大吞吐量型別服務,例如線上類服務通常需要更低的請求響應時間,多屬於延時敏感類服務,而離線服務通常是批處理的大吞吐量型別服務。不同型別的深度學習服務優化的目標和方法也不盡相同。
1.3 深度學習推理服務的效能指標有哪些?
深度學習服務的效能指標主要包括響應延時(latency),吞吐量(throughput),及模型精度(accuracy)等,如圖5 所示。其中響應延時和吞吐量兩個指標是進行服務化過程中關心的效能指標。明確服務效能指標後便於我們分析服務規模,計算單一服務節點需要達到的服務效能。
2. 基於CPU的深度學習推理服務優化
2.1 CPU上進行深度學習優化的方法主要有哪些?
“工欲善其事,必先利其器”。CPU上進行深度學習推理服務優化的方法,可以分為系統級、應用級、演算法級,每一級也有對應的效能分析工具,如圖6所示:
系統級的優化主要從硬體和平臺的角度進行計算加速,方法主要包括基於SIMD指令集的編譯器加速、基於OMP的數學庫平行計算加速、以及硬體廠商提供的深度學習加速 SDK 等方法。
應用級的優化主要從特定應用和服務的角度進行流水和併發的優化。通常的深度學習服務不僅僅包含推理,還有資料的預處理、後處理,網路的請求響應等環節,良好的併發設計可以有效的提升服務端到端的效能。
演算法級的優化主要針對深度學習模型本身,利用諸如超引數設定、網路結構裁剪、量化等方法來減小模型大小和計算量,從而加速推理過程。
2.2 如何進行系統級的優化?
CPU上系統級優化實踐中我們主要採用數學庫優化(基於MKL-DNN)和深度學習推理SDK優化(Intel OpenVINO)兩種方式。這兩種方式均包含了SIMD指令集的加速。
數學庫優化對主流的深度學習框架(tensorflow,caffe,mxnet,pytorch等)均有官方源支援。以tensorflow為例,使用方法如下所示:
深度學習推理SDK優化方法,需要首先將原生深度學習模型進行轉換,生成IR中間模型格式,之後呼叫SDK的介面進行模型載入和推理服務封裝。具體流程如下所示:
2.3 選用哪種系統級優化方式?
兩種優化方式的比較如圖9所示:
基於兩種優化方式的特點,實踐中可首先使用基於MKL-DNN的優化方式進行服務效能測試,如滿足服務需求,可直接部署;對於效能有更高要求的服務,可嘗試進行 OpenVINO SDK優化的方法。
2.4 系統級優化使用中有哪些影響效能的因素?
以上兩種系統級優化方法,使用過程中有以下因素會影響服務效能。
(1)OpenMP引數的設定
兩種推理優化方式均使用了基於OMP的平行計算加速,因此OMP引數的配置對效能有較大的影響。主要引數的推薦配置如下所示:
• OMP_NUM_THREADS = “number of cpu cores in container”
• KMP_BLOCKTIME = 10
• KMP_AFFINITY=granularity=fine, verbose, compact,1,0
(2)部署服務的CPU核數對效能的影響
CPU 核數對推理服務效能的影響主要是:
• Batchsize 較小時(例如線上類服務),CPU核數增加對推理吞吐量提升逐漸減弱,實踐中根據不同模型推薦 8-16 核 CPU進行服務部署;
• Batchsize 較大時(例如離線類服務),推理吞吐量可隨CPU核數增加呈線性增長,實踐中推薦使用大於 20 核CPU進行服務部署;
(3)CPU型號對效能的影響
不同型號的 CPU 對推理服務的效能加速也不相同,主要取決於CPU中SIMD指令集。例如相同核數的Xeon Gold 6148的平均推理效能是Xeon E5-2650 v4的2倍左右,主要是由於6148 SIMD指令集由avx2升級為avx-512。
目前線上叢集已支援選擇不同型別的CPU進行服務部署。
(4)輸入資料格式的影響
除 Tensorflow之外的其他常用深度學習框架,對於影象類演算法的輸入,通常推薦使用NCHW 格式的資料作為輸入。Tensorflow原生框架預設在CPU上只支援 NHWC 格式的輸入,經過 MKL-DNN 優化的 Tensorflow 可以支援兩種輸入資料格式。
使用以上兩種優化方式,建議演算法模型以 NCHW 作為輸入格式,以減少推理過程中記憶體資料重排帶來的額外開銷。
(5)NUMA 配置的影響
對於NUMA 架構的伺服器,NUMA配置在同一node上相比不同node上效能通常會有 5%-10%的提升。
2.5 如何進行應用級的優化?
進行應用級的優化,首先需要將應用端到端的各個環節進行效能分析和測試,找到應用的效能瓶頸,再進行鍼對性優化。效能分析和測試可以通過加入時間戳日誌,或者使用時序效能分析工具,例如 Vtune,timeline 等 。優化方法主要包括併發和流水設計、資料預取和預處理、I/O加速、特定功能加速(例如使用加速庫或硬體進行編解碼、抽幀、特徵embedding等功能加速)等方式。
下面以視訊質量評估服務為例,介紹如何利用Vtune工具進行瓶頸分析,以及如何利用多執行緒/程式併發進行服務的優化。
視訊質量評估服務的基本流程如圖10 所示,應用讀入一段視訊碼流,通過OpenCV進行解碼、抽幀、預處理,之後將處理後的碼流經過深度學習網路進行推理,最後通過推理結果的聚合得到視訊質量的打分,來判定是何種型別視訊。
圖11是通過 Vtune工具抓取的原始應用執行緒,可以看到OpenCV單一解碼執行緒一直處於繁忙狀態(棕色),而OMP推理執行緒常常處於等待狀態(紅色)。整個應用的瓶頸位於 Opencv 的解碼及預處理部分。
圖12顯示優化後的服務執行緒狀態,通過生成多個程式併發進行視訊流解碼,並以 batch的方式進行預處理;處理後的資料以batch的方式傳入OMP threads進行推理來進行服務的優化。
經過上述簡單的併發優化後,對720幀視訊碼流的處理時間,從7秒提升到了3.5秒,效能提升一倍。除此之外,我們還可以通過流水設計,專用解碼硬體加速等方法進一步提升服務整體效能。
2.6 如何進行演算法級的優化?
常見的演算法級優化提升推理服務效能的方法包括batchsize的調整、模型剪枝、模型量化等。其中模型剪枝和量化因涉及到模型結構和引數的調整,通常需要演算法同學幫助一起進行優化,以保證模型的精度能滿足要求。
2.7 Batchsize的選取在CPU上對服務效能的影響是怎樣的?
Batchsize選取的基本原則是延時敏感類服務選取較小的batchsize,吞吐量敏感的服務選取較大的batchsize。
圖13是選取不同的 batchsize 對推理服務吞吐量及延時的影響。測試結果可以看batchsize 較小時適當增大batchsize(例如bs從1到2),對延時的影響較小,但是可以迅速提升吞吐量的效能;batchsize 較大時再增加其值(例如從8到32),對服務吞吐量的提升已沒有幫助,但是會極大影響服務延時效能。因此實踐中需根據部署服務節點CPU核數及服務效能需求來優化選取batchsize。
總結與展望
以上介紹的系統級優化方法,已在深度學習雲平臺落地超過10+應用和演算法,部署上千core的服務,平均效能提升在1~9倍。更詳細的使用方法可以參考文末相關連結。
對於深度學習的推理服務優化,深度學習雲平臺還計劃加入更多的異構計算資源來加速特定任務,例如VPU、FPGA等計算資源。同時在服務的彈性和優化排程、部署引數的自動優化選取等方面,我們也會繼續深入優化,以充分發揮雲平臺的計算資源和能力,加速深度學習推理服務的落地。
相關連結
(1)OpenVINO: https://software.intel.com/en-us/openvino-toolkit
(2)Vtune效能分析工具: https://software.intel.com/en-us/vtune