onnxruntime安装与使用(附实践中发现的一些问题)

关于onnxruntime的一些基本参考链接:

  1. onnxruntime官方文档
  2. 将pytorch模型转换为onnx模型并用onnxruntime进行推理(Pytorch官方文档)

一、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推理速度不升反降,慢了将近一半。

原因分析:

  1. 关于使用GPU后,onnxruntime推理速度不升反降,我在网上找到一个相关的解释:

    [来自:https://github.com/PaddlePaddle/PaddleOCR/issues/5445]

    “这与ONNX的执行策略有关,由于模型中存在大量shape和constant的操作,这几个op计算在onnx中必须执行在CPU上,为了避免数据拷贝,onnx把网络结构前后整块操作都放在了cpu上,导致识别模型预测速度很慢。”
    “需要onnx那边修改,暂时只能这样了”

    以上解释未经过验证,仅供参考。也欢迎大佬们补充指正。

  2. 关于onnxruntime和torch相比并没有实现推理性能的提高
    结合前面的解释,我猜测当前onnxruntime还不能实现对所有模型的加速,或者大多只是在CPU下实现推理加速,具体加速情况还和模型有关。当前我只测试了slowfast这一个模型,后续会继续测试其它模型,来验证这一推测是否正确。(当然欢迎有经验的大佬直接告诉我答案)
    (未完待续。。。)


2022.3.18更新

后面我又继续学习TensorRT,尝试将onnx模型转为TensorRT进行推理加速。学习过程中发现,TensorTR在测试推理速度前会先进行一次推理,并将这个过程叫做Warming up,原因大概是第一次推理时要从缓存中加载模型。回过头来我给Pytorch和onnx的测试也加上Warming up过程后,再测试对比二者的推理速度,发现在GPU下onnx的推理速度比Pytorch略有提升,使用TensorRT则相比于前两者在模型推理速度上有大幅度的提升。
感兴趣的话可以参考我的博客:使用TensorRT加速Pytorch模型推理

你可能感兴趣的:(深度学习实践,python,深度学习,pytorch)