深度学习-TensorRT模型部署实战
深度学习-TensorRT模型部署实战
学习地址:https://pan.baidu.com/s/1u-6lfe3nA-Y9tsQdbX8vrw 提取码: 6966
本课程划分为四部分:
第一部分精简CUDA-驱动API:学习CUDA驱动API的使用,错误处理方法,上下文管理方法,了解驱动API所处位置,CUDA的开发习惯。
第二部分精简CUDA-运行时API:学习CUDA运行时API的使用,力求精简,力求够用,学会编写核函数加速模型预处理(仿射变换),学习yolov5的后处理加速方法,共享内存的使用。
第三部分tensorRT基础:学习tensorRT的模型编译、推理流程,onnx解析器的使用,学习onnx的结构和编辑修改方法,学习int8量化,插件开发流程,简化的插件开发方法,学习动态shape的应用。
第四部分tensorRT高级:以项目驱动,学习大量具体的项目案例(分类器、目标检测、姿态检测、场景分割、道路分割、深度估计、车道线检测、huggingface、insightface、mmdetection、onnxruntime、openvino),学习针对深度学习需要的封装技术、多线程技术、框架设计技术。
1 安装trtexec
在Jetson Xavier NX 中安装trtexec,并将tensorrt的bin目录加入到环境变量。我的Jetson Xavier NX自带CUDA,所以安装trtexec后就可以开展模型转换工作。使用trtexec过程中可以通过./trtexec --help 查看支持的参数。
2 TensorRT的工作流
1、 从开源框架导出模型,比如导出ONNX模型
2、 选择Batch大小
3、 选择模型精度
4、 转换模型
5、 部署转换后的模型
我们可以通过TensorRT API调用和trtexec两种方式转换ONNX模型。使用ONNX转换TensorRT更高效。
3 ONNX转TensorRT
常规onnx转TensorRT的命令:
trtexec --onnx=resnet50/model.onnx --saveEngine=resnet_engine.trt
模型转换成功后可以通过trtexec命令验证生成随机数据执行推理是否成功
trtexec --shapes=input:1x3x224x224 --loadEngine=resnet50.trt
推理成功会显示
&&&& 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!")
一般的深度学习项目,训练时为了加快速度,会使用多 GPU 分布式训练。但在部署推理时,为了降低成本,往往使用单个 GPU 机器甚至嵌入式平台(比如 NVIDIA Jetson)进行部署,部署端也要有与训练时相同的深度学习环境,如 caffe,TensorFlow 等。由于训练的网络模型可能会很大(比如,inception,resnet 等),参数很多,而且部署端的机器性能存在差异,就会导致推理速度慢,延迟高。这对于那些高实时性的应用场合是致命的,比如自动驾驶要求实时目标检测,目标追踪等。所以为了提高部署推理的速度,出现了很多轻量级神经网络,比如 squeezenet,mobilenet,shufflenet 等。基本做法都是基于现有的经典模型提出一种新的模型结构,然后用这些改造过的模型重新训练,再重新部署。