NVIDIA TensorRT 是一個用于深度學(xué)習(xí)推理的 SDK 。 TensorRT 提供 api 和解析器來從所有主要的深度學(xué)習(xí)框架中導(dǎo)入經(jīng)過訓(xùn)練的模型。然后生成可部署在數(shù)據(jù)中心、汽車和嵌入式環(huán)境中的優(yōu)化運(yùn)行時引擎。
這篇文章簡單介紹了如何使用 TensorRT 。您將學(xué)習(xí)如何在 GPU 上部署深度學(xué)習(xí)應(yīng)用程序,從而提高吞吐量并減少推理過程中的延遲。它使用 C ++示例來將您通過將 PyTorch 模型轉(zhuǎn)換成 ONX 模型并將其導(dǎo)入 TensorRT ,應(yīng)用優(yōu)化,并為數(shù)據(jù)中心環(huán)境生成高性能運(yùn)行時引擎。
TensorRT 支持 C ++和 Python ;如果使用了兩者,工作流討論可能是有用的。如果您喜歡使用 Pyth
深度學(xué)習(xí)應(yīng)用于廣泛的應(yīng)用,如自然語言處理、推薦系統(tǒng)、圖像和視頻分析。隨著越來越多的應(yīng)用程序在生產(chǎn)中使用深度學(xué)習(xí),對準(zhǔn)確性和性能的要求導(dǎo)致了模型復(fù)雜性和規(guī)模的強(qiáng)勁增長。
安全關(guān)鍵型應(yīng)用(如汽車)對深度學(xué)習(xí)模型的吞吐量和延遲提出了嚴(yán)格的要求。對于包括推薦系統(tǒng)在內(nèi)的一些消費(fèi)者應(yīng)用程序也是如此。
TensorRT 旨在幫助這些用例部署深度學(xué)習(xí)。通過對每一個主要框架的支持, TensorRT 通過強(qiáng)大的優(yōu)化、降低精度的使用和高效的內(nèi)存使用,幫助以低延遲處理大量數(shù)據(jù)。
為了繼續(xù)這篇文章,您需要一臺具有 CUDA -TensorRT 功能的計算機(jī),或者一個安裝了 GPUs 的云實(shí)例。在 Linux 上,最容易開始的地方是從 GPU 容器注冊表下載帶有 TensorRT 集成的 GPU – 加速的 PyTorch 集裝箱 。
示例應(yīng)用程序使用來自 Kaggle 的 腦 MRI 分割數(shù)據(jù) 的輸入數(shù)據(jù)來執(zhí)行推斷。
簡單 TensorRT 示例
以下是此示例應(yīng)用程序的四個步驟:
將預(yù)訓(xùn)練圖像分割 PyTorch 模型轉(zhuǎn)換為 ONNX 。
將 ONNX 模型導(dǎo)入到 TensorRT 中。
應(yīng)用優(yōu)化并生成引擎。
對 GPU 執(zhí)行推理。
導(dǎo)入 ONNX 模型包括從磁盤上保存的文件加載它,并將其從其本機(jī)框架或格式轉(zhuǎn)換為 TensorRT 網(wǎng)絡(luò)。 盒子 是一個表示深度學(xué)習(xí)模型的標(biāo)準(zhǔn),使其能夠在框架之間進(jìn)行轉(zhuǎn)換。
許多框架,如 Caffe2 、 Chainer 、 CNTK 、 paddlate 、 PyTorch 和 MXNet 都支持 ONNX 格式。接下來,根據(jù)輸入模型、目標(biāo) GPU 平臺和其他指定的配置參數(shù),構(gòu)建優(yōu)化的 TensorRT 引擎。最后一步是向 TensorRT 引擎提供輸入數(shù)據(jù)以執(zhí)行推理。
應(yīng)用程序在 TensorRT 中使用以下組件:
ONX parser : 將一個經(jīng)過 PyTorch 訓(xùn)練的模型轉(zhuǎn)換成 ONNX 格式作為輸入,并在 TensorRT 中填充一個網(wǎng)絡(luò)對象。
建設(shè)者: 使用 TensorRT 中的網(wǎng)絡(luò)并生成針對目標(biāo)平臺優(yōu)化的引擎。
發(fā)動機(jī): 獲取輸入數(shù)據(jù),執(zhí)行推斷,并發(fā)出推斷輸出。
記錄器: 與生成器和引擎關(guān)聯(lián),以在構(gòu)建和推理階段捕獲錯誤、警告和其他信息。
將預(yù)訓(xùn)練圖像分割 PyTorch 模型轉(zhuǎn)換為 ONNX
從 NGC 注冊表中的 PyTorch 集裝箱 開始,預(yù)先安裝框架和 CUDA 組件,準(zhǔn)備就緒。成功安裝 PyTorch 容器后,運(yùn)行以下命令下載運(yùn)行此示例應(yīng)用程序所需的所有內(nèi)容(示例代碼、測試輸入數(shù)據(jù)和引用輸出)、更新依賴項,并使用提供的 makefile 編譯應(yīng)用程序。
接下來,準(zhǔn)備輸入數(shù)據(jù)以進(jìn)行推斷。從 Kaggle 目錄下載所有圖像。將文件名中沒有_ mask 的任何三個映像復(fù)制到/ unet 目錄,然后實(shí)用工具。 py 來自 腦分割 -PyTorch 存儲庫的文件。準(zhǔn)備三張圖片作為后面文章的輸入數(shù)據(jù)。準(zhǔn)備輸入“ 0 ”。 pb 和輸出_ 0 。 pb 文件供以后使用,請運(yùn)行以下代碼示例:
就這樣,輸入數(shù)據(jù)就可以進(jìn)行推斷了。從應(yīng)用程序的簡化版本 simpleONNX _ 1 。 cpp 開始并在此基礎(chǔ)上進(jìn)行構(gòu)建。后續(xù)版本可在同一文件夾 simpleonx _ 2 。 cpp 和 simpleonx 。 cpp 。
將 ONNX 模型導(dǎo)入到 TensorRT ,生成引擎并進(jìn)行推理
使用經(jīng)過訓(xùn)練的模型和作為輸入傳遞的輸入數(shù)據(jù)運(yùn)行示例應(yīng)用程序。數(shù)據(jù)以 ONNX 協(xié)議文件的形式提供。示例應(yīng)用程序?qū)?TensorRT 生成的輸出與同一文件夾中可用的 ONNX 。 pb 文件的參考值進(jìn)行比較,并在提示符上總結(jié)結(jié)果。
導(dǎo)入 UNet ONNX 模型并生成引擎可能需要幾秒鐘的時間。它還生成便攜式灰度圖( PGM )格式的輸出圖像,如下所示:輸出。 pgm .
就這樣,你有一個用 TensorRT 優(yōu)化并運(yùn)行在你的 GPU 上的應(yīng)用程序。圖 2 顯示了一個示例測試用例的輸出。
圖 2 :使用 TensorRT 對大腦 MRI 圖像進(jìn)行推斷。
下面是前面示例應(yīng)用程序中使用的幾個關(guān)鍵代碼示例。
下面代碼示例中的 main 函數(shù)首先聲明一個 CUDA 引擎來保存網(wǎng)絡(luò)定義和經(jīng)過訓(xùn)練的參數(shù)。引擎是在 createCudaEngine 函數(shù)中生成的,該函數(shù)將指向 ONNX 模型的路徑作為輸入。
函數(shù)解析 ONNX 模型并將其保存在 createCudaEngine 對象中。要處理 U-Net 模型的輸入圖像和形狀張量的動態(tài)輸入尺寸,必須從 建設(shè)者 類創(chuàng)建一個優(yōu)化配置文件,如下面的代碼示例所示。
優(yōu)化配置文件 允許您設(shè)置外形的最佳輸入、最小和最大尺寸。構(gòu)建器選擇一個內(nèi)核,該內(nèi)核將導(dǎo)致輸入張量維度的最低運(yùn)行時間,并且對于最小和最大維度之間范圍內(nèi)的所有輸入張量維度都有效。它還將網(wǎng)絡(luò)對象轉(zhuǎn)換為 TensorRT 引擎。
下面代碼示例中的 setMaxBatchSize 函數(shù)用于指定 TensorRT 引擎預(yù)期的最大批處理大小。 setMaxWorkspaceSize 函數(shù)允許您在引擎構(gòu)建階段增加 GPU 內(nèi)存占用。
此應(yīng)用程序在下面的代碼示例所示的函數(shù) launchInference 中異步地向 GPU 發(fā)送推理請求。輸入從主機(jī)( CPU )復(fù)制到 launchInference 內(nèi)的設(shè)備( GPU ),然后使用 enqueue 函數(shù)執(zhí)行推理,結(jié)果異步復(fù)制回來。
CUDA 使用異步流 GPU 管理流。異步推理執(zhí)行通常通過重疊計算來提高性能,因為它最大化了 GPU 的利用率。 enqueue 函數(shù)將推理請求放在 CUDA 流上,并將批大小、指向輸入和輸出的指針以及用于內(nèi)核執(zhí)行的 CUDA 流作為輸入。使用 cudaMemcpyAsync 從主機(jī)到設(shè)備執(zhí)行異步數(shù)據(jù)傳輸,反之亦然。
在調(diào)用 launchInference 之后使用 cudaStreamSynchronize 函數(shù)可以確保在訪問結(jié)果之前完成 GPU 計算??梢允褂?ICUDA 發(fā)動機(jī) 類中的函數(shù)查詢輸入和輸出的數(shù)量以及每個輸入和輸出的值和維數(shù)。示例最后將參考輸出與 TensorRT 生成的推論進(jìn)行比較,并將差異打印到提示。
批量輸入
此應(yīng)用程序示例期望單個輸入,并在對其執(zhí)行推理后返回輸出。實(shí)際應(yīng)用通常是批量輸入,以獲得更高的性能和效率。一批形狀和大小相同的輸入可以在神經(jīng)網(wǎng)絡(luò)的不同層上并行計算。
較大的批處理通常能夠更有效地使用 GPU 資源。例如,在 Volta 和 TuringGPUs 上,使用 32 倍倍數(shù)的批處理大小可能特別快速有效,因為 TensorRT 可以使用特殊的核來進(jìn)行矩陣乘法和充分利用張量核的全連接層。
使用以下代碼在命令行上將圖像傳遞給應(yīng)用程序。在本例中,作為輸入?yún)?shù)在命令行上傳遞的圖像(。 pb 文件)的數(shù)量決定了批處理的大小。使用 test _ data _ set _ x 從所有目錄獲取所有輸入的_ 0 。 pb 文件。下面的命令不是只讀取一個輸入,而是讀取文件夾中所有可用的輸入。
目前,下載的數(shù)據(jù)有三個輸入目錄,因此批處理大小為 3 。此版本的示例分析應(yīng)用程序并將結(jié)果打印到提示符。有關(guān)更多信息,請參閱下一節(jié),概要介紹應(yīng)用程序。
接下來,使用 setMaxBatchSize 函數(shù)指定 TensorRT 引擎預(yù)期的最大批處理大小。然后,構(gòu)建器通過選擇在目標(biāo)平臺上最大化其性能的算法來生成一個針對該批處理大小進(jìn)行調(diào)整的引擎。雖然引擎不接受較大的批處理大小,但允許在運(yùn)行時使用較小的批處理大小。
最大 值的選擇取決于應(yīng)用程序以及任何給定時間的預(yù)期推理流量(例如,圖像的數(shù)量)。一個常見的做法是構(gòu)建多個針對不同批量大小優(yōu)化的引擎(使用不同的 最大 值),然后在運(yùn)行時選擇最優(yōu)化的引擎。
未指定時,默認(rèn)批處理大小為 1 ,這意味著引擎不處理大于 1 的批大小。按以下代碼示例所示設(shè)置此參數(shù):
分析應(yīng)用程序
現(xiàn)在您已經(jīng)看到了一個示例,下面是如何度量它的性能。網(wǎng)絡(luò)推理最簡單的性能度量是輸入到網(wǎng)絡(luò)和輸出返回之間經(jīng)過的時間,稱為 延遲。
對于嵌入式平臺上的許多應(yīng)用程序,延遲是至關(guān)重要的,而消費(fèi)者應(yīng)用程序需要服務(wù)質(zhì)量。較低的延遲使這些應(yīng)用程序更好。此示例使用 GPU 上的時間戳測量應(yīng)用程序的平均延遲。在 CUDA 中有很多方法可以評測您的應(yīng)用程序。有關(guān)詳細(xì)信息,請參見 如何在 CUDA C / C ++中實(shí)現(xiàn)性能度量 。
CUDA 為 創(chuàng)造 、 破壞 和 記錄 事件提供輕量級事件 API 函數(shù),并計算它們之間的時間。應(yīng)用程序可以在 CUDA 流中記錄事件,一個在啟動推理之前,另一個在推理完成后,如下面的代碼示例所示。
在某些情況下, MIG ht 關(guān)心在推理開始之前和推理完成之后在 GPU 和 CPU 之間傳輸數(shù)據(jù)所需的時間。有一些技術(shù)可以將數(shù)據(jù)預(yù)取到 GPU 中,也可以將計算與數(shù)據(jù)傳輸重疊,從而顯著地隱藏數(shù)據(jù)傳輸開銷。函數(shù) cudaEventElapsedTime 測量在 CUDA 流中遇到這兩個事件之間的時間。
使用上一節(jié)開頭的代碼示例運(yùn)行此示例并查看分析輸出。要評測應(yīng)用程序,請將推理啟動包裝在 simpleONNX _ 2 。 cpp 中的函數(shù) doInference 中。這個例子包括一個更新的函數(shù)調(diào)用。
許多應(yīng)用程序?qū)槊摍C(jī)處理而積累和批處理的大量輸入數(shù)據(jù)執(zhí)行推斷。每秒可能的最大推斷數(shù)被稱為 吞吐量 ,是這些應(yīng)用程序的一個有價值的指標(biāo)。
您可以通過為更大的特定批處理大小生成優(yōu)化的引擎來測量吞吐量,運(yùn)行推斷,并測量每秒可處理的批處理數(shù)。使用每秒的批數(shù)和批大小來計算每秒的推斷數(shù),但這超出了本文的范圍。
優(yōu)化應(yīng)用程序
現(xiàn)在,您已經(jīng)知道如何批量運(yùn)行推理并分析應(yīng)用程序,請對其進(jìn)行優(yōu)化。 TensorRT 的關(guān)鍵優(yōu)勢在于其靈活性和技術(shù)的使用,包括混合精度、在所有 GPU 平臺上的高效優(yōu)化,以及跨多種模型類型進(jìn)行優(yōu)化的能力。
在本節(jié)中,我們將介紹一些提高吞吐量和減少應(yīng)用程序延遲的技術(shù)。有關(guān)詳細(xì)信息,請參見 TensorRT 性能最佳實(shí)踐 。
以下是一些常見的技巧:
使用混合精度計算
更改工作區(qū)大小
重新使用 TensorRT 引擎
使用混合精度計算
TensorRT 默認(rèn)情況下使用 FP32 算法進(jìn)行推理,以獲得最高的推理精度。但是,在許多情況下,可以使用 FP16 和 INT8 精度進(jìn)行推理,對結(jié)果的準(zhǔn)確性影響最小。
使用降低的精度來表示模型可以使您在內(nèi)存中適合更大的模型,并在降低精度的數(shù)據(jù)傳輸要求較低的情況下實(shí)現(xiàn)更高的性能。您還可以將 FP32 和 FP16 精度中的計算與 TensorRT 混合使用,稱為混合精度,或者對權(quán)重、激活和執(zhí)行層使用 INT8 量化精度。
對于支持快速 FP16 數(shù)學(xué)的設(shè)備,通過將 setFp16Mode 參數(shù)設(shè)置為 true 來啟用 FP16 內(nèi)核。
setFp16Mode 參數(shù)向構(gòu)建器表明,較低的計算精度是可以接受的。 TensorRT 如果 FP16 優(yōu)化內(nèi)核在所選配置和目標(biāo)平臺上表現(xiàn)更好,則使用它們。
啟用此模式后,可以在 FP16 或 FP32 中指定權(quán)重,并自動轉(zhuǎn)換為計算所需的適當(dāng)精度。您還可以靈活地為輸入和輸出張量指定 16 位浮點(diǎn)數(shù)據(jù)類型,這超出了本文的范圍。
更改工作區(qū)大小
TensorRT 允許您在引擎構(gòu)建階段使用 setMaxWorkspaceSize 函數(shù)增加 GPU 內(nèi)存占用。增加限制可能會影響同時共享 GPU 的應(yīng)用程序的數(shù)量。將此限制設(shè)置得太低可能會過濾掉一些算法并創(chuàng)建一個次優(yōu)引擎。 TensorRT 只分配所需的內(nèi)存,即使在 IBuilder::setMaxWorkspaceSize 中設(shè)置的內(nèi)存量要高得多。因此,應(yīng)用程序應(yīng)該允許 TensorRT 生成器盡可能多的工作空間。 TensorRT 分配不超過這個值,通常更少。
這個例子使用 1GB ,這讓 TensorRT 選擇任何可用的算法。
重新使用 TensorRT 引擎
構(gòu)建引擎時, builder 對象為所選平臺和配置選擇最優(yōu)化的內(nèi)核。從網(wǎng)絡(luò)定義文件構(gòu)建引擎可能非常耗時,并且不應(yīng)在每次執(zhí)行推斷時重復(fù),除非模型、平臺或配置發(fā)生更改。
圖 3 顯示,您可以在生成后轉(zhuǎn)換引擎的格式,并將其存儲在磁盤上以供以后重用,稱為 序列化引擎 。反序列化發(fā)生在將引擎從磁盤加載到內(nèi)存中并繼續(xù)使用它進(jìn)行推理時。
圖 3 。序列化和反序列化 TensorRT 引擎。
運(yùn)行時對象反序列化引擎。
而不是每次都創(chuàng)建引擎, simpleonx 。 cpp 包含 getCudaEngine 函數(shù)來加載并使用引擎(如果存在)。如果引擎不可用,它將創(chuàng)建引擎并將其保存在當(dāng)前目錄中,名稱為 unet _ batch4 。 engine 。在這個例子嘗試構(gòu)建一個新引擎之前,如果當(dāng)前目錄中有這個引擎,它會選擇它。
要強(qiáng)制使用更新的配置和參數(shù)構(gòu)建新引擎,請在重新運(yùn)行代碼示例之前,使用 makeclean _ engines 命令刪除存儲在磁盤上的所有現(xiàn)有序列化引擎。
將此保存的引擎用于不同的批處理大小。下面的代碼示例獲取輸入數(shù)據(jù),與批處理大小變量重復(fù)相同的次數(shù),然后將附加的輸入傳遞給示例。第一次運(yùn)行創(chuàng)建引擎,第二次運(yùn)行嘗試反序列化引擎。
現(xiàn)在您已經(jīng)了解了如何使用 TensorRT 加快簡單應(yīng)用程序的推理速度。我們用 TensorRT 7 測量了 NVIDIA Titan VGPUs 的早期性能。
下一步行動
真實(shí)世界的應(yīng)用程序有更高的計算需求,更大的深度學(xué)習(xí)模型,更多的數(shù)據(jù)處理需求,以及更嚴(yán)格的延遲限制。 TensorRT 為計算量大的深度學(xué)習(xí)應(yīng)用程序提供了高性能的優(yōu)化,是一個非常寶貴的推理工具。
希望這篇文章讓您熟悉了使用 TensorRT 獲得驚人性能所需的關(guān)鍵概念。這里有一些想法可以應(yīng)用您所學(xué)的,使用其他模型,并通過更改本文中介紹的參數(shù)來探索設(shè)計和性能權(quán)衡的影響。
TensorRT 支持矩陣 為 TensorRT api 、解析器和層提供了受支持的特性和軟件。這個例子使用 C ++, TensorRT 同時提供 C ++和 Python API 。若要運(yùn)行此帖子中包含的示例應(yīng)用程序,請參見 TensorRT 開發(fā)者指南 中的 API 和 Python 和 C ++代碼示例。
使用參數(shù) setFp16Mode 將模型的允許精度更改為 true / false ,并分析應(yīng)用程序以查看性能差異。
更改運(yùn)行時用于推斷的批處理大小,并查看這如何影響模型和數(shù)據(jù)集的性能(延遲、吞吐量)。
將 最大值 參數(shù)從 64 改為 4 ,可以看到在前五個內(nèi)核中選擇了不同的內(nèi)核。使用 Nprof 公司 查看分析結(jié)果中的內(nèi)核。
本文未涉及的一個主題是在 TensorRT 中以 INT8 精度精確地執(zhí)行推理。 TensorRT 自動轉(zhuǎn)換 FP32 網(wǎng)絡(luò)以進(jìn)行部署,同時降低精度損失。為了實(shí)現(xiàn)這一目標(biāo), TensorRT 使用了一種校準(zhǔn)過程,在用有限的 8 位整數(shù)表示來近似 FP32 網(wǎng)絡(luò)時,可以將信息損失最小化。有關(guān)詳細(xì)信息,請參見 基于 TensorRT 3 的自主車輛快速 INT8 推理 。
有許多資源可以幫助您加速圖像/視頻、語音應(yīng)用程序和推薦系統(tǒng)的應(yīng)用程序。這些工具從代碼示例、自行掌握進(jìn)度的深度學(xué)習(xí)機(jī)構(gòu)實(shí)驗室和教程到用于分析和調(diào)試應(yīng)用程序的開發(fā)工具。
TensorRT 簡介 (網(wǎng)絡(luò)研討會)
TensorRT 最佳實(shí)踐指南
TensorRT 4 概述
TensorRT 4 的神經(jīng)機(jī)器翻譯
使用 TensorRT 進(jìn)行 8 位推理
使用 TensorRT 優(yōu)化` NMT
關(guān)于作者
About Houman Abbasian是 NVIDIA 的高級深度學(xué)習(xí)軟件工程師。他一直致力于開發(fā)和生產(chǎn) NVIDIA 在自動駕駛車輛中的深度學(xué)習(xí)解決方案,提高 DNN 的推理速度、精度和功耗,并實(shí)施和試驗改進(jìn) NVIDIA 汽車 DNN 的新思想。他在渥太華大學(xué)獲得計算機(jī)科學(xué)博士學(xué)位,專注于機(jī)器學(xué)習(xí)
About Josh Park是 NVIDIA 的汽車解決方案架構(gòu)師經(jīng)理。到目前為止,他一直在研究使用 DL 框架的深度學(xué)習(xí)解決方案,例如在 multi-GPUs /多節(jié)點(diǎn)服務(wù)器和嵌入式系統(tǒng)上的 TensorFlow 。此外,他一直在評估和改進(jìn)各種 GPUs + x86 _ 64 / aarch64 的訓(xùn)練和推理性能。他在韓國大學(xué)獲得理學(xué)學(xué)士和碩士學(xué)位,并在德克薩斯農(nóng)工大學(xué)獲得計算機(jī)科學(xué)博士學(xué)位
About Siddharth Sharma是NVIDIA 加速計算的高級技術(shù)營銷經(jīng)理。在加入NVIDIA 之前, Siddharth 是 Mathworks Simulink 和 Stateflow 的產(chǎn)品營銷經(jīng)理,與汽車和航空航天公司密切合作,采用基于模型的設(shè)計來創(chuàng)建控制軟件。
About Sirisha Rella 是 NVIDIA 的技術(shù)產(chǎn)品營銷經(jīng)理,專注于計算機(jī)視覺、語音和基于語言的深度學(xué)習(xí)應(yīng)用。 Sirisha 獲得了密蘇里大學(xué)堪薩斯城分校的計算機(jī)科學(xué)碩士學(xué)位,是國家科學(xué)基金會大學(xué)習(xí)中心的研究生助理。
審核編輯:郭婷
-
NVIDIA
+關(guān)注
關(guān)注
14文章
5019瀏覽量
103250 -
gpu
+關(guān)注
關(guān)注
28文章
4752瀏覽量
129057
發(fā)布評論請先 登錄
相關(guān)推薦
評論