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