onnx runtime文档学习1-介绍与架构

打印 上一主题 下一主题

主题 517|帖子 517|积分 1551

网上充斥着ONNX runtime的简单科普,却没有一个系统介绍ONNX runtime的博客,因此本博客旨在基于官方文档进行翻译与进一步的解释。ONNX runtime的官方文档:https://onnxruntime.ai/docs/
如果尚不认识ONNX格式,可以参照该博客专栏,本专栏对onnx 1.16文档进行翻译与进一步解释,
ONNX 1.16学习笔记专栏:https://blog.csdn.net/qq_33345365/category_12581965.html
如果以为有劳绩,贫苦点赞收藏关注,现在仅在CSDN发布,本博客会分为多个章节,现在尚在连载中。
开始编辑时间:2024/2/29;最后编辑时间:2024/2/29
所有资料均来自誊写时的最新内容。

本专栏链接如下所示,所有相关内容均会在此处收录。
https://blog.csdn.net/qq_33345365/category_12589378.html

介绍

参考:https://onnxruntime.ai/docs/

界说

ONNX Runtime是由微软公司开发和维护的深度学习推理框架。是一个跨平台的呆板学习模子加速器,具有灵活的接口,可以集成硬件特定的库。ONNX Runtime 可以与 PyTorch、Tensorflow/Keras、TFLite、scikit-learn 和其他框架中的模子一起使用。
ONNX Runtime推理

ONNX Runtime 推理支持关键的微软产品和服务,包罗 Office、Azure、Bing,以及数十个社区项目中的呆板学习模子。
ONNX Runtime 推理的示例用例包罗:


  • 进步各种呆板学习模子的推理性能
  • 在差别的硬件和操作系统上运行
  • 在 Python 中训练,但在 C#/C++/Java 应用程序中摆设
  • 对在差别框架中创建的模子进行训练和推理
工作原理


  • 获得一个模子。这可以是从任何支持导出/转换为ONNX格式的框架进行训练的模子。可以查看一些流行框架/库的tutorials。
  • 使用ONNX Runtime加载并运行模子。可以查看basic tutorials,了解怎样在差别编程语言中运行模子。
  • (可选)使用各种运行时配置或硬件加速器进行性能调优。可以从Performance section作为起点来了解。
即使没有第三步,ONNX Runtime通常会比原始框架提供性能改进。
ONNX Runtime对模子图应用了一系列图优化,然后根据可用的硬件特定加速器将其分割成子图。核心ONNX Runtime中的优化计算内核提供了性能改进,而且分配给子图的进一步加速来自每个Execution Provider。

架构

此章节列出ONNX的高层次设计
参考https://onnxruntime.ai/docs/reference/high-level-design.html

关键目标


  • 最大化并自动地使用差别平台上可用的定制加速器和运行时。
  • 为定制加速器和运行时提供精确的抽象和运行时支持。我们称这种抽象为execution provider。它界说并向 ONNX Runtime 公开一组功能:它可以实行的一组单一或融合节点,其内存分配器等。定制加速器和运行时是execution providers的实例。
  • 我们不希望execution providers总是能够完全在其设备上运行 ONNX 模子。这意味着 ONNX Runtime 必须能够在涉及多个execution providers的异构情况中实行单个模子。
  • 提供支持高级优化,这些优化可以通过 graph-transformation API表达为模子到模子的转换。这些转换分为两类:全局转换(需要分析和转换整个图形)以及局部转换(可以被捕获为简单的(代数)重写规则(rewriting rules))。
高级系统架构

整个流程非常简单。

  • 从一个 ONNX 模子开始,ONNX Runtime起首将模子图转换为其内存中的图表示形式。
  • 它实行一系列与provider无关的优化。
  • 它根据可用的execution provider将图分割成一组子图。
  • 每个子图都分配给一个execution provider。通过使用GetCapability()API 查询实行提供者的本领,以确保一个子图可以由execution provider实行。

关于切分的更多信息

ONNX Runtime 根据可用的实行提供程序将模子图分割成子图,每个子图对应一个独立的provider。ONNX Runtime 提供了一个默认的execution provider,用作无法推送到更专业但更高效的execution providers的运算符的后备实行。直观地说,我们希望尽大概地将计算推送到更专业的execution providers。
我们使用一种简单的图分割技术。可用的execution provider将按照特定次序考虑,而且每个provider将被分配它能够处理的最大子图(大概不止一个)。ONNX Runtime 提供的默认execution provider将作为最后一个考虑,以确保完备性。在将来可以考虑更复杂的优化方法(甚至可以实现为复合的execution provider)。
在概念上,每个分区都被简化为一个单一的融合运算符(fused operator)。通过调用execution provider的 Compile() 方法来创建它,并将其包装为自界说运算符。现在只支持同步实行模式。execution provider公开其内存分配器,用于为execution provider分配输入张量。重写和分区将初始模子图转换为由运算符组成的新图,这些运算符分配给默认execution provider或其他已注册的execution provider。ONNX Runtime 实行引擎负责运行此图。
关键设计


  • 多个线程可以调用同一个推剖析话对象上的Run()方法。具体信息请参阅 API文档(API doc)。
  • 为了实现这一点,所有内核的Compute()函数都是const的,这意味着内核是无状态的。
  • execution provider对运算符的实现称为内核(kernel)。每个execution provider支持一部分(ONNX)运算符/内核。
  • ONNX Runtime 保证默认execution provider支持所有运算符。
  • 张量表示:ONNX Runtime 使用尺度的张量运行时值表示。execution provider可以在内部使用差别的表示,但是在其子图的边界大将值转换为尺度表示(或从尺度表示转换位值)是它们的责任。
扩展


  • 添加一个定制运算符/内核
  • 添加一个execution provider
  • 添加一个新的图形转换
  • 添加一个新的重写规则

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表