乾貨|基於CPU的深度學習推理部署優化實踐

背景介紹

隨着人工智能技術在愛奇藝視頻業務線的廣泛應用,深度學習算法在雲端的部署對計算資源,尤其是 GPU 資源的需求也在飛速增長。如何提高深度學習應用部署效率,降低雲平臺運行成本,幫助算法及業務團隊快速落地應用和服務,讓 AI 發揮真正的生產力,是深度學習雲平臺團隊努力的目標 。

從基礎架構的角度,GPU資源的緊缺和GPU 利用率的不足是我們面臨的主要挑戰。由於大量的算法訓練及推理服務需求,雲端 GPU 資源經常處於短缺狀態;而使用 CPU 進行的推理服務常常由於性能問題,無法滿足服務指標。除此之外,線上服務通常有較高的實時性要求,需要獨佔 GPU,但由於較低的 QPS,GPU 利用率經常處於較低的狀態(<20%)。

在此背景下,我們嘗試進行了基於CPU的深度學習推理服務優化,通過提升推理服務在CPU上的性能,完成服務從GPU遷移到CPU上的目的,以利用集羣中大量的 CPU服務器,同時節省GPU計算資源 。

image

圖1. 深度學習服務對雲平臺的挑戰

1. 深度學習推理服務及優化流程

1.1 什麼是深度學習推理服務?

深度學習推理服務通常是指將訓練好的深度學習模型部署到雲端,並對外提供gRPC/HTTP接口請求的服務。推理服務內部實現的功能包括模型加載,模型版本管理,批處理及多路支持,以及服務接口的封裝等,如圖2所示:

image

圖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所示,是一個不斷朝優化目標迭代的過程。

image

圖3. 服務優化的流程

進行深度學習推理服務的優化,首先需要明確服務的類型和主要性能指標,以確定服務優化的目標。從系統資源的角度,深度學習服務可以分爲計算密集或者I/O 密集類服務,例如基於CNN的圖像/視頻類算法通常對計算的需求比較大,屬於計算密集型服務,搜索推薦類的大數據算法輸入數據的特徵維度較高,數據量大,通常屬於I/O 密集型服務。從服務質量的角度,又可以分爲延時敏感類服務和大吞吐量類型服務,例如在線類服務通常需要更低的請求響應時間,多屬於延時敏感類服務,而離線服務通常是批處理的大吞吐量類型服務。不同類型的深度學習服務優化的目標和方法也不盡相同。

image

圖4. 深度學習推理服務的分類

1.3 深度學習推理服務的性能指標有哪些?

深度學習服務的性能指標主要包括響應延時(latency),吞吐量(throughput),及模型精度(accuracy)等,如圖5 所示。其中響應延時和吞吐量兩個指標是進行服務化過程中關心的性能指標。明確服務性能指標後便於我們分析服務規模,計算單一服務節點需要達到的服務性能。

image

圖5. 深度學習服務性能指標

2. 基於CPU的深度學習推理服務優化

2.1 CPU上進行深度學習優化的方法主要有哪些?

“工欲善其事,必先利其器”。CPU上進行深度學習推理服務優化的方法,可以分爲系統級、應用級、算法級,每一級也有對應的性能分析工具,如圖6所示:

系統級的優化主要從硬件和平臺的角度進行計算加速,方法主要包括基於SIMD指令集的編譯器加速、基於OMP的數學庫並行計算加速、以及硬件廠商提供的深度學習加速 SDK 等方法。

應用級的優化主要從特定應用和服務的角度進行流水和併發的優化。通常的深度學習服務不僅僅包含推理,還有數據的預處理、後處理,網絡的請求響應等環節,良好的併發設計可以有效的提升服務端到端的性能。

算法級的優化主要針對深度學習模型本身,利用諸如超參數設置、網絡結構裁剪、量化等方法來減小模型大小和計算量,從而加速推理過程。

image

圖6. 深度學習服務性能優化方法及分析工具

2.2 如何進行系統級的優化?

CPU上系統級優化實踐中我們主要採用數學庫優化(基於MKL-DNN)和深度學習推理SDK優化(Intel OpenVINO)兩種方式。這兩種方式均包含了SIMD指令集的加速。

數學庫優化對主流的深度學習框架(tensorflow,caffe,mxnet,pytorch等)均有官方源支持。以tensorflow爲例,使用方法如下所示:

image

圖7. 基於MKL-DNN 優化的 Tensorflow 使用方法

深度學習推理SDK優化方法,需要首先將原生深度學習模型進行轉換,生成IR中間模型格式,之後調用SDK的接口進行模型加載和推理服務封裝。具體流程如下所示:

image

圖8. OpenVINO 優化推理服務流程

2.3 選用哪種系統級優化方式?

兩種優化方式的比較如圖9所示:

image

圖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進行解碼、抽幀、預處理,之後將處理後的碼流經過深度學習網絡進行推理,最後通過推理結果的聚合得到視頻質量的打分,來判定是何種類型視頻。

image

圖10. 視頻質量評估服務流程

圖11是通過 Vtune工具抓取的原始應用線程,可以看到OpenCV單一解碼線程一直處於繁忙狀態(棕色),而OMP推理線程常常處於等待狀態(紅色)。整個應用的瓶頸位於 Opencv 的解碼及預處理部分。

image

圖11. 應用優化前線程狀態

圖12顯示優化後的服務線程狀態,通過生成多個進程併發進行視頻流解碼,並以 batch的方式進行預處理;處理後的數據以batch的方式傳入OMP threads進行推理來進行服務的優化。

image

圖12. 應用併發優化後線程狀態

經過上述簡單的併發優化後,對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。

image

圖13. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章