深度學(xué)習(xí)-TensorRT模型部署實(shí)戰(zhàn)
深度學(xué)習(xí)-TensorRT模型部署實(shí)戰(zhàn)
學(xué)習(xí)地址:https://pan.baidu.com/s/1u-6lfe3nA-Y9tsQdbX8vrw 提取碼: 6966
本課程劃分為四部分:
第一部分精簡(jiǎn)CUDA-驅(qū)動(dòng)API:學(xué)習(xí)CUDA驅(qū)動(dòng)API的使用,錯(cuò)誤處理方法,上下文管理方法,了解驅(qū)動(dòng)API所處位置,CUDA的開(kāi)發(fā)習(xí)慣。
第二部分精簡(jiǎn)CUDA-運(yùn)行時(shí)API:學(xué)習(xí)CUDA運(yùn)行時(shí)API的使用,力求精簡(jiǎn),力求夠用,學(xué)會(huì)編寫(xiě)核函數(shù)加速模型預(yù)處理(仿射變換),學(xué)習(xí)yolov5的后處理加速方法,共享內(nèi)存的使用。
第三部分tensorRT基礎(chǔ):學(xué)習(xí)tensorRT的模型編譯、推理流程,onnx解析器的使用,學(xué)習(xí)onnx的結(jié)構(gòu)和編輯修改方法,學(xué)習(xí)int8量化,插件開(kāi)發(fā)流程,簡(jiǎn)化的插件開(kāi)發(fā)方法,學(xué)習(xí)動(dòng)態(tài)shape的應(yīng)用。
第四部分tensorRT高級(jí):以項(xiàng)目驅(qū)動(dòng),學(xué)習(xí)大量具體的項(xiàng)目案例(分類(lèi)器、目標(biāo)檢測(cè)、姿態(tài)檢測(cè)、場(chǎng)景分割、道路分割、深度估計(jì)、車(chē)道線檢測(cè)、huggingface、insightface、mmdetection、onnxruntime、openvino),學(xué)習(xí)針對(duì)深度學(xué)習(xí)需要的封裝技術(shù)、多線程技術(shù)、框架設(shè)計(jì)技術(shù)。
1 安裝trtexec
在Jetson Xavier NX 中安裝trtexec,并將tensorrt的bin目錄加入到環(huán)境變量。我的Jetson Xavier NX自帶CUDA,所以安裝trtexec后就可以開(kāi)展模型轉(zhuǎn)換工作。使用trtexec過(guò)程中可以通過(guò)./trtexec --help 查看支持的參數(shù)。
2 TensorRT的工作流
1、 從開(kāi)源框架導(dǎo)出模型,比如導(dǎo)出ONNX模型
2、 選擇Batch大小
3、 選擇模型精度
4、 轉(zhuǎn)換模型
5、 部署轉(zhuǎn)換后的模型
我們可以通過(guò)TensorRT API調(diào)用和trtexec兩種方式轉(zhuǎn)換ONNX模型。使用ONNX轉(zhuǎn)換TensorRT更高效。
3 ONNX轉(zhuǎn)TensorRT
常規(guī)onnx轉(zhuǎn)TensorRT的命令:
trtexec --onnx=resnet50/model.onnx --saveEngine=resnet_engine.trt
模型轉(zhuǎn)換成功后可以通過(guò)trtexec命令驗(yàn)證生成隨機(jī)數(shù)據(jù)執(zhí)行推理是否成功
trtexec --shapes=input:1x3x224x224 --loadEngine=resnet50.trt
推理成功會(huì)顯示
&&&& PASSED TensorRT.trtexec
import tensorrt as trt?
?
verbose = True?
IN_NAME = 'input'?
OUT_NAME = 'output'?
IN_H = 224?
IN_W = 224?
BATCH_SIZE = 1?
?
EXPLICIT_BATCH = 1 << (int)(?
? ? trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)?
?
TRT_LOGGER = trt.Logger(trt.Logger.VERBOSE) if verbose else trt.Logger()?
with trt.Builder(TRT_LOGGER) as builder, builder.create_builder_config(?
) as config, builder.create_network(EXPLICIT_BATCH) as network:?
? ? # define network?
? ? input_tensor = network.add_input(?
? ? ? ? name=IN_NAME, dtype=trt.float32, shape=(BATCH_SIZE, 3, IN_H, IN_W))?
? ? pool = network.add_pooling(?
? ? ? ? input=input_tensor, type=trt.PoolingType.MAX, window_size=(2, 2))?
? ? pool.stride = (2, 2)?
? ? pool.get_output(0).name = OUT_NAME?
? ? network.mark_output(pool.get_output(0))?
?
? ? # serialize the model to engine file?
? ? profile = builder.create_optimization_profile()?
? ? profile.set_shape_input('input', *[[BATCH_SIZE, 3, IN_H, IN_W]]*3)??
? ? builder.max_batch_size = 1?
? ? config.max_workspace_size = 1 << 30?
? ? engine = builder.build_engine(network, config)?
? ? with open('model_python_trt.engine', mode='wb') as f:?
? ? ? ? f.write(bytearray(engine.serialize()))?
? ? ? ? print("generating file done!")?
一般的深度學(xué)習(xí)項(xiàng)目,訓(xùn)練時(shí)為了加快速度,會(huì)使用多 GPU 分布式訓(xùn)練。但在部署推理時(shí),為了降低成本,往往使用單個(gè) GPU 機(jī)器甚至嵌入式平臺(tái)(比如 NVIDIA Jetson)進(jìn)行部署,部署端也要有與訓(xùn)練時(shí)相同的深度學(xué)習(xí)環(huán)境,如 caffe,TensorFlow 等。由于訓(xùn)練的網(wǎng)絡(luò)模型可能會(huì)很大(比如,inception,resnet 等),參數(shù)很多,而且部署端的機(jī)器性能存在差異,就會(huì)導(dǎo)致推理速度慢,延遲高。這對(duì)于那些高實(shí)時(shí)性的應(yīng)用場(chǎng)合是致命的,比如自動(dòng)駕駛要求實(shí)時(shí)目標(biāo)檢測(cè),目標(biāo)追蹤等。所以為了提高部署推理的速度,出現(xiàn)了很多輕量級(jí)神經(jīng)網(wǎng)絡(luò),比如 squeezenet,mobilenet,shufflenet 等?;咀龇ǘ际腔诂F(xiàn)有的經(jīng)典模型提出一種新的模型結(jié)構(gòu),然后用這些改造過(guò)的模型重新訓(xùn)練,再重新部署。