佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Python api構(gòu)建tensorrt加速模型的步驟詳解

Python api構(gòu)建tensorrt加速模型的步驟詳解

熱門標簽:銀行業(yè)務 美圖手機 鐵路電話系統(tǒng) 呼叫中心市場需求 智能手機 網(wǎng)站文章發(fā)布 服務器配置 檢查注冊表項

一、創(chuàng)建TensorRT有以下幾個步驟:

1.用TensorRT中network模塊定義網(wǎng)絡模型
2.調(diào)用TensorRT構(gòu)建器從網(wǎng)絡創(chuàng)建優(yōu)化的運行時引擎
3.采用序列化和反序列化操作以便在運行時快速重建
4.將數(shù)據(jù)喂入engine中進行推理

二、Python api和C++ api在實現(xiàn)網(wǎng)絡加速有什么區(qū)別?

個人看法
1.python比c++更容易讀并且已經(jīng)有很多包裝很好的科學運算庫(numpy,scikit等),
2.c++是接近硬件的語言,運行速度比python快很多很多,因為python是解釋性語言c++是編譯型語言

三、構(gòu)建TensorRT加速模型

 3.1 加載tensorRT

1.import tensorrt as trt
2.為tensorrt實現(xiàn)日志報錯接口方便報錯,在下面的代碼我們只允許警告和錯誤消息才打印,TensorRT中包含一個簡單的日志記錄器Python綁定。

TRT_LOGGER = trt.Logger(trt.Logger.WARNING)

3.2 創(chuàng)建網(wǎng)絡

簡單來說就是用tensorrt的語言來構(gòu)建模型,如果自己構(gòu)建的話,主要是靈活但是工作量so large,一般還是用tensorrt parser來構(gòu)建
(1)Caffe框架的模型可以直接用tensorrt內(nèi)部解釋器構(gòu)建
(2)除caffe,TF模型以外其他框架,先轉(zhuǎn)成ONNX通用格式,再用ONNX parser來解析
(3)TF可以直接通過tensorrt內(nèi)部的UFF包來構(gòu)建,但是tensorrt uff包中并支持所有算子
(4)自己將wts放入自己構(gòu)建的模型中,工作量so large,但是很靈活。

3.3 ONNX構(gòu)建engine

因為博主用的ONNXparser來構(gòu)建engine的,下面就介紹以下ONNX構(gòu)建engine,步驟如下:
(1)導入tensorrt

import tensorrt as trt

(2)創(chuàng)建builder,network和相應模型的解釋器,這里是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òu)建報錯日志,創(chuàng)建build,network和onnxparser,然后用parser讀取onnx權(quán)重文件。

3.3.1 builder介紹

builder功能之一是搜索cuda內(nèi)核目錄,找到最快的cuda以求獲得最快的實現(xiàn),因此有必要使用相同的GPU進行構(gòu)建(相同的操作,算子進行融合,減少IO操作),engine就是在此基礎上運行的,builder還可以控制網(wǎng)絡以什么精度運行(FP32,FP16,INT8),還有兩個特別重要的屬性是最大批處理大小和最大工作空間大小。

builder.max_batch_size = max_batch_size
builder.max_workspace_size = 1  20

3.3.2序列化模型

序列化和反序列化模型的主要是因為network和定義創(chuàng)建engine很耗時,因此可以通過序列化一次并在推理時反序列化一次來避免每次應用程序重新運行時重新構(gòu)建引擎。
note:序列化引擎不能跨平臺或TensorRT版本移植。引擎是特定于它們所構(gòu)建的GPU模型(除了平臺和TensorRT版本)
代碼如下:

#序列化模型到模型流
serialized_engine = engine.serialize()
#反序列化模型流去執(zhí)行推理,反序列化需要創(chuàng)建一個運行時對象
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())
#然后再讀出來進行反序列化
with open(“sample.engine”, “rb”) as f, trt.Runtime(TRT_LOGGER) as runtime:
	engine = runtime.deserialize_cuda_engine(f.read())

3.3.3執(zhí)行推理過程

note:下面過程的前提是已經(jīng)創(chuàng)建好了engine

# 為輸入和輸出分配一些主機和設備緩沖區(qū):
#確定尺寸并創(chuàng)建頁面鎖定內(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)
#為輸入和輸出分配設備內(nèi)存
d_input = cuda.mem_alloc(h_input.nbytes)
d_output = cuda.mem_alloc(h_output.nbytes)
#創(chuàng)建一個流,在其中復制輸入/輸出并運行推斷
stream = cuda.Stream()
# 創(chuàng)建一些空間來存儲中間激活值,因為engine保存了network定義和訓練時的參數(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)
 	# 將推理后的預測結(jié)果從GPU上返回.
 	cuda.memcpy_dtoh_async(h_output, d_output, stream)
 	# 同步流
 	stream.synchronize()
 	# 返回主機輸出 
	return h_output

note:一個engine可以有多個執(zhí)行上下文,允許一組權(quán)值用于多個重疊推理任務。例如,可以使用一個引擎和一個上下文在并行CUDA流中處理圖像。每個上下文將在與引擎相同的GPU上創(chuàng)建。

到此這篇關(guān)于Python api構(gòu)建tensorrt加速模型的文章就介紹到這了,更多相關(guān)Python api tensorrt加速模型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python自動化調(diào)用百度api解決驗證碼
  • python 利用百度API進行淘寶評論關(guān)鍵詞提取
  • python調(diào)用百度API實現(xiàn)人臉識別
  • python調(diào)用api實例講解
  • Python 調(diào)用API發(fā)送郵件
  • python基于爬蟲+django,打造個性化API接口
  • python3 kubernetes api的使用示例
  • python調(diào)用jenkinsAPI構(gòu)建jenkins,并傳遞參數(shù)的示例
  • 用 Django 開發(fā)一個 Python Web API的方法步驟

標簽:樂山 長治 沈陽 上海 滄州 紅河 新疆 河南

巨人網(wǎng)絡通訊聲明:本文標題《Python api構(gòu)建tensorrt加速模型的步驟詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    科技| 乐安县| 青海省| 焉耆| 香河县| 麦盖提县| 喀什市| 泌阳县| 连江县| 东乡族自治县| 昭通市| 昌乐县| 昆明市| 棋牌| 连江县| 蒙山县| 石景山区| 宜都市| 枣强县| 双鸭山市| 安塞县| 家居| 探索| 睢宁县| 建昌县| 保定市| 会宁县| 梁平县| 偏关县| 于田县| 松溪县| 平凉市| 鄂尔多斯市| 伊吾县| 新丰县| 综艺| 安国市| 山西省| 翼城县| 辽阳县| 五大连池市|