TensorRT 3:更快的TensorFlow推理和Volta支持

TensorRT 3:更快的TensorFlow推理和Volta支持

TensorRT 3: Faster TensorFlow Inference and Volta Support

英偉達TensorRT ™是一個高性能的深度學習推理優化器和運行時,爲深度學習應用程序提供低延遲、高吞吐量的推理。NVIDIA去年發佈了TensorRT,其目標是加速產品部署的深度學習推理。
在這裏插入圖片描述
Figure 1. TensorRT optimizes trained neural network models to produce adeployment-ready runtime inference engine.

在這篇文章中,我們將介紹TensorRT 3,它比以前的版本提高了性能,並且包含了新的特性,使其更易於使用。TensorRT 3的主要亮點包括:

TensorFlow模型導入器:從TensorFlow訓練的模型導入、優化和生成推理運行時引擎的方便API;

Python API:一個易於使用的Python接口,用於提高生產率;

Volta Tensor核心支持:與Tesla P100 GPU相比,在Tesla V100上提供高達3.7倍的更快推理性能。

讓我們使用一個代碼示例深入瞭解TensorRT工作流。我們將介紹如何將經過訓練的模型導入TensorRT,優化它們並生成運行時推理引擎,這些引擎可以序列化到磁盤進行部署。最後,我們將看到如何加載序列化的運行時引擎並在生產應用程序中運行快速高效的推理。但首先,讓我們回顧一下部署推理的一些挑戰,看看爲什麼推理需要一個專用的解決方案。

Why Does Inference Need a Dedicated Solution?

作爲數字產品和服務的消費者,我們每天都與一些人工智能服務進行交互,例如語音識別、語言翻譯、圖像識別和視頻字幕生成等。在幕後,神經網絡計算每個查詢的結果。這個步驟通常被稱爲“推斷”:新數據通過經過訓練的神經網絡來生成結果。在傳統的機器學習文獻中,它有時也被稱爲“預測”或“評分”。

這種神經網絡通常運行在雲中的web服務中,它同時接收來自數千或數百萬用戶的新請求,計算每個請求的推理計算,並將結果返回給用戶。爲了提供良好的用戶體驗,所有這些都必須在較小的延遲預算下實現,包括網絡延遲、神經網絡執行和基於生產環境的其他延遲。

類似地,如果AI應用程序運行在設備上,例如在執行實時避免碰撞的自主車輛中或在進行實時路徑規劃決策的無人機中,則延遲對於車輛安全而言變得至關重要。功率效率同樣重要,因爲這些車輛在充電或加油之間可能需要幾天、幾周或幾個月。

今天,應用程序開發人員和領域專家使用GPU加速的深度學習框架,如Caffe、TensorFlow或PyTorch來訓練深度神經網絡來解決特定於應用程序的任務。這些框架通過探索網絡設計、執行模型評估和診斷以及使用新數據重新訓練模型,爲他們提供了原型解決方案的靈活性。

一旦對模型進行了訓練,開發人員通常會遵循以下部署方法之一。

使用諸如Caffe、TensorFlow或其他的訓練框架進行生產推理。

直接使用GPU加速的cuDNN和cuBLAS庫在內部構建自定義部署解決方案,以最小化框架開銷。

使用訓練框架或構建自定義部署解決方案以進行僅限CPU的推斷。

這些部署選項通常無法滿足關鍵的推斷需求,例如數百萬用戶的可伸縮性、同時處理多個輸入的能力,或者快速高效地交付結果的能力。

更正式地說,關鍵要求包括:

高吞吐量:部署的模型必須處理大量數據才能爲大量用戶服務。對可用資源的低效使用導致雲或數據中心成本增加,以及與服務較少用戶相關的機會成本。

低響應時間:移動設備上的語音識別和汽車碰撞檢測系統等應用要求在嚴格的低延遲閾值下獲得結果。無法在這些閾值下交付結果會對應用程序的用戶體驗產生負面影響,或者可能會危及汽車駕駛員的安全。

節能:對於部署在數據中心和低功耗嵌入式設備,節能至關重要。高功耗會增加成本,並可能使嵌入式部署解決方案變得棘手。

部署級解決方案:部署環境要求部署的軟件以最小的依賴性實現可靠和輕量級。爲模型構建、訓練和原型設計的深度學習框架包括額外的包和依賴項,這些包和依賴項會帶來不必要的開銷。

如果你是人工智能應用程序的開發人員,你可能會涉及到一些或所有這些挑戰與深入學習部署。NVIDIA TensorRT通過優化經過訓練的神經網絡來生成部署就緒的推理引擎,從而最大限度地提高GPU推理性能和功耗效率,從而解決了這些部署難題。TensorRT以最小的依賴性運行在每個GPU平臺上,從數據中心GPU(如P4和V100)到自主驅動和嵌入式平臺(如驅動器PX2和Jetson TX2)。

有關TensorRT和NVIDIA GPU如何提供高性能和高效的推理,從而顯著節省數據中心的成本和邊緣的功耗的更多信息,請參閱以下技術白皮書:NVIDIA AI推理技術概述。

Example: Deploying a TensorFlow model with TensorRT

雖然爲了完整起見,本文涵蓋了TensorRT的許多基礎知識,但是您可以回顧前面的文章,使用NVIDIA TensorRT部署深層神經網絡,瞭解更多細節。

TensorRT 3更快、更容易使用,並且引入了一些新特性,我們將在下面的代碼示例中回顧這些特性。GitHub上提供了本例中的Jupyter(iPython)筆記本。

這個簡單的例子演示了導入和優化一個經過訓練的TensorFlow神經網絡並將其部署爲TensorRT運行時引擎所需的步驟。該示例包括兩個不同的步驟:

Import and optimize trained models to generate inference engines導入和優化訓練模型生成推理機

在部署之前,我們只執行此步驟一次。我們使用TensorRT解析一個經過訓練的模型,並對目標部署GPU的批大小、精度和工作區內存等指定參數執行優化。這個步驟的輸出是一個優化的推理執行引擎,我們將磁盤上的一個名爲計劃文件的文件序列化。

Deploy generated runtime inference engine for inference

這是部署步驟。我們加載並反序列化保存的計劃文件以創建TensorRT引擎對象,並使用它在目標部署平臺上對新數據運行推斷。
在這裏插入圖片描述
在這裏插入圖片描述
Importing a trained model

有幾個深度學習框架,每個框架都有自己的神經網絡結構定義和訓練的模型文件格式。對於CAFE和TunSoFrices用戶,TunSRRT提供簡單方便的Python和C++ API來導入模型進行優化。
在這裏插入圖片描述
Figure 2. TensorRT provides model importers for Caffe and TensorFlow. Other framework models can be imported using the
Network Definition API.

然而,一些開源和商業框架,以及專有的內部開發工具,都有自己的網絡定義格式。您可以使用TensorRT的網絡定義API來指定網絡描述(使用C++或Python API),並將其加載到TensorRT中以進行優化。圖2顯示了將經過訓練的模型放入TensorRT的兩種不同方法。
不管您選擇什麼方法,一旦導入了模型,TensorRT就會執行與圖2中所示相同的一組模型優化。

我們將從導入必要的python包開始,並調用函數導入TensorFlow模型。這裏我們假設您已經安裝了TensorRT 3.0,並且有一個經過訓練的TensorFlow模型,您已經使用TensorFlow freeze_graph 工具將其導出爲凍結模型(.pb文件)。

這個例子使用了TensorRT3的Python API,但是你可以使用C++ API來做同樣的事情。

# Import
TensorRT Modules

import tensorrt as trt

import uff from tensorrt.parsers import uffparser

G_LOGGER = trt.infer.ConsoleLogger(trt.infer.LogSeverity.INFO)

# Load your
newly created Tensorflow frozen model and convert it to UFF

uff_model = uff.from_tensorflow_frozen_model(“keras_vgg19_frozen_graph.pb”, [“dense_2/Softmax”])

UFF代表通用框架格式,這是TensorRT的內部格式,用於在運行優化之前表示網絡圖。from_tensorflow_frozen_model()的第一個參數是凍結訓練模型。在本例中,我們使用的是Keras VGG19模型。第二個參數是輸出層名稱。

上述步驟的輸出是TensorFlow模型的UFF圖表示,該模型可以被TensorRT解析。我們通過提供輸入層的名稱和維度(CHW格式)以及輸出層的名稱來配置下面的UFF解析器。

# Create a UFF parser to parse the UFF file created from your TF Frozen modelparser = uff
parser.create_uff_parser()
parser.register_input(“input_1”, (3,224,224),0)
parser.register_output(“dense_2/Softmax”)

A Note on TensorRT Supported Layers

如今,神經網絡設計的許多創新都圍繞着新穎的定製層的發明展開。TensorRT支持下面列出的廣泛使用的標準層類型。這些應該滿足大多數神經網絡架構:

· Convolution

· LSTM and GRU

· Activation: ReLU, tanh, sigmoid

· Pooling: max and average

· Scaling

· Element wise operations

· LRN

· Fully-connected

· SoftMax

· Deconvolution

然而,深度學習是一個快速發展的領域,新的層次類型被頻繁引入。許多研究人員和開發人員發明了特定於其應用程序的自定義或專有層。TensorRT提供了一個自定義層API,使您能夠定義自己的自定義層,而這些層本機不受支持。這些自定義層使用C++定義,以便於使用高度優化的CUDA庫,如CUDNN和CUBLAS。TensorRT將在進行推理時使用您提供的自定義層實現,如圖3所示。
在這裏插入圖片描述
Figure 3. Custom layers can be integrated into the TensorRT runtime as plugins.

本例中VGG19網絡中的所有層都由TensorRT支持,因此我們不演示編寫插件的過程。有關代碼示例和編寫自定義層的詳細信息,請參閱TensorRT文檔。

TensorRT Optimizations

將模型導入TensorRT後,下一步稱爲構建階段,在該階段,您可以優化模型以執行運行時。TensorRT可以執行許多優化,如圖1所示:

層與張量融合及未利用層的消除;

FP16和INT8精度降低校準;

目標特定自動調諧;

高效的內存重用

構建階段需要在目標部署GPU平臺上運行。例如,如果應用程序要在Jetson TX2上運行,則需要在Jetson TX2上執行生成,同樣,如果推理服務將在帶有Tesla V100 gpu的AWS P3實例上的雲中運行,則生成階段需要在帶有Tesla V100的系統上運行。

這個步驟只執行一次,所以典型的應用程序只構建一個或多個引擎,然後將它們序列化以供以後使用。

TensorRT會在引擎蓋下爲您自動執行這些優化。您只需要指定要優化的UFF推理圖、推理批大小、工作區GPU內存量(用於CUDA內核暫存空間)和目標推理精度,如下代碼所示。

# Build your TensorRT inference engine# This step performs (1) Tensor fusion (2) Reduced precision # (3) Target autotuning (4) Tensor memory management
engine = trt.utils.uff_to_trt_engine(G_LOGGER, uff_model, parser, 1, 1<<20, trt.infer.DataType.FLOAT)

這裏的uff_模型是從Tensorflow凍結圖創建的,選項指定FP32推斷,批大小爲1和1MB的暫存空間。此步驟的輸出是一個優化的運行時引擎,可以進行推理。

讓我們仔細看看在優化步驟中引擎下面發生了什麼。

Optimization1: Layer & Tensor Fusion

TensorRT解析網絡計算圖並尋找執行圖優化的機會。這些圖優化不會改變圖中的底層計算:相反,它們希望重新構造圖以更快、更高效地執行操作。

爲了便於說明,圖4顯示了神經網絡圖的一部分。專家讀者可能會認爲這是2014年贏得ImageNet大賽的谷歌架構的“初始”模塊。
在這裏插入圖片描述
Figure 4. TensorRT’s vertical and horizontal layer fusion and layer elimination optimizations simplify the GoogLeNet Inception module graph, reducing computation and memory overhead.

當一個深度學習框架在推理過程中執行這個圖時,它會對每個層進行多個函數調用。由於每個操作都是在GPU上執行的,這就意味着要啓動多個CUDA內核。相對於內核啓動開銷和讀寫每個層的張量數據的成本,內核計算通常非常快。這會導致內存帶寬瓶頸和可用GPU資源利用率不足。

TensorRT通過垂直融合內核來實現這一點,以便一起執行順序操作。這種層融合減少了內核的啓動,避免了在層之間寫入和讀取內存。在圖4左側的網絡中,各種大小的卷積層、偏置層和ReLU層可以組合成一個稱爲CBR的內核,如圖4右側所示。一個簡單的類比是,三次分別去超市買三樣東西,而不是一次就買三樣東西。

TensorRT還可以識別共享相同輸入數據和過濾器大小但具有不同權重的層。TensorRT不使用三個獨立的內核,而是將它們水平地合併成一個更寬的內核,如圖4右側的1×1CBR層所示。

TensorRT還可以通過預先分配輸出緩衝區並以快速的方式寫入它們來消除圖4中的連接層(“concat”)。

總的來說,結果是一個更小、更快、更高效的圖形,具有更少的層和內核啓動,因此減少了推理延遲。表1顯示了一些常見圖像分類網絡的TensorRT圖優化結果。
在這裏插入圖片描述
ptimization2: FP16 and INT8 Precision Calibration

大多數深度學習框架訓練神經網絡完全32位精度(FP32)。一旦模型得到充分訓練,推理計算可以使用半精度FP16甚至INT8張量運算,因爲推理不需要梯度反向傳播。使用較低的精度會導致較小的模型大小、較低的內存利用率和延遲以及較高的吞吐量。
TensorRT可以在FP32、FP16和INT8中部署模型,並且在它們之間切換就像在uff_to_trt_engine函數中指定數據類型一樣簡單:

· For FP32, use trt.infer.DataType.FLOAT.

· For FP16 in and FP16 Tensor Cores on Volta GPUs, use trt.infer.DataType.HALF

· For INT8 inference, use trt.infer.DataType.INT8.

從表2中可以看出,INT8的動態範圍明顯小於全精度動態範圍。INT8只能表示256個不同的值。爲了將全精度信息量化爲INT8,同時最小化精度損失,TensorRT必須執行一個稱爲校準的過程,以確定如何最好地將權重和激活表示爲8位整數。

校準步驟要求您向TensorRT提供輸入訓練數據的代表性樣本。不需要對模型進行額外的微調或重新培訓,也不需要訪問整個培訓數據集。校準是將FP32轉換爲INT8的完全自動化和無參數方法。

在這個例子中,我們只演示了FP32和FP16的部署,請參閱TensorRT文檔中的代碼示例和有關如何執行校準步驟的更多詳細信息。
在這裏插入圖片描述
Optimization3: Kernel Auto-Tuning

在優化階段,TensorRT還從數百個專門的內核中進行選擇,其中許多是針對一系列參數和目標平臺進行手動調整和優化的。例如,有幾種不同的卷積算法。TensorRT將從內核庫中選擇實現,該庫爲目標GPU、輸入數據大小、過濾器大小、tensor佈局、批大小和其他參數提供最佳性能。

這可以確保部署的模型針對特定的部署平臺以及正在部署的特定神經網絡進行性能調整。

Optimization4: Dynamic Tensor Memory

TensorRT還通過僅在每個tensor使用期間爲其指定內存,從而減少內存佔用並改進內存重用,避免了快速高效執行的內存分配開銷。

TensorRT Optimization Performance Results

TensorRT所有優化的結果是,與在CPU或GPU上使用深度學習框架運行推理相比,模型運行更快、更有效。圖5中的圖表比較了CPU、Tesla V100 GPU和TensorFlow推理以及Tesla V100 GPU和TensorRT推理上ResNet-50網絡的圖像/秒推理性能。

使用TensorRT,與Tesla V100和CPU相比,您可以獲得高達40倍的更快的推理性能。在Volta GPU上運行TensorFlow模型的TensorRT推理在7毫秒的實時延遲要求下可以快18倍。
在這裏插入圖片描述
Figure 5. TensorRT inference performance compared to CPU-only inference and TensorFlow framework inference.

Serializing Optimized TensorRT Engines

TensorRT優化階段的輸出是一個可以序列化到磁盤的運行時推理引擎。此序列化文件稱爲“計劃”文件,其中包含運行時引擎用於執行網絡的序列化數據。它被稱爲計劃文件,因爲它不僅包括權重,還包括內核執行網絡的計劃。它還包括應用程序可以查詢的網絡信息,以確定如何綁定輸入和輸出緩衝區。

使用TensorRT的write_engine_to_file()函數執行序列化。

# Serialize TensorRT engine to a file for when you are ready to deploy your model.
trt.utils.write_engine_to_file(“keras_vgg19_b1_FP32.engine”, engine.serialize())

TensorRT Run-Time Inference

現在可以使用TensorRT部署應用程序了。爲了快速概括,到目前爲止,您已經將一個經過訓練的TensorFlow模型導入到TensorRT中,並執行了許多優化以生成運行時引擎。您已經將此引擎序列化爲引擎計劃文件。您離線執行了所有這些步驟,並且僅在部署之前執行了一次。

下一步是將序列化模型加載到運行時環境中,並對新數據執行推斷。爲了演示這個步驟,我們將使用TensorRT Lite API。這是一個高度抽象的接口,處理許多標準任務,如創建記錄器、從計劃文件反序列化引擎以創建運行時,以及爲引擎分配GPU內存。在推斷過程中,它還自動管理與GPU之間的數據傳輸,因此您只需創建一個引擎並開始處理數據。對於更細粒度的控件,您可以始終使用標準API或C++ API。

from tensorrt.lite import Enginefrom tensorrt.infer import LogSeverityimport tensorrt # Create a runtime engine from plan file using TensorRT Lite API
engine_single = Engine(PLAN=“keras_vgg19_b1_FP32.engine”, postprocessors={“dense_2/Softmax”:analyze})
images_trt, images_tf = load_and_preprocess_images()
results = []
for image in images_trt:
result = engine_single.infer(image) # Single function for inference
results.append(result)

Conclusion

TensorRT解決了深度學習部署的三個關鍵挑戰。

高吞吐量和低延遲:如圖5所示,TensorRT執行層融合、精確校準和目標自動調整,以在7毫秒實時延遲下,在Volta GPU上提供高達40倍的推理速度,以及高達18倍的TensorFlow模型推理速度。這意味着,由於更好地利用了GPU資源,您可以輕鬆地擴展您的AI應用程序以服務更多用戶。

功耗效率:通過針對特定目標的優化和動態內存管理,與深度學習框架推理相比,TensorRT提供了更高的功耗效率。低功耗設備運行時間更長,數據中心運行溫度更低。

部署級解決方案:TensorRT是爲部署而設計的。使用TensorRT,您可以部署一個輕量級運行時,而不需要框架依賴性和開銷。使用Python和C++接口,TensorRT可以很容易地從研究人員和數據科學家培訓模型、開發人員構建生產部署應用程序的每個人身上使用。

TensorRT 3現在可以免費下載給NVIDIA開發者程序的所有成員。請訪問TensorRT主頁瞭解更多信息並立即下載TensorRT!

TensorRT也可以作爲NVIDIA GPU雲上的容器在本地或AWS
P3實例上使用。註冊一個NGC帳戶,可以免費訪問TensorRT容器以及NVIDIA優化的深度學習框架容器進行培訓。

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