【环境搭建:onnx模型部署】onnxruntime-gpu安装与测试(python)

这篇具有很好参考价值的文章主要介绍了【环境搭建:onnx模型部署】onnxruntime-gpu安装与测试(python)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. onnxruntime 安装

onnx 模型在 CPU 上进行推理,在conda环境中直接使用pip安装即可

pip install onnxruntime

2. onnxruntime-gpu 安装

想要 onnx 模型在 GPU 上加速推理,需要安装 onnxruntime-gpu 。有两种思路:

  • 依赖于 本地主机 上已安装的 cuda 和 cudnn 版本
  • 不依赖于 本地主机 上已安装的 cuda 和 cudnn 版本

要注意:onnxruntime-gpu, cuda, cudnn三者的版本要对应,否则会报错 或 不能使用GPU推理。
onnxruntime-gpu, cuda, cudnn版本对应关系详见: 官网

2.1 方法一:onnxruntime-gpu依赖于本地主机上cuda和cudnn

  • 查看已安装 cuda 和 cudnn 版本

    # cuda version
    cat /usr/local/cuda/version.txt
    
    # cudnn version
    cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
    
  • 根据 onnxruntime-gpu, cuda, cudnn 三者对应关系,安装相应的 onnxruntime-gpu 即可。

    ## cuda==10.2
    ## cudnn==8.0.3
    ## onnxruntime-gpu==1.5.0 or 1.6.0
    pip install onnxruntime-gpu==1.6.0
    

2.2 方法二:onnxruntime-gpu不依赖于本地主机上cuda和cudnn

在 conda 环境中安装,不依赖于 本地主机 上已安装的 cuda 和 cudnn 版本,灵活方便。这里,先说一下已经测试通过的组合:

  • python3.6, cudatoolkit10.2.89, cudnn7.6.5, onnxruntime-gpu1.4.0
  • python3.8, cudatoolkit11.3.1, cudnn8.2.1, onnxruntime-gpu1.14.1

如果需要其他的版本, 可以根据 onnxruntime-gpu, cuda, cudnn 三者对应关系自行组合测试。

下面,从创建conda环境,到实现在GPU上加速onnx模型推理进行举例。

2.2.1 举例:创建onnxruntime-gpu==1.14.1的conda环境

## 创建conda环境
conda create -n torch python=3.8

## 激活conda环境
source activate torch
conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=11.3 -c pytorch -c conda-forge
conda install cudnn==8.2.1
pip install onnxruntime-gpu==1.14.1
## pip install ... (根据需求,安装其他的包)

2.2.2 举例:实例测试

  • 打开终端,输入 watch -n 0.1 nvidia-smi, 实时查看gpu使用情况

    【环境搭建:onnx模型部署】onnxruntime-gpu安装与测试(python)

  • 代码测试,摘取API文章来源地址https://www.toymoban.com/news/detail-468755.html

      import numpy as np
      import torch
      import onnxruntime
      
      MODEL_FILE = '.model.onnx'
      DEVICE_NAME = 'cuda' if torch.cuda.is_available() else 'cpu'
      DEVICE_INDEX = 0
      DEVICE=f'{DEVICE_NAME}:{DEVICE_INDEX}'
      
      # A simple model to calculate addition of two tensors
      def model():
          class Model(torch.nn.Module):
              def __init__(self):
                  super(Model, self).__init__()
      
              def forward(self, x, y):
                  return x.add(y)
      
          return Model()
      
      # Create an instance of the model and export it to ONNX graph format
      def create_model(type: torch.dtype = torch.float32):
          sample_x = torch.ones(3, dtype=type)
          sample_y = torch.zeros(3, dtype=type)
          torch.onnx.export(model(), (sample_x, sample_y), MODEL_FILE,
                            input_names=["x", "y"], output_names=["z"], 
                            dynamic_axes={"x":{0 : "array_length_x"}, "y":{0: "array_length_y"}})
       
      # Create an ONNX Runtime session with the provided model
      def create_session(model: str) -> onnxruntime.InferenceSession:
          providers = ['CPUExecutionProvider']
          if torch.cuda.is_available():
              providers.insert(0, 'CUDAExecutionProvider')
          return onnxruntime.InferenceSession(model, providers=providers)
      
      # Run the model on CPU consuming and producing numpy arrays 
      def run(x: np.array, y: np.array) -> np.array:
          session = create_session(MODEL_FILE)
          z = session.run(["z"], {"x": x, "y": y})
          return z[0]   
    
      # Run the model on device consuming and producing ORTValues
      def run_with_data_on_device(x: np.array, y: np.array) -> onnxruntime.OrtValue:
          session = create_session(MODEL_FILE)
      
          x_ortvalue = onnxruntime.OrtValue.ortvalue_from_numpy(x, DEVICE_NAME, DEVICE_INDEX)
          y_ortvalue = onnxruntime.OrtValue.ortvalue_from_numpy(y, DEVICE_NAME, DEVICE_INDEX)
      
          io_binding = session.io_binding()
          io_binding.bind_input(name='x', device_type=x_ortvalue.device_name(), device_id=0, element_type=x.dtype, shape=x_ortvalue.shape(), buffer_ptr=x_ortvalue.data_ptr())
          io_binding.bind_input(name='y', device_type=y_ortvalue.device_name(), device_id=0, element_type=y.dtype, shape=y_ortvalue.shape(), buffer_ptr=y_ortvalue.data_ptr())
          io_binding.bind_output(name='z', device_type=DEVICE_NAME, device_id=DEVICE_INDEX, element_type=x.dtype, shape=x_ortvalue.shape())
          session.run_with_iobinding(io_binding)
      
          z = io_binding.get_outputs()
      
          return z[0]
    
      def main():
          create_model()
          # print(run(x=np.float32([1.0, 2.0, 3.0]),y=np.float32([4.0, 5.0, 6.0])))
          
          t1 = time.time()
          print(run(x=np.float32([1.0, 2.0, 3.0]),y=np.float32([4.0, 5.0, 6.0])))
          # [array([5., 7., 9.], dtype=float32)]t1 = time.time()
          t2 = time.time()
      
          print(run_with_data_on_device(x=np.float32([1.0, 2.0, 3.0, 4.0, 5.0]), y=np.float32([1.0, 2.0, 3.0, 4.0, 5.0])).numpy())
          # [ 2.  4.  6.  8. 10.]
          t3 = time.time()
          
          print(f'Done. ({(1E3 * (t2 - t1)):.1f}ms) Inference.')
          print(f'Done. ({(1E3 * (t3 - t2)):.1f}ms) Inference.')
      
      if __name__ == "__main__":
          main()   
    

到了这里,关于【环境搭建:onnx模型部署】onnxruntime-gpu安装与测试(python)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • onnxruntime推理时切换CPU/GPU以及修改onnx输入输出为动态

    前言 onnx模型作为中间模型,相较于pytorch直接推理,是有加速度效果的,且推理代码简单,不需要load各种网络。最近某些项目因为显存不够,onnxruntime推理时切换CPU/GPU,实现某些模型在CPU上推理,某些在GPU上推理。 查了一些别人的文章发现很多人都说onnxruntime推理没法像py

    2024年02月12日
    浏览(42)
  • ONNX:C++通过onnxruntime使用.onnx模型进行前向计算【下载的onnxruntime是编译好的库文件,可直接使用】

    微软联合Facebook等在2017年搞了个深度学习以及机器学习模型的格式标准–ONNX,旨在将所有模型格式统一为一致,更方便地实现模型部署。现在大多数的深度学习框架都支持ONNX模型转出并提供相应的导出接口。 ONNXRuntime(Open Neural Network Exchange)是微软推出的一款针对ONNX模型格式

    2024年02月15日
    浏览(36)
  • C++使用onnxruntime/opencv对onnx模型进行推理(附代码)

    结果: current image classification : French bulldog, possible : 16.17 对两张图片同时进行推理 current image classification : French bulldog, possible : 16.17 current image class ification : hare, possible : 8.47 https://download.csdn.net/download/qq_44747572/87810859 https://blog.csdn.net/qq_44747572/article/details/131631153

    2024年02月05日
    浏览(38)
  • Android+OnnxRuntime+Opencv+Onnx模型操作图片擦除多余内容

    今年来AI的发展非常迅速,在工业、医疗等等行业逐渐出现相应的解决方案,AI也逐渐成为各行业基础设施建设重要的一环,未来发展的大趋势,不过这也需要一个漫长的过程,需要很多技术型人才加入其中,除了工业设施的基础建设,在娱乐方向也有很多有趣的能力,不如图

    2024年04月13日
    浏览(34)
  • Ubuntu环境下C++使用onnxruntime和Opencv进行YOLOv8模型部署

    目录 环境配置 系统环境 项目文件路径  文件环境  config.txt  CMakeLists.txt type.names  读取config.txt配置文件 修改图片尺寸格式 读取缺陷标志文件 生成缺陷随机颜色标识 模型推理 推理结果获取 缺陷信息还原并显示 总代码 Ubuntu18.04 onnxruntime-linux-x64 1.12.1:https://github.com/microsof

    2024年01月17日
    浏览(33)
  • TRT4-trt-integrate - 3 使用onnxruntime进行onnx的模型推理过程

    onnx是microsoft开发的一个中间格式,而onnxruntime简称ort是microsoft为onnx开发的推理引擎。 允许使用onnx作为输入进行直接推理得到结果。 建立一个InferenceSession,塞进去的是onnx的路径,实际运算的后端选用的是CPU 也可以选用cuda等等 之后就是预处理 session.run就是运行的inference过程

    2024年02月15日
    浏览(31)
  • Yolov7如期而至,奉上ONNXRuntime的推理部署流程(CPU/GPU)

    一、V7效果真的的v587,识别率和速度都有了极大的提升,这里先放最新鲜的github链接: https://github.com/WongKinYiu/yolov7 二、v7的训练我这里就不做过多的赘述了,这里主要是进行讲解怎么把.pt文件转为onnx和后续的推理问题:  2.1首先是pip的版本非常重要,博主亲自测试了,发现

    2024年02月10日
    浏览(31)
  • 【深度学习】【Opencv】【GPU】python/C++调用onnx模型【基础】

    提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 OpenCV是一个基于BSD许可发行的跨平台计算机视觉和机器学习软件库(开源),可以运行在Linux、Windows、Android和Mac OS操作系统上。可以将pytorch中训练好的模型使用ONNX导出,再使用opencv中的dnn模块直接进行

    2024年02月04日
    浏览(43)
  • AI模型部署 | onnxruntime部署YOLOv8分割模型详细教程

    本文首发于公众号【DeepDriving】,欢迎关注。 0. 引言 我之前写的文章《基于YOLOv8分割模型实现垃圾识别》介绍了如何使用 YOLOv8 分割模型来实现垃圾识别,主要是介绍如何用自定义的数据集来训练 YOLOv8 分割模型。那么训练好的模型该如何部署呢? YOLOv8 分割模型相比检测模型

    2024年04月24日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包