開源 | dl_inference更新:增加TensorRT、MKL整合,提高深度學習模型推理速度

語言: CN / TW / HK

01

 背 景

dl_inference是58同城推出的通用深度學習推理服務,可在生產環境中快速上線由TensorFlow、PyTorch、Caffe等框架訓練出來的深度學習模型。dl_inference於2020年3月26號釋出,可參見《開源|dl_inference:通用深度學習推理服務》

我們在2021年11月對dl_inference再次進行更新,從釋出至今新增如下Features:

1、整合TensorRT加速深度學習推理,支援將TensorFlow-SavedModel模型、PyTorch-Pth模型進行自動優化,轉換為TensorRT模型後部署,提高模型在GPU上的推理速度。

2、整合Intel Math Kernel Library庫的TensorFlow Serving推理框架,加速TensorFlow模型CPU上推理。

3、支援Caffe模型推理,提供豐富的模型應用示例。


02

使用TensorRT加速深度學習推理

深度學習模型推理階段對算力和時延具有很高的要求,如果將訓練好的神經網路直接部署到推理端,很有可能出現算力不足無法執行或者推理時間較長等問題,因此我們需要對訓練好的神經網路進行一定的優化。TensorRT是NVIDIA推出的一款基於CUDA和cuDNN的神經網路推理加速引擎,能從以下幾個方面來提升模型在GPU上的推理效能:
  • 權重與啟用精度校準:支援將模型量化為FP16/INT8精度,提高吞吐量的同時保持高準確度。
  • 層與張量融合:TensorRT可以做計算圖優化,通過kernel融合,減少資料拷貝等手段,生成網路的優化計算圖。
  • 核心自動調整:TensorRT可以自動選取最優kernel。同樣是矩陣乘法,在不同GPU架構上以及不同矩陣大小,最優的GPU kernel的實現方式不同,TensorRT可以把它優選出來。
  • 動態張量視訊記憶體:更大限度減少視訊記憶體佔用,高效地為張量重複利用視訊記憶體。
  • 多流執行:並行處理多個輸入流的可擴充套件設計。
同時NVIDIA提供了Triton Inference Server(以下簡稱TIS)框架支援多種模型的推理服務部署。TIS是NVIDIA針對旗下GPU推出的高效能線上推理解決方案,可通過HTTP或gRPC端點提供服務,為模型部署方案提供更多靈活性的同時可以充分發揮GPU的平行計算能力。
dl_inference基於TensorRT 7.1.3版本和TIS 20.08版本實現GPU推理加速功能,支援將TensorFlow和PyTorch框架訓練出來的模型通過TensorRT引擎自動進行優化,轉換為TensorRT格式模型,然後通過TIS推理框架進行服務化部署。使用dl_inference的GPU推理加速功能包括模型轉換和模型部署兩步,詳細介紹如下。
1、 模型轉換
開發者提供TensorFlow訓練好的SavedModel.pb或PyTorch訓練好的Model.pth模型檔案,dl_inference會先將其轉換為ONNX(Open Neural Network Exchange)格式模型,ONNX是一種針對機器學習所設計的開放式檔案格式,用於儲存訓練好的模型,它使得不同的深度學習框架可以在相同格式儲存模型資料並互動,然後dl_inference再將ONNX模型檔案自動進行優化,轉換得到TensorRT格式模型。開發者除了要提前準備好模型檔案外還需提供模型元資料描述檔案config.txt,TensorFlow SavedModel.pb模型元資料可由saved_model_cli 命令工具檢視,PyTorch pth模型由於沒有name概念,可設定為單字母名稱,如 i, o等,表示inputs,outputs。以Resnet50(dl_inference/DLPredictOnline/demo/model/tis)為例模型元資料描述檔案config.txt如下:
{    "batch_size":0,    "input":[        {            "name":"image",            "data_type":"float",            "dims":[                -1,                224,                224,                3            ],            "node_name":"input_1:0"        }    ],    "output":[        {            "name":"probs",            "data_type":"float",            "dims":[                -1,                19            ],            "node_name":"dense_1/Softmax:0"        }    ]}
模型和模型元資料描述檔案準備好後,在dl_inference/TisPredictOnline/DockerImage目錄下進行映象生成。
cd DockerImagedocker build -t tis-model-convert:lastest .
最後啟動映象,自動化執行模型轉換操作,完成模型轉換。
cd $模型所在路徑docker run -v `pwd`:/workspace/source_model -e SOURCE_MODEL_PATH=/workspace/source_model -e TARGET_MODEL_PATH=/workspace/source_model -e MODEL_NAME=tensorflow-666 -e MODEL_TYPE=tensorflow tis-model-convert:lastest# SOURCE_MODEL_PATH 原始模型所在路徑,也是模型描述檔案所在路徑# TARGET_MODEL_PATH 生成TensorRT模型所在路徑# MODEL_NAME 模型名稱# MODEL_TYPE 模型型別 (tensorflow or pytorch)
2、模型部署
首先需要拉取映象,然後啟動映象進行模型TIS推理部署。
docker pull nvcr.io/nvidia/tritonserver:20.08-py3docker run -v ${TARGET_MODEL_PATH}:/workspace -p 8001:8001 nvcr.io/nvidia/tritonserver:20.08-py3 /opt/tritonserver/bin/tritonserver --model-repository=/workspace# TARGET_MODEL_PATH即為模型轉換服務中環境變數值,預設使用8001埠且此埠固定
至此模型TIS推理服務已經就緒,開發者可以通過客戶端對其進行測試,dl_inference定義了rpc介面TisPredict用於進行呼叫,同時也提供了client demo
(dl_inference/DLPredictOn-line/demo/src/main/java/com/bj58/ailab/demo/client/TisClient.java)供開發者進行參考。
使用TensorRT加速深度學習推理能夠使得GPU上推理效能大幅提升,如dl_inference在TensorFlow框架訓練的Resnet50模型上應用TensorRT加速功能,在不降低推理精度情況下,T4卡上加速後QPS提升80%,耗時降低18%,如下圖所示。


03

 使用Intel MKL 加速深度學習推理

Math Kernel Library(簡稱MKL,後改名為oneDNN)為Intel推出的數學核心函式庫,能夠在CPU上利用AVX2、FMA等指令進行指令集優化。dl_inference通過利用MKL庫,在以下幾個方面對TensorFlow模型推理進行了優化:
  • 在CPU上執行時將TensorFlow替換為Intel優化版本,這樣能在不改變模型網路的前提下提升效能。
  • 消除不必要且耗費計算資源的資料層轉換。
  • 將多個執行融合在一起以在CPU上高效重複使用快取記憶體。
dl_inference使用帶有MKL編譯選項的TensorFlow Serving版本,開發者準備好TensorFlow訓練好的SavedModel格式模型後按TensorFlow Serving方式部署到dl_inference提供的TensorFlow Serving MKL映象即可獲得加速效果,TensorFlow Serving能夠相容低版本模型,即使是TensorFlow1.x訓練的模型,也可以在TensorFlow Serving2.x上使用,因此開發者無需考慮版本問題。MKL版本提供一些引數供開發者進行調整,引數說明如下:
KMP_BLOCKTIME - 設定執行緒在執行完並行區域之後,在休眠之前應該等待的時間(以毫秒為單位)
KMP_AFFINITY - 控制執行緒如何分佈並繫結到特定的處理單元
KMP_SETTINGS - 允許 (true) 或禁止 (false) 在程式執行期間輸出 OpenMP* 執行時庫環境變數
OMP_NUM_THREADS - OpenMP執行時可用的最大執行緒數,通常設定為等於物理核心的數量
dl_inference在Intel(R) Xeon(R) CPU E5-2620上部署Resnet50模型推理使用MKL版本獲取了不錯的加速效果,使用MKL版本的TensorFlow Serving相對直接使用TensorFlow Serving QPS提升60%,耗時降低40%,對比時分配的CPU資源為4核,效果如下圖所示。

Caffe模型推理支援
Caffe是一款較為主流的深度學習框架,使用人數雖然相比TensorFlow和PyTorch較少,但是仍然有著較大的應用基數。因此dl_inference在v1.1版本中,基於Seldon封裝了Caffe模型推理RPC服務,統一介面協議,適用任何型別的Caffe模型,極大減少模型部署工作量。同時在模型RPC服務封裝時我們進行了創新,首先,引入前後預處理程式, 支援使用者在執行模型推理前後進行相關資料的處理;其次 ,開放模型呼叫,使用者可以根據業務及模型的特點進行模型呼叫獨立定製,Caffe模型推理流程如下圖。
dl_inference提供了可以由使用者自定義的介面檔案preprocess(模型執行前資料預處理)和postprocess(模型執行後資料後處理)。在preprocess中,可以對傳入的推理資料和引數進行預處理操作,比如對圖片的位元組流資料進行處理,返回模型推理需要的Tensor型別資料;在postprocess中,可以對模型返回的推理結果進行處理,比如對結果進行篩選並剔除多餘結果資料,或者將結果資料進行壓縮、數學變換等操作。支援推理前後的資料處理,使得線上線下可以使用同一套資料處理,極大的簡化了演算法開發人員部署模型的工作量,同時還可以在遠端部署時,減小網路傳遞的資料包大小,提高整體推理效能。
不同的業務場景模型實現不盡相同,為了支援在不同場景下的模型呼叫需求,使用者可以在自定義介面檔案中,重新定義模型的執行過程。預設的模型執行是單次執行,自定義介面函式中,可以多次執行同一個模型,或通過推理資料的引數修改模型內部權重,然後再進行模型呼叫,實現同一模型適應不通場景下的推理。dl_inference開放了模型呼叫的過程,提高了模型實現的靈活性,從而滿足不同業務方的定製化需求。

提供豐富的應用示例
為了方便大家使用,dl_inference提供了更多模型案例供使用者參考,包括:
qa_match (由58同城開源的基於深度學習的問答匹配工具)訓練模型、推薦排序和影象識別模型。

注:以上資料均在CPU Intel(R) Xeon(R) CPU E5-2620 v4上測試得到
另外在2021年7月58同城舉辦的第二屆演算法大賽中,dl_inference釋出了Baseline模型,為參選選手提供示例,拓展解題思路。Baseline模型基於MMoE模型完成,詳細可參考文章 《WPAI中使用MMoE模型完成58同城AI演算法大賽》


04

 總結

dl_inference2020年3月釋出以來完成的三次版本迭代,豐富了使用案例,支援了Caffe框架訓練的模型推理,提升了模型在GPU和CPU上推理效能。使用過程中,如遇任何問題可新增“58技術小祕書”為好友,備註“dl_inference”加入官方交流群尋求幫助。
後續我們還將對這三次版本迭代進行線上的沙龍直播,敬請期待!
未來我們會繼續優化擴充套件dl_inference的能力,計劃開源如下
1、持續優化CPU上推理效能,如相容Intel的OpenVINO加速元件。
2、持續優化GPU上推理效能,如相容INT8低精度推理、支援更多的運算元等。

專案地址:https://github.com/wuba/dl_inference

貢獻指引:
本次開源只是dl_inference貢獻社群的一小步,我們真摯地希望開發者向我們提出寶貴的意見和建議。您可以挑選以下方式向我提交反饋建議和問題
1、在https://github.com/wuba/dl_inference 提交PR或者lssue。
2、郵件傳送至 [email protected]

參考資料:

[1] 通過Intel MKL優化TensorFlow:https://www.intel.cn/content/www/cn/zh/developer/articles/technical/tensorflow-optimizations-on-modern-intel-architecture.html

[2] 在Intel CPU上通過引數配置優化TensorFlow效能:https://www.intel.com/content/www/us/en/developer/articles/technical/maximize-tensorflow-performance-on-cpu-considerations-and-recommendations-for-inference.html

[3] Intel深度學習加速調優指南:https://www.intel.cn/content/www/cn/zh/developer/articles/technical/deep-learning-with-avx512-and-dl-boost.html

[4] NVIDIA TensorRT介紹:https://docs.nvidia.com/deeplearning/tensorrt/

[5] NVIDIA Triton-Inference-Server介紹:https://developer.nvidia.com/nvidia-triton-inference-server

本文分享自微信公眾號 - 58技術(architects_58)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。