Tensorrt踩坑記錄

2021-10-24 09:37:21 字數 1176 閱讀 7022

最近用c++和tensorrt重構模型推理**,遇到了一些問題,這裡記錄一下。

模型是通過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模型中有view操作,轉換過程沒問題,但是轉出來的trt模型推理效果有問題;

模型中有乙個pixelshuffle層做了(1,

64∗4,

1088

,1920

)(1, 64*4, 1088, 1920)

(1,64∗

4,10

88,1

920)

到( 1,

64,

1088∗2

,1920∗2

)(1,64, 1088*2, 1920*2)

(1,64,

1088

∗2,1

920∗

2)的轉換,應該是因為特徵圖太大了,導致onnx2trt的時候視訊記憶體不夠用了;

對於pytorch中那些做維度變換或者數值拷貝的操作,最好不要轉成tensorrt,可以自己用c++ cuda實現;

Python 踩坑記錄

1.浮點數判斷 工作中遇到類似下面邏輯判斷 i 1 while i 1.5 i i 0.1 print i在想象中i應該停止在1.5就不輸出了,但是實際的輸出結果是無限迴圈。這是因為在計算機的邏輯中,浮點數的儲存規則決定了不是所有的浮點數都能準確表示,有些是不準確的,只是無限接近。如0.1轉換為二進...

Java踩坑記錄

1.quartz整合spring框架service層物件注入為null解決方案 jobdetailfactorybean中注入的是乙個cn.itcast.quartz.hellojob實現類的全路徑,底層會反射建立出乙個hellojob的物件,但是該物件不是由spring管理的,所以業務層的物件無法...

SSD踩坑記錄

原github專案位址,借用大神的模型自己訓練ssd 1 error default maxpoolingop only supports nhwc on device type cpu data format nchw 修改為 nhwc 2 關於dataset name 將影象資料轉換為tfrec...