本章概述了您可以使用 TensorRT 做什么。它旨在對所有 TensorRT 用戶有用。
TensorRT 的 API 具有 C++ 和 Python 的語言綁定,具有幾乎相同的功能。 Python API 促進了與 Python 數據處理工具包和庫(如 NumPy 和 SciPy)的互操作性。 C++ API 可以更高效,并且可以更好地滿足某些合規(guī)性要求,例如在汽車應用中。 注意: Python API 并非適用于所有平臺。
2.2. The Programming Model
TensorRT 構建階段的最高級別接口是Builder ( C++ 、 Python )。構建器負責優(yōu)化模型并生成Engine 。
為了構建引擎,您需要:
創(chuàng)建網絡定義
為builder指定配置
調用builder創(chuàng)建引擎
NetworkDefinition接口( C++ 、 Python )用于定義模型。將模型傳輸到 TensorRT 的最常見途徑是以 ONNX 格式從框架中導出模型,并使用 TensorRT 的 ONNX 解析器來填充網絡定義。但是,您也可以使用 TensorRT 的Layer ( C++ , Python ) 和Tensor ( C++ , Python ) 接口逐步構建定義。
無論您選擇哪種方式,您還必須定義哪些張量是網絡的輸入和輸出。未標記為輸出的張量被認為是可以由構建器優(yōu)化掉的瞬態(tài)值。輸入和輸出張量必須命名,以便在運行時,TensorRT 知道如何將輸入和輸出緩沖區(qū)綁定到模型。
BuilderConfig接口( C++ 、 Python )用于指定TensorRT如何優(yōu)化模型。在可用的配置選項中,您可以控制 TensorRT 降低計算精度的能力,控制內存和運行時執(zhí)行速度之間的權衡,以及限制對 CUDA ?內核的選擇。由于構建器可能需要幾分鐘或更長時間才能運行,因此您還可以控制構建器搜索內核的方式,以及緩存搜索結果以供后續(xù)運行使用。
一旦有了網絡定義和構建器配置,就可以調用構建器來創(chuàng)建引擎。構建器消除了無效計算、折疊常量、重新排序和組合操作以在 GPU 上更高效地運行。它可以選擇性地降低浮點計算的精度,方法是簡單地在 16 位浮點中運行它們,或者通過量化浮點值以便可以使用 8 位整數執(zhí)行計算。它還使用不同的數據格式對每一層的多次實現(xiàn)進行計時,然后計算執(zhí)行模型的最佳時間表,從而最大限度地降低內核執(zhí)行和格式轉換的綜合成本。
構建器以稱為計劃的序列化形式創(chuàng)建引擎,該計劃可以立即反序列化,或保存到磁盤以供以后使用。
注意:
TensorRT 創(chuàng)建的引擎特定于創(chuàng)建它們的 TensorRT 版本和創(chuàng)建它們的 GPU。
TensorRT 的網絡定義不會深度復制參數數組(例如卷積的權重)。因此,在構建階段完成之前,您不得釋放這些陣列的內存。使用 ONNX 解析器導入網絡時,解析器擁有權重,因此在構建階段完成之前不得將其銷毀。
構建器時間算法以確定最快的。與其他 GPU 工作并行運行構建器可能會擾亂時序,導致優(yōu)化不佳。
2.2.2. The Runtime Phase
TensorRT 執(zhí)行階段的最高級別接口是Runtime( C++ 、 Python )。 使用運行時時,您通常會執(zhí)行以下步驟:
反序列化創(chuàng)建引擎的計劃(plan 文件)
從引擎創(chuàng)建執(zhí)行上下文(context) 然后,反復:
填充輸入緩沖區(qū)以進行推理
調用enqueue()或execute()以運行推理
Engine接口( C++ 、 Python )代表一個優(yōu)化模型。您可以查詢引擎以獲取有關網絡輸入和輸出張量的信息——預期的維度、數據類型、數據格式等。
ExecutionContext接口( C++ 、 Python )是調用推理的主要接口。執(zhí)行上下文包含與特定調用關聯(lián)的所有狀態(tài) – 因此您可以擁有與單個引擎關聯(lián)的多個上下文,并并行運行它們。
調用推理時,您必須在適當的位置設置輸入和輸出緩沖區(qū)。根據數據的性質,這可能在 CPU 或 GPU 內存中。如果根據您的模型不明顯,您可以查詢引擎以確定在哪個內存空間中提供緩沖區(qū)。
設置緩沖區(qū)后,可以同步(執(zhí)行)或異步(入隊)調用推理。在后一種情況下,所需的內核在 CUDA 流上排隊,并盡快將控制權返回給應用程序。一些網絡需要在 CPU 和 GPU 之間進行多次控制傳輸,因此控制可能不會立即返回。要等待異步執(zhí)行完成,請使用cudaStreamSynchronize在流上同步。
2.3. Plugins
TensorRT 有一個Plugin接口,允許應用程序提供 TensorRT 本身不支持的操作的實現(xiàn)。在轉換網絡時,ONNX 解析器可以找到使用 TensorRT 的PluginRegistry創(chuàng)建和注冊的插件。
TensorRT 附帶一個插件庫,其中許多插件和一些附加插件的源代碼可以在此處找到。
請參閱使用自定義層擴展 TensorRT一章。
2.4. Types and Precision
TensorRT 支持使用 FP32、FP16、INT8、Bool 和 INT32 數據類型的計算。 當 TensorRT 選擇 CUDA 內核在網絡中實現(xiàn)浮點運算時,它默認為 FP32 實現(xiàn)。有兩種方法可以配置不同的精度級別:
為了在模型級別控制精度, BuilderFlag選項( C++ 、 Python )可以向 TensorRT 指示它在搜索最快時可能會選擇較低精度的實現(xiàn)(并且因為較低的精度通常更快,如果允許的話,它通常會)。 因此,您可以輕松地指示 TensorRT 為您的整個模型使用 FP16 計算。對于輸入動態(tài)范圍約為 1 的正則化模型,這通常會產生顯著的加速,而準確度的變化可以忽略不計。
對于更細粒度的控制,由于網絡的一部分對數值敏感或需要高動態(tài)范圍,因此層必須以更高的精度運行,可以為該層指定算術精度。
請參閱降低精度部分。
2.5. Quantization
TensorRT 支持量化浮點,其中浮點值被線性壓縮并四舍五入為 8 位整數。這顯著提高了算術吞吐量,同時降低了存儲要求和內存帶寬。在量化浮點張量時,TensorRT 需要知道它的動態(tài)范圍——即表示什么范圍的值很重要——量化時會鉗制超出該范圍的值。
動態(tài)范圍信息可由構建器根據代表性輸入數據計算(這稱為校準–calibration)?;蛘?,您可以在框架中執(zhí)行量化感知訓練,并將模型與必要的動態(tài)范圍信息一起導入到 TensorRT。
請參閱使用 INT8章節(jié)。
2.6. Tensors and Data Formats
在定義網絡時,TensorRT 假設張量由多維 C 樣式數組表示。每一層對其輸入都有特定的解釋:例如,2D 卷積將假定其輸入的最后三個維度是 CHW 格式 – 沒有選項可以使用,例如 WHC 格式。有關每個層如何解釋其輸入,請參閱TensorRT 網絡層一章。
請注意,張量最多只能包含 2^31-1 個元素。 在優(yōu)化網絡的同時,TensorRT 在內部執(zhí)行轉換(包括到 HWC,但也包括更復雜的格式)以使用盡可能快的 CUDA 內核。通常,選擇格式是為了優(yōu)化性能,而應用程序無法控制這些選擇。然而,底層數據格式暴露在 I/O 邊界(網絡輸入和輸出,以及將數據傳入和傳出插件),以允許應用程序最大限度地減少不必要的格式轉換。
請參閱I/O 格式部分
2.7. Dynamic Shapes
默認情況下,TensorRT 根據定義時的輸入形狀(批量大小、圖像大小等)優(yōu)化模型。但是,可以將構建器配置為允許在運行時調整輸入維度。為了啟用此功能,您可以在構建器配置中指定一個或多個OptimizationProfile ( C++ 、 Python )實例,其中包含每個輸入的最小和最大形狀,以及該范圍內的優(yōu)化點。
TensorRT 為每個配置文件創(chuàng)建一個優(yōu)化的引擎,選擇適用于 [最小、最大] 范圍內的所有形狀的 CUDA 內核,并且對于優(yōu)化點來說是最快的——通常每個配置文件都有不同的內核。然后,您可以在運行時在配置文件中進行選擇。
請參閱使用動態(tài)形狀一章。
2.8. DLA
TensorRT 支持 NVIDIA 的深度學習加速器 (DLA),這是許多 NVIDIA SoC 上的專用推理處理器,支持 TensorRT 層的子集。 TensorRT 允許您在 DLA 上執(zhí)行部分網絡,而在 GPU 上執(zhí)行其余部分;對于可以在任一設備上執(zhí)行的層,您可以在構建器配置中逐層選擇目標設備。
請參閱使用 DLA章節(jié)。
2.9. Updating Weights
在構建引擎時,您可以指定它可能需要稍后更新其權重。如果您經常在不更改結構的情況下更新模型的權重,例如在強化學習中或在保留相同結構的同時重新訓練模型時,這將很有用。權重更新是通過Refitter ( C++ , Python ) 接口執(zhí)行的。
請參閱Refitting An Engine 部分。
2.10. trtexec
示例目錄中包含一個名為trtexec的命令行包裝工具。 trtexec是一種無需開發(fā)自己的應用程序即可快速使用 TensorRT 的工具。 trtexec工具有三個主要用途:
在隨機或用戶提供的輸入數據上對網絡進行基準測試。
從模型生成序列化引擎。
從構建器生成序列化時序緩存。
請參閱trtexec部分。
2.11. Polygraphy
Polygraphy 是一個工具包,旨在幫助在 TensorRT 和其他框架中運行和調試深度學習模型。它包括一個Python API和一個使用此 API 構建的命令行界面 (CLI) 。
除此之外,使用 Polygraphy,您可以:
在多個后端之間運行推理,例如 TensorRT 和 ONNX-Runtime,并比較結果(例如API 、 CLI )
將模型轉換為各種格式,例如具有訓練后量化的 TensorRT 引擎(例如API 、 CLI )
查看有關各種類型模型的信息(例如CLI )
在命令行上修改 ONNX 模型:
提取子圖(例如CLI )
簡化和清理(例如CLI )
隔離 TensorRT 中的錯誤策略(例如CLI )
關于作者
Ken He 是 NVIDIA 企業(yè)級開發(fā)者社區(qū)經理 & 高級講師,擁有多年的 GPU 和人工智能開發(fā)經驗。自 2017 年加入 NVIDIA 開發(fā)者社區(qū)以來,完成過上百場培訓,幫助上萬個開發(fā)者了解人工智能和 GPU 編程開發(fā)。在計算機視覺,高性能計算領域完成過多個獨立項目。并且,在機器人和無人機領域,有過豐富的研發(fā)經驗。對于圖像識別,目標的檢測與跟蹤完成過多種解決方案。曾經參與 GPU 版氣象模式GRAPES,是其主要研發(fā)者。
審核編輯:郭婷
-
NVIDIA
+關注
關注
14文章
5079瀏覽量
103805 -
gpu
+關注
關注
28文章
4785瀏覽量
129404 -
人工智能
+關注
關注
1796文章
47768瀏覽量
240496
發(fā)布評論請先 登錄
相關推薦
無人機自動巡檢系統(tǒng)功能與應用
工業(yè)繼電器的功能與作用分析
在NVIDIA TensorRT-LLM中啟用ReDrafter的一些變化
![在NVIDIA <b class='flag-5'>TensorRT</b>-LLM中啟用ReDrafter的一些變化](https://file1.elecfans.com/web3/M00/03/BF/wKgZPGdr0WaAWiI-AAATzNjpSz0481.png)
解鎖NVIDIA TensorRT-LLM的卓越性能
NVIDIA TensorRT-LLM Roadmap現(xiàn)已在GitHub上公開發(fā)布
![NVIDIA <b class='flag-5'>TensorRT</b>-LLM Roadmap現(xiàn)已在GitHub上公開發(fā)布](https://file1.elecfans.com/web3/M00/00/42/wKgZO2dH2UeALMQdAABTS5uU1Rg392.png)
工業(yè)物聯(lián)網盒子核心功能與技術特點
TensorRT-LLM低精度推理優(yōu)化
![<b class='flag-5'>TensorRT</b>-LLM低精度推理優(yōu)化](https://file1.elecfans.com/web1/M00/F5/62/wKgZoWc8MUuACQJOAAARWw9PFe0355.jpg)
MCU性能與功能:優(yōu)化設計的關鍵
LIMS系統(tǒng)的功能與特點分析
將RAM清除功能與bq3285/bq3287A RTC結合使用
![將RAM清除<b class='flag-5'>功能與</b>bq3285/bq3287A RTC結合使用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
電子地圖的主要功能與應用
![電子地圖的主要<b class='flag-5'>功能與</b>應用](https://file1.elecfans.com/web2/M00/07/0D/wKgaombiXYaAWzJxAABFoIqYWSs928.png)
評論