Python api構(gòu)建tensorrt加速模型的步驟詳解
一、創(chuàng)建TensorRT有以下幾個(gè)步驟:
1.用TensorRT中network模塊定義網(wǎng)絡(luò)模型
2.調(diào)用TensorRT構(gòu)建器從網(wǎng)絡(luò)創(chuàng)建優(yōu)化的運(yùn)行時(shí)引擎
3.采用序列化和反序列化操作以便在運(yùn)行時(shí)快速重建
4.將數(shù)據(jù)喂入engine中進(jìn)行推理
二、Python api和C++ api在實(shí)現(xiàn)網(wǎng)絡(luò)加速有什么區(qū)別?
個(gè)人看法
1.python比c++更容易讀并且已經(jīng)有很多包裝很好的科學(xué)運(yùn)算庫(kù)(numpy,scikit等),
2.c++是接近硬件的語(yǔ)言,運(yùn)行速度比python快很多很多,因?yàn)閜ython是解釋性語(yǔ)言c++是編譯型語(yǔ)言
三、構(gòu)建TensorRT加速模型
3.1 加載tensorRT
1.import tensorrt as trt
2.為tensorrt實(shí)現(xiàn)日志報(bào)錯(cuò)接口方便報(bào)錯(cuò),在下面的代碼我們只允許警告和錯(cuò)誤消息才打印,TensorRT中包含一個(gè)簡(jiǎn)單的日志記錄器Python綁定。
TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
3.2 創(chuàng)建網(wǎng)絡(luò)
簡(jiǎn)單來(lái)說(shuō)就是用tensorrt的語(yǔ)言來(lái)構(gòu)建模型,如果自己構(gòu)建的話,主要是靈活但是工作量so large,一般還是用tensorrt parser來(lái)構(gòu)建
(1)Caffe框架的模型可以直接用tensorrt內(nèi)部解釋器構(gòu)建
(2)除caffe,TF模型以外其他框架,先轉(zhuǎn)成ONNX通用格式,再用ONNX parser來(lái)解析
(3)TF可以直接通過(guò)tensorrt內(nèi)部的UFF包來(lái)構(gòu)建,但是tensorrt uff包中并支持所有算子
(4)自己將wts放入自己構(gòu)建的模型中,工作量so large,但是很靈活。
3.3 ONNX構(gòu)建engine
因?yàn)椴┲饔玫腛NNXparser來(lái)構(gòu)建engine的,下面就介紹以下ONNX構(gòu)建engine,步驟如下:
(1)導(dǎo)入tensorrt
import tensorrt as trt
(2)創(chuàng)建builder,network和相應(yīng)模型的解釋器,這里是onnxparser
EXPLICIT_BATCH = 1 << (int) (trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH) with builder = trt.Builder(TRT_LOGGER) as builder, builder.create_network(EXPLICIT_BATCH) as network, trt.OnnxParser(network, TRT_LOGGER) as parser: with open(model_path, 'rb') as model: parser.parse(model.read())
這個(gè)代碼的主要意思是,構(gòu)建報(bào)錯(cuò)日志,創(chuàng)建build,network和onnxparser,然后用parser讀取onnx權(quán)重文件。
3.3.1 builder介紹
builder功能之一是搜索cuda內(nèi)核目錄,找到最快的cuda以求獲得最快的實(shí)現(xiàn),因此有必要使用相同的GPU進(jìn)行構(gòu)建(相同的操作,算子進(jìn)行融合,減少IO操作),engine就是在此基礎(chǔ)上運(yùn)行的,builder還可以控制網(wǎng)絡(luò)以什么精度運(yùn)行(FP32,FP16,INT8),還有兩個(gè)特別重要的屬性是最大批處理大小和最大工作空間大小。
builder.max_batch_size = max_batch_size builder.max_workspace_size = 1 << 20
3.3.2序列化模型
序列化和反序列化模型的主要是因?yàn)閚etwork和定義創(chuàng)建engine很耗時(shí),因此可以通過(guò)序列化一次并在推理時(shí)反序列化一次來(lái)避免每次應(yīng)用程序重新運(yùn)行時(shí)重新構(gòu)建引擎。
note:序列化引擎不能跨平臺(tái)或TensorRT版本移植。引擎是特定于它們所構(gòu)建的GPU模型(除了平臺(tái)和TensorRT版本)
代碼如下:
#序列化模型到模型流 serialized_engine = engine.serialize() #反序列化模型流去執(zhí)行推理,反序列化需要?jiǎng)?chuàng)建一個(gè)運(yùn)行時(shí)對(duì)象 with trt.Runtime(TRT_LOGGER) as runtime: engine = runtime.deserialize_cuda_engine(serialized_engine) #也可以將序列化模型write with open(“sample.engine”, “wb”) as f: f.write(engine.serialize()) #然后再讀出來(lái)進(jìn)行反序列化 with open(“sample.engine”, “rb”) as f, trt.Runtime(TRT_LOGGER) as runtime: engine = runtime.deserialize_cuda_engine(f.read())
3.3.3執(zhí)行推理過(guò)程
note:下面過(guò)程的前提是已經(jīng)創(chuàng)建好了engine
# 為輸入和輸出分配一些主機(jī)和設(shè)備緩沖區(qū): #確定尺寸并創(chuàng)建頁(yè)面鎖定內(nèi)存緩沖區(qū) h_input = cuda.pagelocked_empty(trt.volume(engine.get_binding_shape(0)),dtype=np.float32) h_output =cuda.pagelocked_empty(trt.volume(engine.get_binding_shape(1)),dtype=np.float32) #為輸入和輸出分配設(shè)備內(nèi)存 d_input = cuda.mem_alloc(h_input.nbytes) d_output = cuda.mem_alloc(h_output.nbytes) #創(chuàng)建一個(gè)流,在其中復(fù)制輸入/輸出并運(yùn)行推斷 stream = cuda.Stream()
# 創(chuàng)建一些空間來(lái)存儲(chǔ)中間激活值,因?yàn)閑ngine保存了network定義和訓(xùn)練時(shí)的參數(shù),這些都是構(gòu)建的上下文執(zhí)行的。 with engine.create_execution_context() as context: # 輸入數(shù)據(jù)傳入GPU cuda.memcpy_htod_async(d_input, h_input, stream) # 執(zhí)行推理. context.execute_async(bindings=[int(d_input), int(d_output)], stream_handle=stream.handle) # 將推理后的預(yù)測(cè)結(jié)果從GPU上返回. cuda.memcpy_dtoh_async(h_output, d_output, stream) # 同步流 stream.synchronize() # 返回主機(jī)輸出 return h_output
note:一個(gè)engine可以有多個(gè)執(zhí)行上下文,允許一組權(quán)值用于多個(gè)重疊推理任務(wù)。例如,可以使用一個(gè)引擎和一個(gè)上下文在并行CUDA流中處理圖像。每個(gè)上下文將在與引擎相同的GPU上創(chuàng)建。
到此這篇關(guān)于Python api構(gòu)建tensorrt加速模型的文章就介紹到這了,更多相關(guān)Python api tensorrt加速模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python自動(dòng)化調(diào)用百度api解決驗(yàn)證碼
- python 利用百度API進(jìn)行淘寶評(píng)論關(guān)鍵詞提取
- python調(diào)用百度API實(shí)現(xiàn)人臉識(shí)別
- python調(diào)用api實(shí)例講解
- Python 調(diào)用API發(fā)送郵件
- python基于爬蟲+django,打造個(gè)性化API接口
- python3 kubernetes api的使用示例
- python調(diào)用jenkinsAPI構(gòu)建jenkins,并傳遞參數(shù)的示例
- 用 Django 開(kāi)發(fā)一個(gè) Python Web API的方法步驟
相關(guān)文章
使用Python合并Excel文件中的多個(gè)Sheet的實(shí)現(xiàn)過(guò)程
在Python中,可以使用pandas庫(kù)來(lái)處理Excel文件,將多個(gè)工作表(sheets)合并為一個(gè)工作表,以下是一個(gè)詳細(xì)的代碼示例,展示了如何實(shí)現(xiàn)這一功能,文中有相關(guān)的代碼供大家參考,需要的朋友可以參考下2024-10-10
Pycharm生成可執(zhí)行文件.exe的實(shí)現(xiàn)方法
這篇文章主要介紹了Pycharm生成可執(zhí)行文件.exe的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Python3使用TCP編寫一個(gè)簡(jiǎn)易的文件下載器功能
這篇文章主要介紹了Python3使用TCP編寫一個(gè)簡(jiǎn)易的文件下載器功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05
python使用socket連接遠(yuǎn)程服務(wù)器的方法
這篇文章主要介紹了python使用socket連接遠(yuǎn)程服務(wù)器的方法,涉及Python中socket通信的基本技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
Python中裝飾器兼容加括號(hào)和不加括號(hào)的寫法詳解
這篇文章主要給大家介紹了關(guān)于Python中裝飾器兼容加括號(hào)和不加括號(hào)寫法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-07-07

