【推理引擎】ONNXRuntime 的架构设计
Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
ONNXRuntime,深度学习领域的神经网络模型推理框架,从名字中可以看出它和 ONNX 的关系:以 ONNX 模型作为中间表达(IR)的运行时(Runtime)。
本文许多内容翻译于官方文档:https://onnxruntime.ai/docs/reference/high-level-design.html ,并适当地添加一些自己的理解,由于对ONNXRuntime的认识还不够深入,因此可能会存在一些错误,希望多多指正,深入交流。
特色:
- 在不同平台上,最大限度地、自动地使用定制的加速器(accelerators)和运行时(runtimes);
- 针对定制的加速器和运行时,提供良好的抽象和运行时(onnxruntime)来支持运行,这里的抽象也被称之为EP(Execution Provider,eg. CUDA、TensorRT、OpenVINO、ROCm等)。每个EP都各自定义自己的功能,比如内存分配、可以执行的单个的或融合的节点(注意:本文中所说的节点就是算子,两者等同;conv属于单个的算子,conv_bn_relu属于融合的算子),这些功能需要以标准的API形式暴露给 ONNXRuntime,以供其调用;
- ONNXRuntime并不要求每个EP都完全支持ONNX中定义的所有算子,这也就意味着 ONNXRuntime 可能需要在异构环境中才能完整的执行完一个模型,这里的异构环境是指涉及到多个计算硬件,比如CPU和GPU;
- 支持多种图优化(Graph Optimization),主要分为两类:
- 全局变换(Global transformations):这种优化方式需要对整张计算图进行分析并优化;在源码中,每种变换都继承自
GraphTransformer
类; - 局部变换(Local transformations):这种优化方式相当于定义一些简单的重写规则(rewriting rules),比如消除一些没有具体操作的图节点(eg.推理阶段的dropout节点);与全局变换不同,重写规则一般只针对图中的部分节点,也就是说需要先判断图中的节点是否满足重写条件,然后再决定是否实施变换;在源码中,每种重写规则都继承自
RewriteRule
类,但是最后会使用GraphTransformer
的一个派生类RuleBasedGraphTransformer
,将所有的RewriteRule
类聚合起来。
从更高视野看ONNXRuntime系统结构
从这张图中,我们可以看出ONNXRuntime的执行流程。
- ONNXRuntime 首先将 ONNX 模型转变为 In-memory 形式;
- 针对这个模型执行一些与EP无关的优化;
- 根据设置的EP(可能会有多个),将整体计算图分割成多个子图;
- 每个子图都被分配到一个相应的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 的架构设计相关推荐
- 火山引擎 RTC 全球化架构设计
动手点关注 干货不迷路 1. 为什么 RTC 要做全球化 RTC(Real Time Communication)是音视频基础设施,它已经融入了大家生活的方方面面:工作中,我们组织视频会议,即使团队成 ...
- 腾讯慧眼高可用架构设计
一.腾讯云慧眼简介 腾讯云慧眼人脸核身,是一组对用户身份信息真实性进行验证审核的服务套件,提供各类认证功能模块,包含证件 OCR 识别.活体检测.人脸比对, 及各类要素信息核验能力,以解决行业内大量对 ...
- “健康码”背后,腾讯慧眼高可用架构设计
导语 | 腾讯"防疫健康码"于2月9日率先落地深圳后,一个月累计访问量破60亿.而民众申领健康码过程中的"人脸识别登录验证",有着高准确率的要求.本文是腾讯云高 ...
- 基于时序数据的微内核预警引擎架构设计
一个完整的监控生态体系包括"监.析.控"三个环节,预警平台作为偏"析"的一环,既要对监控数据做规则分析,又要为控制系统生成预警日志,起着承上启下的作用.监控平台 ...
- sphinx mysql存储引擎_基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计...
Sphinx,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级).Sphinx创建索引的速度为:创建100万条记录的索引只需3-4分钟,创建1000万条记录的索引可以在5 ...
- 病历智能处理引擎的架构设计、实现和应用
作者简介: 吴大帅,新屿算法工程师,曾供职于宅米网.新达达,从事系统架构设计.算法设计等工作. 李智慧,<大型网站技术架构:核心原理与案例分析>作者,从事大型网站.分布式系统.大数据方面 ...
- Mesos容器引擎的架构设计和实现解析
引言:提到容器,大家第一时间都会想到Docker,毕竟Docker是目前最为流行的容器开源项目,它实现了一个容器引擎(Docker engine),并且为容器的创建和管理.容器镜像的生成.分发和下载提 ...
- MySQL性能调优与架构设计——第11章 常用存储引擎优化
第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处. ...
- 规则引擎 drools_网易考拉规则引擎平台架构设计与实践
背景 考拉安全部技术这块目前主要负责两块业务:一个是内审,主要是通过敏感日志管理平台搜集考拉所有后台系统的操作日志,数据导入到es后,结合storm进行实时计算,主要有行为查询.数据监控.事件追溯.风 ...
- UEBA架构设计之路3:复杂事件处理引擎
上篇引言 UEBA通过机器学习对用户.实体进行分析,不管这种威胁是不是已知,也包括了实时和离线的检测方式,能得到一个直观的风险评级和证据分析,让安全人员能够响应异常和威胁. 到底是怎样的整体架构呢?我 ...
最新文章
- scheduled 一秒钟执行一次_spring boot的Scheduled帮你实现定时任务,spring boot实践(11)...
- timertask run函数未执行_函数的防抖和节流是个啥???
- 解决导入的maven聚合工程中子模块项目不显示
- SAP Cloud for Customer的employee创建会自动生成Business partner
- red hat 5.5 vncserver搭建
- 机器学习之方差与偏差(bias-variance)
- thrift java first demo
- 医院耗材管理系统开发_15
- python+opencv填充图像不规则区域:fillPoly和fillConvexPoly区别、半透明填充方法
- 男女偷情为了什么 文 / 自然人生
- python写情人节女朋友的EXCEL画像!
- BlazePose: On-device Real-time Body Pose tracking
- AWK----awk与shell交互
- word计算机桌面加密,如何给电脑的Word文件加密
- 台式计算机更改bios密码,台式机或笔记本忘记Bios密码解决方法
- bluetoothd源码剖析(一)启动流程
- geohash 模块安装及使用(Anaconda.Python 2)
- Go:日志滚动(rolling)记录器 lumberjack 简介
- VIVE™在MWC上海展示生态全景,虚拟现实行业新趋势初见端倪
- 引导滤波(guidedFilter)与边窗盒式滤波(sideWindowBoxFilter)的C++与OpenCV实现