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模型推理

    来源:本初-ben

    物联沃分享整理
    物联沃-IOTWORD物联网 » onnxruntime安装与使用(附实践中发现的一些问题)

    发表评论