1.首先进行trtexec 进行转换(默认已经安装tensorrt)
首先进行 export PATH=/tensorrt路径/bin:$PATH #这行防止使用trtexec 指令系统显示找不到指令
trtexec --onnx= 文件.onnx --saveEngine=保持名称.engine --verbose
--onnx=<onnx_file> \ #指定onnx模型文件
--minShapes=input:<shape_of_min_batch> \ #最小的batchsize x 通道数 x 输入尺寸x x 输入尺寸y
--optShapes=input:<shape_of_opt_batch> \ #最佳输入维度,跟maxShapes一样就好
--maxShapes=input:<shape_of_max_batch> \ #最大输入维度
--workspace=<size_in_megabytes> \ #设置工作空间大小单位是MB(默认为16MB)
--saveEngine=<engine_file> \ #输出engine
--fp16 #除了fp32之外,还启用fp16精度(默认=禁用)
minShapes、optShapes、maxShapes 这三项是当onnx input输入显示是 batchsize 动态输入时需要指定batchsize大小进行推理。如果是固定输入则不需要这三项。
报错显示
这里报错查询资料显示:是因为源代码mxnet 网络进行激活层使用函数PRelu激活导致tensorrt不支持该算子操作。如下图所示
使用netron查看onnx也可知:
查询资料
解决办法1:更改python代码将PRelu替换成Relu。
具体可见该博客
转载:
解决方法2:未尝试TensorRT5.1.6加速PReLU,更改onnx-tensorrt 注册算子。
详见该博客
https://blog.csdn.net/tfu259/article/details/103520132
解决方法3:TensorRt - caffe中支持prelu
详见该博客
https://blog.csdn.net/qq_35759574/article/details/88415101
解决方法4:已解决 使用sim_onnx 进行 onnx 简化
从这个界面获取提示,报错是在节点PRelu 节点未定义shape,需要从新指定shape。
显示代码:
import onnx
from onnx import shape_inference
model = r'/home/ying/文档/工作交接/agender_sim.onnx'
#上一步保存好的onnx格式的模型路径
onnx.save(onnx.shape_inference.infer_shapes(onnx.load(model)), model)
#增加节点的shape信息
这里看到slope 节点 只有1024 一维信息,与输入1x1024x7x7 以及输出 1x1024x7x7 不匹配。需要转换
import onnx
import onnx_graphsurgeon as gs
import numpy as np
graph = gs.import_onnx(onnx.load("/home/ying/文档/工作交接/agender_sim.onnx"))
for node in graph.nodes:
if node.op == "PRelu":
# Make the slope tensor broadcastable
slope_tensor = node.inputs[1]
slope_tensor.values = np.expand_dims(slope_tensor.values, axis=(0, 2, 3))
onnx.save(gs.export_onnx(graph), "/home/ying/文档/工作交接/agender_fixed.onnx")
这里可能会提示
可以在 (/home/ying/TensorRT-8.0.1.6)安装tensorrt目录下/ onnx_graphsurgeon/中找到whl文件进行安装。
最后使用netron打开生成onnx文件。
然后使用该onnx文件转换engine。
./build/parsers/onnx/onnx2trt /home/ying/文档/工作交接/agender_fixed.onnx -o /home/ying/文档/工作交接/agender.engine