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

一、onnxruntime安装

(1)使用CPU

如果只用CPU进行推理,通过下面这个命令安装。【如果要用GPU推理,不要运行下面这个命令】

pip install onnxruntime

(2)使用GPU

安装命令为:

pip install onnxruntime-gpu

安装 onnxruntime-gpu 注意事项:

    onnxruntime-gpu包含onnxruntime的大部分功能。如果已安装onnruntime要把onnruntime卸载掉。 安装时一定要注意与CUDA、cuDNN版本适配问题,具体适配列表参考:

安装好后验证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推理时间对比

此处参考其他博主的一篇文章:

个人实践过程中遇到的一些问题:

最近在开发一个行为识别的功能,用到的模型是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那边修改,暂时只能这样了” 以上解释未经过验证,仅供参考。也欢迎大佬们补充指正。

2022.3.18更新

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

经验分享 程序员 微信小程序 职场和发展