TRT8系列—— 版本差異注意事項

????????TRT8 一個大版本,8.4-、 8.5、 8.6(包含預覽功能)卻有很多變動,一不注意就發現很混亂,特備注此貼。建議具體case可以參考這個合集,真心安利:https://github.com/NVIDIA/trt-samples-for-hackathon-cn/tree/master/cookbook

版本差異概述

1)當前使用了8.4;
參考: https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/01-SimpleDemo/TensorRT8.0/main-cuda.py
2)8.5版本廢棄了binding, 導致開內存代碼不同;
參考: https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/01-SimpleDemo/TensorRT8.5/main.py
3)8.6版本以后支持dynamic shape統一個profile 用于不同的context。不再支持Pascal (P40),但完全改變了原來TRT engine必須綁定硬件和版本的要求, 現在可以解耦出來,但是有如下限制:

1、binding 改變

1)8.5前需要使用biding 接口

對應dynamic batch 多個profile 需要計算偏置。偏置或者說index 是針對profile (同一個engine)的不是針對context的。下圖是一個engine里有3個profile,模型有4個輸入1個輸出,那么就有(4+1)*3 =15個binding。
engine.num_bindings 獲取binding 總數
engine.binding_is_input 計算出input數量(每個profile里 算一個, engine.binding_is_inpu?// nProfile 才是模型的輸入個數)
context.set_binding_shape 設置輸入輸出的維度,如上面表格需要計算出pad和對應輸入輸出的順序index
contex.get_binding_shape 獲得對應profile 的輸出的維度
context.execute_async_v2 執行推理,這里傳入的第一個參數為輸出輸出GPU顯存的地址,并且需要填滿如上的表格,不用的位置填0。
完整代碼: https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/08-Advance/MultiOptimizationProfile/main-BindingAPI.py
logger = trt.Logger(trt.Logger.ERROR)
engine = trt.Runtime(logger).deserialize_cuda_engine(engineString) # engineString 是二進制 open engine文件
nIO = engine.num_bindings
nInput = np.sum([engine.binding_is_input(i) for i in range(engine.num_bindings)])
nOutput = nIO - nInput
nIO, nInput, nOutput = nIO // nProfile, nInput // nProfile, nOutput // nProfile
context = engine.create_execution_context()
context.set_optimization_profile_async(index, stream)
bindingPad = nIO * index_profile? # 計算binding 的偏置
context.set_binding_shape(bindingPad + 0, inputShape) # 第一個輸入
outputShape = contex.get_binding_shape(bindingPad + nInput + 0) # 第一個輸出
bufferList = [int(0) for b in bufferD[:bindingPad]] + \[int(b) for b in bufferD[bindingPad:(bindingPad + nInput + nOutput)]] + \[int(0) for b in bufferD[(bindingPad + nInput + nOutput):]]
context.execute_async_v2(bufferList, stream)

2)8.5 之后廢棄binding

使用范例如下
engine.num_io_tensors ?獲取輸入輸出總個數
engine.get_tensor_name ?獲得對應的輸入輸出名字
engine.get_tensor_mode 判斷是輸入還是輸出(trt.TensorIOMode.INPUT 、trt.TensorIOMode.OUTPUT)
context.set_input_shape 直接設置對應的形狀,不再需要計算偏置
context.get_tensor_shape 直接獲得輸入輸出(需要先設置輸入自動計算)形狀
context.set_tensor_address 綁定TRT 輸入輸出和 開辟的顯存
context.execute_async_v3 來執行推理
完整代碼: https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/08-Advance/MultiOptimizationProfile/main.py
logger = trt.Logger(trt.Logger.ERROR)
engine = trt.Runtime(logger).deserialize_cuda_engine(engineString) # engineString 是二進制 open engine文件
nIO = engine.num_io_tensors
lTensorName = [engine.get_tensor_name(i) for i in range(nIO)]
nInput = [engine.get_tensor_mode(lTensorName[i]) for i in range(nIO)].count(trt.TensorIOMode.INPUT)
context = engine.create_execution_context()
context.set_optimization_profile_async(index, stream)
context.set_input_shape(lTensorName[0], inputShape)
outputShape = context.get_tensor_shape(lTensorName[1])
context.set_tensor_address(lTensorName[0], int(cudart.cudaMalloc(nbytes)[1]))
context.execute_async_v3(0)

2、dynamic shape 性能

如果跨度較大建議使用多個配置文件,可以明顯提升推理性能
參考:
Developer Guide :: NVIDIA Deep Learning TensorRT Documentation
https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/09-BestPractice/UsingMultiOptimizationProfile/result-A30.md
https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/09-BestPractice/UsingMultiOptimizationProfile/main.py
獲得真實推理形狀(假設真實為(3,150,150)),要使用 context.get_tensor_shape(0)?(返回 (3, 150, 250)),而不是 engine.get_tensor_shape("foo”) ?(返回? (3, -1, -1) ?。

3、engine、 context、stream、profile(動態batch的配置文件)

一個engine 可以擁有多個context,共享一個權重。
可以將不同的context 放到不同的stream 中,實現并行。
一個context可以擁有多個profile(至少一個),但是8.6 0805預覽特性前,一個profile 只能綁定一個context(context 和profile 需要錯開使用)。
參考:
多流(8.6): https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/08-Advance/MultiStream/main.py
多上下文-動態batch(8.6+): https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/08-Advance/MultiContext/main.py?
多上下文-動態batch(8.5-): https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/08-Advance/MultiContext/main-MultiOptimizationProfile.py

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41250.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go語言GIN框架安裝與入門

Go語言GIN框架安裝與入門 文章目錄 Go語言GIN框架安裝與入門1. 創建配置環境2. 配置環境3. 下載最新版本Gin4. 編寫第一個接口5. 靜態頁面和資源文件加載6. 各種傳參方式6.1 URL傳參6.2 路由形式傳參6.3 前端給后端傳遞JSON格式6.4 表單形式傳參 7. 路由和路由組8. 項目代碼mai…

GaussDB 實驗篇+openGauss的4種1級分區案例

? 范圍分區/range分區 -- 創建表 drop table if exists zzt.par_range; create table if not exists zzt.par_range (empno integer,ename char(10),job char(9),mgr integer(4),hiredate date,sal numeric(7,2),comm numeric(7,2),deptno integer,constraint pk_par_emp pri…

除自身以外數組的乘積(c語言詳解)

題目:除自身外數組的乘積 給你一個整數數組 nums,返回 數組 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據保證數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請不要使用除…

Android Studio實現解析HTML獲取圖片URL,將URL存到list,進行瀑布流展示

目錄 效果展示build.gradle(app)添加的依賴(用不上的可以不加)AndroidManifest.xml錯誤代碼activity_main.xmlitem_image.xmlMainActivityImage適配器ImageModel 接收圖片URL效果展示 build.gradle(app)添加的依賴(用不上的可以不加) dependencies {implementation co…

Android 13 像Settings一樣開啟關閉深色模式

一.背景 由于客戶定制的Settings需要開啟關閉深色模式,所以需要自己調用開啟關閉深色模式 二.前提條件 首先應用肯定要是系統應用,并且導入framework.jar包,具體可以參考: Android 應用自動開啟輔助(無障礙)功能并使用輔助(無障礙)功能_android 自動開啟無障礙服務_龔禮鵬…

Java版電子招投標管理系統源碼-電子招投標認證服務平臺-權威認證 tbms

? 功能描述 1、門戶管理:所有用戶可在門戶頁面查看所有的公告信息及相關的通知信息。主要板塊包含:招標公告、非招標公告、系統通知、政策法規。 2、立項管理:企業用戶可對需要采購的項目進行立項申請,并提交審批,…

Neo4j之CREATE基礎

在 Neo4j 中,CREATE 語句用于創建節點、關系以及節點屬性。 創建節點: CREATE (p:Person {name: John, age: 30});這個查詢會創建一個具有 "Person" 標簽的節點,節點屬性包括 "name" 和 "age"。 創建帶有關…

【java畢業設計】基于Spring Boot+Vue+mysql的論壇管理系統設計與實現(程序源碼)-論壇管理系統

基于Spring BootVuemysql的論壇管理系統設計與實現(程序源碼畢業論文) 大家好,今天給大家介紹基于Spring BootVuemysql的論壇管理系統設計與實現,本論文只截取部分文章重點,文章末尾附有本畢業設計完整源碼及論文的獲取…

創建遠程倉庫以及分支

1、 創建遠程倉庫 這里有兩種方式 1.1 利用git的插件有Gitee、GitHub。 來到 GitHub 中發現已經幫我們創建好了 gitTest 的遠程倉庫。 1.2 通過Push的方式推送本地庫到遠程庫 這種方式需要提前創建好倉庫。 右鍵點擊項目,可以將當前分支的內容 push 到 GitHub 的遠…

Python爬蟲——scrapy_工作原理

引擎向spiders要url引擎把將要爬取的url給調度器調度器會將url生成的請求對象放入到指定的隊列中從隊列中出隊一個請求引擎將請求交給下載器進行處理下載器發送請求獲取互聯網數據下載器將數據返回給引擎引擎將數據再次給到spidersspiders通過xpath解析該數據,得到數…

vue3+ts+tsx的使用與好處(語法方面:tsx==jsx)

前言: 整理分享下vue3tstsx相關的資料,有react使用經驗的小伙伴應該更能理解這個的好處,終于在vue3中也支持了,相當于函數的方法來操作界面。 1、vue3項目中為什么要用tsx(等同于我們react的jsx) 類型安全…

【STM32】 工程

🚩 WRITE IN FRONT 🚩 🔎 介紹:"謓澤"正在路上朝著"攻城獅"方向"前進四" 🔎🏅 榮譽:2021|2022年度博客之星物聯網與嵌入式開發TOP5|TOP4、2021|2022博客之星TO…

oracle 更新語句條件匹配不生效

最近在工作中寫了一個供別人調用的Oracle的存儲過程接口,功能很簡單,就是根據傳入的幾個參數來更新表中的某些數據,但是在聯調過程中傳入的更新匹配條件和被更新的數據一致對不上,更新的數據會比匹配的三個條件的數據多&#xff0…

注解 @Slf4j

注解 Slf4j 1. 注解由來: Slf4j 是 Lombok 提供的一種注解,用于在類中自動生成一個名為 log 的日志對象。通過使用 Slf4j 注解,可以方便地在代碼中使用日志功能,而無需手動創建和初始化日志對象。 2. 注解示例: Slf…

Spring系列篇--關于AOP【面向切面】的詳解

目錄 一.AOP是什么 二.案例演示 1.前置通知1.1 先準備接口 1.2然后再準備好實現類 1.3對我們的目標對象進行JavaBean配置 1.4 編寫前置系統日志通知 1.5配置系統通知XML中的JavaBean 1.6 配置代理XML中的JavaBean 1.7 測試代碼開始測試 注意這里有一個報錯問題&…

JVM虛擬機:初始化的介紹

本文重點 我們前面學習了三個步驟: 裝載 連接 初始化 初始化 初始化的時候,會為靜態成員變量賦值初始值,它有兩種方式: ①聲明類變量是指定初始值 ②使用靜態代碼塊為類變量指定初始值 例子 最后輸出的結果為3,它的過程是這樣的: main方法中輸出T.count,由于count是…

自簽證書讓Chrome信任的方式

自簽證書讓Chrome信任的方式(域名情況) 網站是搭建在linux上的,內容大概是一個code-server;我要在windows的chrome中訪問,在Linux機器上自簽了一個證書,準備讓windows中的chrome信任。linux裝好openssl。首先買好域名,配置好解析…

tkinter+爬蟲+pygame實現音樂播放器

文章目錄 前文安裝模塊示意圖爬蟲完整代碼pygametkinter完整代碼結尾前文 本文將涉及爬蟲(數據的獲取),pygame(音樂播放器),tkinter(界面顯示),將他們匯聚到一起制造一個音樂播放器,歡迎大家的訂閱。 安裝模塊 pip install requests,parsel,lxpy,pygame 示意圖

Flask下載文件報錯304 NOT MODIFIED

文章目錄 問題描述解決方案參考文獻 問題描述 前端 Vue 下下來的文件無法正常打開,大小比正常的略大一點,通過 Postman 直接調用是正常的 解決方案 由前端解決 如果響應大小比文件略大一點,從 responses 中取出關鍵數據再組成文件如果響應…

open cv學習 (二)色彩空間和通道

色彩空間和通道 demo1 import cv2hsv_image cv2.imread("./img.png")cv2.imshow("img", hsv_image) hsv_image cv2.cvtColor(hsv_image, cv2.COLOR_BGR2HSV) h, s, v cv2.split(hsv_image) cv2.imshow("B", h) cv2.imshow("G", s…