关于onnxruntime的一些基本参考链接:
一、onnxruntime安装
(1)使用CPU
如果只用CPU进行推理,通过下面这个命令安装。【如果要用GPU推理,不要运行下面这个命令】
pip install onnxruntime
(2)使用GPU
安装命令为:
pip install onnxruntime-gpu
安装 onnxruntime-gpu 注意事项:
- onnxruntime-gpu包含onnxruntime的大部分功能。如果已安装onnruntime要把onnruntime卸载掉。
- 安装时一定要注意与CUDA、cuDNN版本适配问题,具体适配列表参考:CUDA Execution Provider
安装好后验证onnxruntime是否用到GPU:
>>> import onnxruntime
>>> onnxruntime.get_device()
'GPU' #表示GPU可用
>>> onnxruntime.get_available_providers()
['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider']
如果GPU不可用,可以在 ~/.bashrc
中添加下面两行内容:
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
二、使用onnxruntime推理
推理过程示例如下:
import onnxruntime
import numpy as np
device_name = 'cuda:0' # or 'cpu'
print(onnxruntime.get_available)
if device_name == 'cpu':
providers = ['CPUExecutionProvider']
elif device_name == 'cuda:0':
providers = ['CUDAExecutionProvider', 'CPUExecutionProvider']
# Create inference session
onnx_model = onnxruntime.InferenceSession('slowfast.onnx', providers=providers)
# Create the input(这里的输入对应slowfast的输入)
data = np.random.rand(1, 1, 3, 32, 256, 256).astype(np.float32)
# Inference
onnx_input = {onnx_model.get_inputs()[0].name: data}
outputs = onnx_model.run(None, onnx_input)
三、onnxruntime和Pytorch推理时间对比
此处参考其他博主的一篇文章:ONNXRuntime与PyTorch运行时间对比
个人实践过程中遇到的一些问题:
最近在开发一个行为识别的功能,用到的模型是slowfast。完成基本开发之后想用onnnruntime来提高模型的推理性能,导出onnx模型后,分别用torch和onnxruntime进行推理测试(显卡一张RTX3090),结果发现:(1)在仅使用CPU的情况下,onnxruntime和torch推理时间近乎相等;(2)在使用GPU的情况下,torch推理速度提升了10倍左右,但onnxruntime推理速度不升反降,慢了将近一半。
原因分析:
-
关于使用GPU后,onnxruntime推理速度不升反降,我在网上找到一个相关的解释:
[来自:https://github.com/PaddlePaddle/PaddleOCR/issues/5445]
“这与ONNX的执行策略有关,由于模型中存在大量shape和constant的操作,这几个op计算在onnx中必须执行在CPU上,为了避免数据拷贝,onnx把网络结构前后整块操作都放在了cpu上,导致识别模型预测速度很慢。”
“需要onnx那边修改,暂时只能这样了”以上解释未经过验证,仅供参考。也欢迎大佬们补充指正。
-
关于onnxruntime和torch相比并没有实现推理性能的提高
结合前面的解释,我猜测当前onnxruntime还不能实现对所有模型的加速,或者大多只是在CPU下实现推理加速,具体加速情况还和模型有关。当前我只测试了slowfast这一个模型,后续会继续测试其它模型,来验证这一推测是否正确。(当然欢迎有经验的大佬直接告诉我答案)
(未完待续。。。)
2022.3.18更新
后面我又继续学习TensorRT,尝试将onnx模型转为TensorRT进行推理加速。学习过程中发现,TensorTR在测试推理速度前会先进行一次推理,并将这个过程叫做Warming up,原因大概是第一次推理时要从缓存中加载模型。回过头来我给Pytorch和onnx的测试也加上Warming up过程后,再测试对比二者的推理速度,发现在GPU下onnx的推理速度比Pytorch略有提升,使用TensorRT则相比于前两者在模型推理速度上有大幅度的提升。
感兴趣的话可以参考我的博客:使用TensorRT加速Pytorch模型推理
文章出处登录后可见!