天天看點

使用TensorRT內建加速TensorFlow推理

NVIDIA宣布完成了推理優化工具TensorRT與TensorFlow将內建在一起工作。TensorRT內建将可用于TensorFlow1.7版本。TensorFlow仍然是當今最受歡迎的深度學習架構,而NVIDIA TensorRT通過對GPU平台的優化和提高性能,加速了深度學習推理。我們希望使用TensorRT能為TensorFlow使用者提供盡可能高的推理性能以及接近透明的工作流。新的內建提供了一個簡單的API,它能夠使用TensorFlow中的TensorRT實作FP16和INT8的優化。對于ResNet-50基準測試的低延遲運作,TensorRT将TensorFlow推理速度提高了8倍。

下面讓我們看一下工作流的概述,以及一些例子以便幫助入門。

使用與TensorRT內建的TensorFlow優化并執行相容的子圖,讓TensorFlow執行剩餘的圖。你仍然可以使用TensorFlow廣泛且靈活的功能集,但是TensorRT能盡可能的解析模型,并對圖的部分應用進行優化。而且TensorFlow程式隻需要幾行新代碼就可以促進內建。将TensorRT優化應用于TensorFlow模型時需要導出圖表,在某些情況下還需要手動導入某些不受支援的TensorFlow層,這可能會非常耗時。

現在讓我們逐漸了解工作流。在當機TensorFlow圖進行推理後,使用TensorRT對TensorFlow子圖進行優化。然後TensorRT用TensorRT優化節點替換每個支援的子圖,生成一個在TensorFlow中運作的當機圖來進行推斷。圖1說明了工作流。

使用TensorRT內建加速TensorFlow推理

圖一所示:在推理過程中使用TensorRT時的工作流圖

TensorFlow在所有可支援領域内執行圖形,并調用TensorRT執行TensorRT優化節點。例如,假設圖形有三個段,A、B和C,片段B經過了TensorRT優化并被一個節點替換。那麼在推理過程中,TensorFlow執行A,然後調用TensorRT執行B,之後繼續TensorFlow執行C。從使用者角度來看,該過程和之前使用TensorFlow執行圖形一樣。現在讓我們看看應用這個工作流的一個示例。

讓我們看看如何使用新的TensorFlow api将TensorRT優化應用到TensorFlow圖中。首先在現有的TensorFlow GPU代碼中添加幾行代碼:

1、在GPU記憶體中指定TensorFlow可用的部分,TensorRT可以使用剩餘的記憶體。

2、讓TensorRT分析TensorFlow圖,應用優化,并用TensorRT節點替換子圖。

使用GPUOptions函數中的新參數per_process_gpu_memory_fraction指定TensorRT可以使用的GPU部分。該參數需要在第一次啟動TensorFlow-TensorRT時進行設定。例如,0.67意味着将為TensorFlow配置設定67%的GPU記憶體,而剩下的33%用于TensorRT引擎。

使用TensorRT內建加速TensorFlow推理

使用新函數create_inference_graph将TensorRT優化應用于當機圖。然後,TensorRT将一個當機的TensorFlow圖作為輸入,并傳回一個帶有TensorRT節點的優化圖。參見下面的示例代碼片段:

使用TensorRT內建加速TensorFlow推理

讓我們看一下函數的參數:

frozen_graph_def: 當機的TensorFlow圖表

put_node_name: 帶有輸出節點名稱的字元串清單,例如

max_batch_size: 整數,輸入批次的大小,如16。

max_workspace_size_bytes:整數,可用于TensorRT的最大GPU記憶體。

precision_mode: 字元串,允許的值為“FP32”,“FP16”或“INT8”。

可以通過設定per_process_gpu_memory_fraction和max_workspace_size_bytes參數來獲得最佳性能。例如,将per_process_gpu_memory_fraction參數設定為(12 - 4)/ 12 = 0.67,将max_workspace_size_bytes參數設定為4000000000,用于12GB的GPU,以便為TensorRT引擎配置設定4GB。

首先在TensorBoard中應用TensorRT優化,然後将對ResNet-50節點圖的更改進行可視化。如圖2所示,TensorRT幾乎優化了整個圖形,并用“my_trt_po0”節點進行替換(用紅色突出顯示)。根據模型中的圖層和操作,TensorRT節點會因優化而替換部分模型。

使用TensorRT內建加速TensorFlow推理

圖2.左:TensorBoard中的ResNet-50圖。右:經過TensorRT優化并且子圖被TensorRT節點替換之後。

要注意TensorRT節點下的名為“conv1”的節點。它實際上不是一個卷積層,而是一種顯示為conv1的從NHWC到NCHW的轉置操作。這是因為TensorBoard僅顯示層次結構中頂部節點的名稱,而不是預設情況下的單個操作。

與FP32和FP64相比,使用半精度(即FP16)算法能夠減少神經網絡的記憶體使用,而且還能夠花費更少的時間部署更大的網絡。每個Tensor Core包含一個4x4x4的矩陣處理陣列來完成D=AxB+C的運算,其中A、B、C、D是4x4的矩陣,如圖3所示。矩陣相乘的輸入A和B是FP16矩陣,相加矩陣C和D可能是FP16矩陣或FP32矩陣。

使用TensorRT內建加速TensorFlow推理

圖3.Tensor Cores上的矩陣處理運算

在使用半精度算法時,TensorRT會自動在Volta GPU中使用Tensor Cores進行推理。NVIDIA Tesla V100上的Tensor Cores峰值性能比雙精度(FP64)快大約10倍,比單精度(FP32)快4倍。隻需使用“FP16”作為create_inference_graph函數中的precision_mode參數的值即可啟用半精度,如下所示。

使用TensorRT內建加速TensorFlow推理

圖4顯示了使用NVIDIA Volta Tensor Cores與僅運作TensorFlow的TensorFlow-TensorRT內建的差距,ResNet-50在7 ms延遲下執行速度提高了8倍。

使用TensorRT內建加速TensorFlow推理

圖4.ResNet-50推理吞吐量性能

使用INT8精度進行推理能夠進一步提高計算速度并降低寬帶要求。動态範圍的減少使得神經網絡的表示權重和激活變得更加有挑戰性。表1說明了動态範圍的影響。

使用TensorRT內建加速TensorFlow推理

表1:FP32 vs FP16 vs INT8動态範圍

TensorRT提供了在單精度(FP32)和半精度(FP16)中接受訓練的模型,并将它們轉換為用于INT8量化的部署,同時能夠将精度損失降至最低。要想模型能夠使用INT8進行部署,需要在應用TensorRT優化之前校準經過訓練的FP32模型。剩下的工作流保持不變。圖5顯示了更新後的工作流。

使用TensorRT內建加速TensorFlow推理

圖5.更新後的TensorFlow工作流,包括TensorRT優化之前的INT8校準

首先使用create_inference_graph函數,并将precision_mode參數設定為“INT8”來校準模型。這個函數的輸出是一個當機的TensorFlow圖,可以用來校準。

使用TensorRT內建加速TensorFlow推理

接下來用校準資料來執行校準圖。TensorRT根據節點資料的分布來量化節點的權重。校準資料非常重要,因為它可以密切反應生産中問題資料集的分布。我們建議在首次使用INT8校準模闆是檢查推理期間的錯誤積累。

在校準資料上執行圖形後,使用calib_graph_to_infer_graph函數對校準圖形應用TensorRT優化。還可以用為INT8優化的TensorRT節點替換TensorFlow子圖。函數的輸出是一個當機的TensorFlow圖表,可以像往常一樣用于推理。

使用TensorRT內建加速TensorFlow推理

我們将繼續與TensorFlow團隊緊密合作,以加強TensorRT內建的可用性。我們期望新的解決方案在能夠保持TensorFlow易用性和靈活性的同時,可以確定NVIDIA GPU性能達到最高。而且由于TensorRT支援多種網絡,是以開發人員不需要對現有代碼進行任何更改,僅從自動更新中就能獲益。

使用标準的pip安裝過程來獲得新的內建解決方案,一旦TensorFlor1.7可用:

使用TensorRT內建加速TensorFlow推理

<a href="https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=j4nkrg1c&amp;utm_source=j4nkrg1c" target="_blank">數十款阿裡雲産品限時折扣中,趕緊點選領劵開始雲上實踐吧!</a>

文章原标題《TensorRT Integration Speeds Up TensorFlow Inference | NVIDIA Developer Blog》

譯者:奧特曼,審校:袁虎。

繼續閱讀