前言
onnx模型作為中間模型,相較于pytorch直接推理,是有加速度效果的,且推理代碼簡單,不需要load各種網(wǎng)絡(luò)。最近某些項目因為顯存不夠,onnxruntime推理時切換CPU/GPU,實現(xiàn)某些模型在CPU上推理,某些在GPU上推理。 查了一些別人的文章發(fā)現(xiàn)很多人都說onnxruntime推理沒法像pytorch那樣指定GPU,CPU,只能卸載一個GPU用CPU,卸載CPU用GPU。個人感覺不應(yīng)該是這樣的,點進(jìn)去源碼一看,明明有配置CPU,GPU的參數(shù),而且很簡單。這里把自己踩得一些坑給記錄一些,分享給有需要的人。
onnxruntime CPU/GPU切換
點進(jìn)去源碼之后看到有CUDAExecutionProvider和CPUExecutionProvider這樣的選擇,開始使用的使用低版本onnxruntime-gpu的時候發(fā)現(xiàn)選了“CPUExecutionProvider”依舊是用GPU的資源,后來從一條警告看到1.10版本之后建立推理引擎的時候需要providers參數(shù)選擇CPU/GPU,安裝了onnxruntime-gpu==1.10.0之后果然可以在GPU版本的onnxruntime下使用CPU了。
import onnxruntime as rt
sess = rt.InferenceSession(MODEL_PATH,providers=['CPUExecutionProvider'])# providers=['CPUExecutionProvider','CUDAExecutionProvider']
注意:高版本ONNX動態(tài)尺寸推理的時候,如果inference輸出的shape和你模型文件本身的outputshape不匹配會報警告,這時候會降低推理速度,這時候改一下模型本身設(shè)output shape就行。
修改onnx的輸入/輸出尺寸為動態(tài)
其實這個在轉(zhuǎn)onnx模型的時候input/output就應(yīng)該設(shè)置為靜態(tài)或動態(tài),但是如果沒有原模型,只有一個onnx模型,可以使用下面給的方法快速轉(zhuǎn)換模型為動態(tài)輸入輸出。就把對應(yīng)的輸入輸出某一需要動態(tài)的維度改成“?”就行了。
import onnx
file_path = './my.onnx'
model = onnx.load(file_path)
#model.graph.input[0].type.tensor_type.shape.dim[0].dim_param = '?'
model.graph.output[0].type.tensor_type.shape.dim[2].dim_param = '?'
model.graph.output[0].type.tensor_type.shape.dim[3].dim_param = '?'
onnx.save(model, './my_dynamic.onnx')
后續(xù):
每次我都要挑戰(zhàn)一下這個發(fā)文助手,看起來有點搞笑,東西就這么點非說我字?jǐn)?shù)不夠,CSDN的檢測為什么能這么無聊,非要把字?jǐn)?shù)的權(quán)重弄得那么高,讓人看著很無語,我這就看看到底多少字才能通過檢測,看看評論區(qū)多少在吐槽這個爛檢測系統(tǒng),產(chǎn)品經(jīng)理都裝看不見。文章來源:http://www.zghlxwxcb.cn/news/detail-525652.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-525652.html
到了這里,關(guān)于onnxruntime推理時切換CPU/GPU以及修改onnx輸入輸出為動態(tài)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!