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当前只支持同步的运行模式,并且由其控制整个计算图的运行。

最新文章

  1. [原创]Oracle 12c 抢先安装手迹
  2. (shell )函数
  3. java中方法参数的一些总结(1)
  4. archlinux设置无线网络连接
  5. 洛谷P2738 [USACO4.1]篱笆回路Fence Loops
  6. 老陈---谈Delphi中SSL协议的应用[转]
  7. 【行为型】TemplateMethod模式
  8. 关于celery django django-celery版的搭配的报错问题及解决方法
  9. Docker 搭建 etcd 集群
  10. [Err] 1136 - Column count doesn't match value count at row 1
  11. k8s实践 - 如何优雅地给kong网关配置证书和插件。
  12. Linux中伪分布的搭建
  13. 32. Springboot 系列(八)动态Banner与图片转字符图案的手动实现
  14. Python idle运行代码出现'ascii' codec can't encode characters in position 0-2
  15. RAC
  16. MySQL--4操作数据表中的记录小结
  17. ubuntu忘记登录密码解决方法
  18. react-navigation 3.x版本的push、navigate、goback、pop、dispatch等常用方法
  19. Win10m的前景到底在何方?
  20. BZOJ4247_挂饰_KEY

热门文章

  1. CentOS 7 下编译安装 4.14 内核
  2. 超简单集成华为 HMS MLKit 机器学习服务:银行卡识别 SDK,一键实现银行卡绑定
  3. 企业BI应用解决方案主要包括哪些方面?
  4. c# 编程学习(二)
  5. C#内联函数 特性 MethodImplOptions.AggressiveInlining)
  6. 编译安装nginx报错 checking for C compiler ... not found
  7. LINUX服务器常用命令
  8. Linux运维实战——如何利用文件节点删除乱码文件
  9. cmd:WIN7操作系统下cmd窗口下的复制粘贴
  10. 在win10操作系统中pycharm启动时无法打开的解决方法