Tensorrt踩坑记录

最近用c++和tensorrt重构模型推理代码,遇到了一些问题,这里记录一下。

1.关于onnx2trt fp16量化需要注意的,为什么fp16模型的nptype仍然是fp32?

模型是通过pytorch训练得到,因此转换成trt的流程是pytorch->onnx->trt。onnx->trt采用的是onnx2trt,我使用以下命令得到fp16的engine文件,

./onnx2trt p1.onnx -b 1 -w 10485100000 -d 16 -o p1.trt

推理时,当我向此engine中输入fp16类型的数据时,会发生以下错误:

[09/01/2020-10:57:09] [E] [TRT] ../rtSafe/cuda/genericReformat.cu (1262) - Cuda Error in executeMemcpy: 11 (invalid argument)
[09/01/2020-10:57:09] [E] [TRT] FAILED_EXECUTION: std::exception

而向engine中输入fp32的数据时,却可以顺利完成推理。但是推理时间却确实比之前 -d 32 生成的engine要快不少;
后面用trt的python接口读取了一下nptype:

dtype = trt.nptype(engine.get_binding_dtype(binding))

得到的是numpy.float32

  • 解决
    后来发现在pytorch->onnx时,也需要使用fp16模式,即model要进行half操作,input tensor的数据格式要是fp16;这样转成的onnx再转trt,用trt的python接口读取nptype就变成numpy.float16了,输入的才可以是fp16数据;

2.tensorrt 对pytorch中涉及到维度变换的操作支持不佳

我遇到的情况是,pytorch模型中有view操作,转换过程没问题,但是转出来的trt模型推理效果有问题;

  • 解决
    把view和它前面的stack单独拿出来用cuda实现了一下,没有放到模型中;

3. onnx2trt 转换带pixelshuffle层的模型时,报out of memory

模型中有一个pixelshuffle层做了 ( 1 , 64 ∗ 4 , 1088 , 1920 ) (1, 64*4, 1088, 1920) (1,644,1088,1920) ( 1 , 64 , 1088 ∗ 2 , 1920 ∗ 2 ) (1,64, 1088*2, 1920*2) (1,64,10882,19202)的转换,应该是因为特征图太大了,导致onnx2trt的时候显存不够用了;

  • 解决
     也是把pixelshuffle单独拿出来用cuda实现了一下;

总结

对于pytorch中那些做维度变换或者数值拷贝的操作,最好不要转成tensorrt,可以自己用c++ cuda实现;

猜你喜欢

转载自blog.csdn.net/BigerBang/article/details/108336774