赞
踩
本博客基于以下关于将onnx转成TensorRT的开源项目,在开发过程中记录出错或者一些需要注意的点。
onnx_tensorrt_project
环境配置:
Win10
Nvidia472.88显卡驱动
cuda11.1
TensorRT7.2.2.3
注意点:
1.TensorRT将onnx模型转成engine模型时
(即执行mBuilder->buildEngineWithConfig(*mNetwork, *mConfig))
跟当前的显卡计算能力有关。
如果在一个低计算能力的显卡的机器上生成的engine模型直接放到另一台高计算能力的显卡的机器上时会报错,必须是相同计算能力显卡上生成的engine文件才可以直接使用。
所以建议在哪个机器上调用engine模型时就在哪个机器上对图像进行推理,重点在于显卡不能更换。
而显卡的计算能力可以参照英伟达的这张显卡计算能力表
参考资料:
Your GPU Compute Capability
2.TensorRT在计算能力为6.1的显卡上不支持FP16模式的加速,可以参照以下表格
而计算能力为6.1的有以下型号的显卡,比如10系列的GeForce GTX
实际测试下来,能跑得通,但是速度与显存和FP32的一样。
参考资料:
NVIDIA TENSORRT DOCUMENTATION
3.基于C++开发时最后测速度时,记得要把Debug模式切换成Release模式,否则速度不如理想的快。
4.注意如果想要遍历所有图片来测试速度时,发现隔几张图片后速度就会突然变得很慢,然后又恢复正常,接着变慢,那么可以看下是否是内存溢出问题。
如果是内存溢出的话,看下是否使用了类似cv::imwrite()的函数,使得不断将数据写入硬盘中。如果有的话取消掉,问题应该就会解决。
5.注意解析onnx模型的时候,如果正常的通道排序应该是(batch_size,channel,height,width)
但是C++下的opencv调用resize时通道排序是(width,height),顺序有点不同。
转onnx的python代码:
var=torch.ones((batch_size,3,resize_height,resize_width))
var=var.type(torch.cuda.FloatTensor)
model.eval()
model = model.to(device)
torch.onnx.export(model, var, output_onnx_path,opset_version=11,verbose=True)
解析onnx的C++代码:
std::shared_ptr<Trt> onnx_net;
m_InputW = onnx_net->mBindingDims[0].d[3];
m_InputH = onnx_net->mBindingDims[0].d[2];
6.yolov4的pth生成的onnx,如果是在FP16模式下转成engine的时间会非常长,测试下来时间需要49分钟,需要耐心等待。
目前本人已经尝试过的解决方案(都没成功
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。