ONNXRuntime,深度学习领域的神经网络模型推理框架,从名字中可以看出它和 ONNX 的关系:以 ONNX 模型作为中间表达(IR)的运行时(Runtime)。

本文许多内容翻译于官方文档:https://onnxruntime.ai/docs/reference/high-level-design.html ,并适当地添加一些自己的理解,由于对ONNXRuntime的认识还不够深入,因此可能会存在一些错误,希望多多指正,深入交流。

特色:

  1. 在不同平台上,最大限度地、自动地使用定制的加速器(accelerators)和运行时(runtimes);
  2. 针对定制的加速器和运行时,提供良好的抽象和运行时(onnxruntime)来支持运行,这里的抽象也被称之为EP(Execution Provider,eg. CUDA、TensorRT、OpenVINO、ROCm等)。每个EP都各自定义自己的功能,比如内存分配、可以执行的单个的或融合的节点(注意:本文中所说的节点就是算子,两者等同;conv属于单个的算子,conv_bn_relu属于融合的算子),这些功能需要以标准的API形式暴露给 ONNXRuntime,以供其调用;
  3. ONNXRuntime并不要求每个EP都完全支持ONNX中定义的所有算子,这也就意味着 ONNXRuntime 可能需要在异构环境中才能完整的执行完一个模型,这里的异构环境是指涉及到多个计算硬件,比如CPU和GPU;
  4. 支持多种图优化(Graph Optimization),主要分为两类:
  • 全局变换(Global transformations):这种优化方式需要对整张计算图进行分析并优化;在源码中,每种变换都继承自 GraphTransformer 类;
  • 局部变换(Local transformations):这种优化方式相当于定义一些简单的重写规则(rewriting rules),比如消除一些没有具体操作的图节点(eg.推理阶段的dropout节点);与全局变换不同,重写规则一般只针对图中的部分节点,也就是说需要先判断图中的节点是否满足重写条件,然后再决定是否实施变换;在源码中,每种重写规则都继承自 RewriteRule 类,但是最后会使用 GraphTransformer 的一个派生类 RuleBasedGraphTransformer ,将所有的 RewriteRule 类聚合起来。

从更高视野看ONNXRuntime系统结构

从这张图中,我们可以看出ONNXRuntime的执行流程。

  1. ONNXRuntime 首先将 ONNX 模型转变为 In-memory 形式;
  2. 针对这个模型执行一些与EP无关的优化;
  3. 根据设置的EP(可能会有多个),将整体计算图分割成多个子图;
  4. 每个子图都被分配到一个相应的EP中,分配过程中要确保这个EP能够执行该子图;

由于很多EP都会对一些特定的算子做特殊优化,因此在分割子图时,ONNXRuntime希望充分利用这些EP的能力,但是仍然会存在一些算子不能被EP执行,或者高效执行,这时就需要设定一个默认的EP进行兜底,这个角色往往由CPU承担。

计算图分割的策略:首先设置可用的EP,比如

ort_sess = ort.InferenceSession('onnx_model/resnet50.onnx', providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])

然后依照providers中设定的顺序为每个EP充分分配其可以执行的子图,为了确保每个子图都被执行,一般会讲CPU EP放置在最后。ONNXRuntime当前只支持同步的运行模式,并且由其控制整个计算图的运行。

【推理引擎】ONNXRuntime 的架构设计的更多相关文章

  1. 【推理引擎】从源码看ONNXRuntime的执行流程

    目录 前言 准备工作 构造 InferenceSession 对象 & 初始化 让模型 Run 总结 前言 在上一篇博客中:[推理引擎]ONNXRuntime 的架构设计,主要从文档上对ONN ...

  2. Unity3d 引擎原理详细介绍、Unity3D引擎架构设计

    体系结构 为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则. Unity3D 引擎 Unity3D的是一个屡获殊荣的工具,用于 ...

  3. Slickflow.NET 开源工作流引擎基础介绍(六)--模块化架构设计和实践

    前言:在集成Slickflow.NET 引擎组件过程中,引擎组件需要将用户,角色等资源数据读取进来,供引擎内部调用:而企业客户都是有自己的组织架构模型,在引入模块化架构设计后,引擎组件的集成性更加友好 ...

  4. MySQL性能调优与架构设计——第11章 常用存储引擎优化

    第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处. ...

  5. Atitit.使用引擎加脚本架构的设计 使用php,js来开发桌面程序。。

    Atitit.使用引擎加脚本架构的设计 使用php,js来开发桌面程序.. 1. 引擎加脚本架构 跨平台,桌面与web的优势1 2. 架构桌面引擎(java,c#)2 3. php桌面引擎要点2 3. ...

  6. MySQL性能调优与架构设计——第3章 MySQL存储引擎简介

    第3章 MySQL存储引擎简介 3.1 MySQL 存储引擎概述 MyISAM存储引擎是MySQL默认的存储引擎,也是目前MySQL使用最为广泛的存储引擎之一.他的前身就是我们在MySQL发展历程中所 ...

  7. Unity3d 引擎原理详细介绍、Unity3D引擎架构设计 - zhibolife

    时间 2014-03-24 11:18:00  博客园-所有随笔区原文  http://www.cnblogs.com/zhibolife/p/3620440.html 体系结构 为了更好地理解游戏的 ...

  8. 阿里开源!轻量级深度学习端侧推理引擎 MNN

    阿里妹导读:近日,阿里正式开源轻量级深度学习端侧推理引擎“MNN”. AI科学家贾扬清如此评价道:“与 Tensorflow.Caffe2 等同时覆盖训练和推理的通用框架相比,MNN 更注重在推理时的 ...

  9. 阿里开源首个移动AI项目,淘宝同款推理引擎

    淘宝上用的移动AI技术,你也可以用在自己的产品中了. 刚刚,阿里巴巴宣布,开源自家轻量级的深度神经网络推理引擎MNN(Mobile Neural Network),用于在智能手机.IoT设备等端侧加载 ...

随机推荐

  1. 羽夏闲谈—— C 语言入门之问

    前言   最近加入了一个QQ频道,有很多想学C的纯小白.为什么这么说呢?因为他们会问一些环境用啥?为啥我配置不行?看了教程配置环境我也不会,咋配置?为啥这里代码这里有错误?啥语言好不好?诸如此类的问题 ...

  2. Spring Cloud之微服务注册到Eureka Server集群后访问改造

    上篇Spring Cloud之服务注册中心搭建Eureka Server服务注册中⼼ - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)已经已经成功将两个微服务注册到集群中,那么能正常能与注 ...

  3. 清理 Docker 占用的磁盘空间

    Docker 很占用空间,每当我们运行容器.拉取镜像.部署应用.构建自己的镜像时,我们的磁盘空间会被大量占用. 如果你也被这个问题所困扰,咱们就一起看一下 Docker 是如何使用磁盘空间的,以及如何 ...

  4. 面试官灵魂三问:什么是SOA?什么是微服务?SOA和微服务有什么区别?

    SOA SOA(Service-Oriented Architecture,面向服务的架构)是一种高层级的架构设计理念,可通过在网络上使用基于通用通信语言的服务接口,让软件组件可重复使用. 那么什么是 ...

  5. [Golang]一些书城项目中出现错误的原因和解决办法(一)

    跟着B站尚硅谷的GoWeb教程写书城项目,整理一下自己写的时候出现的错误和解决办法. 错误一:cartItem中只能加入一种书,SQL语句没有问题,但是购物车中的总金额和总数量正确: 原因:cartI ...

  6. 【C# Task】System.Threading.Channels 生产者和消费者模式

    前言 今天给大家分享一个微软官方的生产者/消费者方案的特性解决:Channel. Channel在% dotnet add package System.Threading.Channels 而在Co ...

  7. Git学习笔记(详细)、idea集成

    目录 概述 安装 常用命令 总结 idea使用git idea使用github Gitee GitLab Git使用git rebase 修改提交历史中的作者及邮箱信息 概述 官网:https://g ...

  8. shell脚本实现文件的自动上传以及下载 scp sftp lftp 还有expect命令

    转至: 最近需求要求定期从一个[定期更新的文件] 中解析员工信息 ,插入到数据库中. 按理来说很简单,  无非就是io流读文件,然后crud balalalala..... 其实不是的, 我我写的这个 ...

  9. Ubuntu 18.04 安装配置LAMP

    --作者:飞翔的小胖猪 --创建时间:2021年5月29日 --修改时间:2021年5月29日 一.准备 1.1 环境 操作系统:Ubuntu 18.04 网页引擎:Apache php版本:7.4 ...

  10. C语言while循环语句

    循环语句三要素 1.在循环外给循环变量赋初值2.进入循环判断循环变量3.在循环体内修改循环变量,使循环趋近结束 2021-11-02