最近用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...