乾貨|基於 CPU 的深度學習推理部署優化實踐
背景介紹
隨著人工智慧技術在愛奇藝視訊業務線的廣泛應用,深度學習演算法在雲端的部署對計算資源,尤其是 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 效能分析工具: