一、背景:使用pytorch進行訓練得到pt模型, 然后使用torch.onnx把pt模型轉化為onnx模型。然后再使用tensorrt自帶的trtexec.exe文件把onnx模型轉化為engine文件。
(1)在使用C++進行推理的時候發現一個batch的數據,值推理了里面的第一張,其他圖片輸出的結果都為0;
原因分析:這是因為在使用torch.onnx把pt文件轉為onnx的時候,沒有給他增加動態batch,導致默認的batch為1,所以在推理一個batch里面的多個數據時,只對第一個數據進行了加速推理操作,其他的數據就沒進入推理,所以其他數據輸出為0;
(2)解決方法:
1.首先pt模型轉onnx模型的時候,在export加上 dynamic_axes 參數,這樣在把onnx轉為tensorrt的engine文件的時候,才能轉化成功。
import torch.onnxmodel = torch.load("cls_model.pth")
model.eval()dummy_input = torch.randn(1, 3, 64, 64).to("cuda")
torch.onnx.export(model,dummy_input,"cls_model_dyn.onnx",export_params=True,input_names=["input"],output_names=["output"],verbose=True, # verbose=True 會打印出詳細的轉換過程dynamic_axes={'input':{0:"batch"}, "output":{0:"batch"}} # 設置動態的batch_size)
2.然后在使用trtexec.exe把onnx轉成engine文件的話,給它設置動態范圍大小minShapes、optShapes、maxShapes、(根據自己推理大小來更改,我的是64)
.\trtexec.exe --onnx=cls_model_dyn.onnx --saveEngine=cls.engine --explicitBatch --minShapes=input:1x3x64x64 --optShapes=input:8x3x64x64 --maxShapes=input:8x3x64x64
這樣子在使用C++推理的時候就可以推理一個batch的數據了。