ONNX 实时graph优化方法
ONNX 实时graph优化方法
ONNX实时提供了各种图形优化来提高模型性能。图优化本质上是图级别的转换,从小型图简化和节点消除,到更复杂的节点融合和布局优化。
图形优化根据其复杂性和功能分为几个类别(或级别)。可以在线或离线执行。在联机模式下,优化在执行推断之前完成,而在脱机模式下,实时将优化的图形保存到磁盘。ONNX实时提供Python、C++、C++和C API,启用不同的优化级别,并在脱机与在线模式之间进行选择。
下面将详细介绍优化级别、在线/离线模式以及控制它们的各种API。
图优化级别Graph Optimization Levels
图形优化分为三个级别:
•基本
•扩展
•布局优化
属于一个级别的优化,在应用前一级别的优化之后执行(例如,在应用基本优化之后,应用扩展优化)。
默认情况下启用所有优化。
Basic图优化 Basic Graph Optimizations
- 这些都是保留语义的图重写,去除了冗余节点和冗余计算。在图形分区之前运行,适用于所有执行提供程序。可用的基本图形优化如下:
•常量折叠:静态计算仅依赖常量初始值设定项的图形部分。这样就不需要在实时计算它们。
•冗余节点消除:在不改变图形结构的情况下删除所有冗余节点。目前支持以下此类优化:
• Identity Elimination
• Slice Elimination
• Unsqueeze Elimination
• Dropout Elimination
• Semantics-preserving node fusions
•语义保留节点融合:将多个节点融合/折叠为单个节点。例如,Conv Add fusion将Add操作符,折叠为Conv操作符的偏移。目前支持以下此类优化::
- Conv Add Fusion
- Conv Mul Fusion
- Conv BatchNorm Fusion
- Relu Clip Fusion
- Reshape Fusion
Extended图优化 Extended Graph Optimizations
这些优化包括复杂的节点融合。它们在图形分区之后运行,并且仅应用于分配给CPU或CUDA执行提供程序的节点。可用的扩展图优化如下所示:
Optimization |
Execution Provider |
Comment |
GEMM Activation Fusion |
cpu |
|
Matmul Add Fusion |
cpu |
|
Conv Activation Fusion |
cpu |
|
GELU Fusion |
cpu or cuda |
|
Layer Normalization Fusion |
cpu or cuda |
|
BERT Embedding Layer Fusion |
cpu or cuda |
Fuse BERT embedding layer, layer normalization and attention mask length |
Attention Fusion |
cpu or cuda |
Attention mask has approximation in cuda execution provider |
Skip Layer Normalization Fusion |
cpu or cuda |
Fuse bias of fully connected layer, skip connection and layer normalization |
Bias GELU Fusion |
cpu or cuda |
Fuse bias of fully connected layer and GELU activation |
GELU Approximation |
cuda |
Erf is approximated by a formula using tanh function |
为了优化BERT模型的推理性能,GELU逼近和cuda执行支持provider,注意融合中使用了近似。结果可能略有不同。根据评估,对准确度的影响可以忽略不计:F1 score for a BERT model on SQuAD v1.1 is almost same (87.05 vs 87.03)。
Layout优化 Layout Optimizations
这些优化更改了适用节点的数据布局,以实现更高的性能改进。在图形分区之后运行,并且仅应用于分配给CPU执行提供程序的节点。可用的布局优化如下:
- NCHWc Optimizer: Optimizes the graph by using NCHWc layout instead of NCHW layout.
在线/离线模式选择 Online/Offline Mode
所有优化都可以在线或离线执行。在联机模式下,在初始化推理会话时,还将在执行模型推理之前,应用所有启用的图优化。每次启动会话时,应用所有优化,都会增加模型启动时间的开销(特别是对于复杂模型),这在输出场景中非常关键。这就是离线模式可以带来很多好处的地方。在脱机模式下,在执行图形优化之后,ONNX实时将生成的模型序列化到磁盘。随后,当为该模型创建新的推理会话时,可以使用已经优化的模型,来减少启动时间。
注意:
•在脱机模式下运行时,确保使用与模型推理,将在其上运行的目标计算机,完全相同的选项(例如,执行提供程序、优化级别)和硬件(例如,不能在仅配备CPU的计算机上,运行为GPU执行提供程序预优化的模型)。
•启用布局优化时,脱机模式只能在保存脱机模型时在与环境兼容的硬件上使用。例如,如果模型为AVX2优化了布局,那么离线模型将需要支持AVX2的cpu。
使用说明 Usage
通用方法说明 General Note
Levels:
ONNX运行时定义GraphOptimizationLevel枚举,以确定将启用上述哪些优化级别。选择一个级别可以实现该级别的优化,也可以实现前面所有级别的优化。例如,启用扩展优化,也会启用基本优化。这些级别到枚举的映射如下:
- GraphOptimizationLevel::ORT_DISABLE_ALL ->
Disables all optimizations - GraphOptimizationLevel::ORT_ENABLE_BASIC -> Enables
basic optimizations - GraphOptimizationLevel::ORT_ENABLE_EXTENDED
-> Enables basic and extended optimizations - GraphOptimizationLevel::ORT_ENABLE_ALL ->
Enables all available optimizations including layout optimizations
Online/Offline Mode:
要将优化模型序列化到磁盘,请将SessionOptions选项optimized_model_path
,
设置为存储优化模型的所需路径。
Python API Usage
importonnxruntime
asrt
sess_options
=rt
.SessionOptions
()
# Set graph optimization level
sess_options
.graph_optimization_level
=rt
.GraphOptimizationLevel
.ORT_ENABLE_EXTENDED
# To enable model serialization after graph optimization set this
sess_options
.optimized_model_filepath
="<model_output_path\optimized_model.onnx>"
session
=rt
.InferenceSession
("<model_path>",sess_options
)
C API Example:
const
OrtApi
*Ort
::g_api
=OrtGetApi(
ORT_API_VERSION
);
OrtEnv
*env
;
g_ort
->CreateEnv(ORT_LOGGING_LEVEL_WARNING
,"test",
&
env
);
OrtSessionOptions
*session_options
;
g_ort
->CreateSessionOptions(&session_options
)
// Set graph optimization level
g_ort
->SetSessionGraphOptimizationLevel(session_options
,ORT_ENABLE_EXTENDED
);
// To enable model serialization after graph optimization set this
const
wchar_t
*optimized_model_path
=L
"optimized_model_path";
g_ort
->SetOptimizedModelFilePath(session_options
,optimized_model_path
);
OrtSession
*session
;
const
wchar_t
*model_path
=L
"model_path";
g_ort
->CreateSession(env
,model_path
,session_option
,&
session
);
C# API Example:
SessionOptions so = new SessionOptions();
// Set graph optimization level
so.GraphOptimizationLevel = GraphOptimizationLevel.ORT_ENABLE_EXTENDED;
// To enable model serialization after graph optimization set this
so.OptimizedModelFilePath = "model_output_path\optimized_model.onnx"
var session = new InferenceSession(modelPath, so);
C++ API Example:
Ort::SessionOptions session_options;
// Set graph optimization level
session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);
// To enable model serialization after graph optimization set this
session_options.SetOptimizedModelFilePath("optimized_file_path");
auto session_ = Ort::Session(env, "model_file_path", session_options);
ONNX 实时graph优化方法的更多相关文章
- redmine在linux上的mysql性能优化方法与问题排查方案
iredmine的linux服务器mysql性能优化方法与问题排查方案 问题定位: 客户端工具: 1. 浏览器inspect-tool的network timing工具分析 2. 浏览 ...
- 基于TensorRT车辆实时推理优化
基于TensorRT车辆实时推理优化 Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Autonomous Vehic ...
- GPU优化方法[转]
CUDA优化的最终目的是:在最短的时间内,在允许的误差范围内完成给定的计算任务.在这里,“最短的时间”是指整个程序运行的时间,更侧重于计算的吞吐量,而不是单个数据的延迟.在开始考虑使用GPU和CPU协 ...
- HBase性能优化方法总结(转)
本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,这里涉及的不多,这部分可以参考:淘宝Ken Wu同学的博客. 1. 表的设计 1.1 Pr ...
- 性能优化之永恒之道(实时sql优化vs业务字段冗余vs离线计算)
在项目中,随着时间的推移,数据量越来越大,程序的某些功能性能也可能会随之下降,那么此时我们不得不需要对之前的功能进行性能优化.如果优化方案不得当,或者说不优雅,那可能将对整个系统产生不可逆的严重影响. ...
- HBase性能优化方法总结(转)
原文链接:HBase性能优化方法总结(一):表的设计 本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客. ...
- HBase性能优化方法总结(二):写表操作
转自:http://www.cnblogs.com/panfeng412/archive/2012/03/08/hbase-performance-tuning-section2.html 本文主要是 ...
- HBase性能优化方法总结(三):读表操作
本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客. 下面是本文总结的第三部分内容:读表操作相关的优化方法 ...
- Deep Learning基础--参数优化方法
1. 深度学习流程简介 1)一次性设置(One time setup) -激活函数(Activation functions) - 数据预处理(Data Preprocessing) ...
随机推荐
- 【Jwt】JSON Web Token
一.什么是JSON Web Token: 首先要明确的是JSON Web Token:是一个开放标准,这个标准定义了一种用于简洁,自包含的用于通信双方之间以JSON对象的形式安全传递信息的方法 而我们 ...
- 【JDK8】Java8 新增BASE64加解密API
什么是Base64编码? Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法 基于64个字符A-Z,a-z,0-9,+,/ ...
- 针对中国政府机构的准APT攻击样本Power Shell的ShellCode分析
本文链接网址:http://blog.csdn.net/qq1084283172/article/details/45690529 一.事件回放 网络管理员在服务器上通过网络监控软件检测到,有程序在不 ...
- hdu5007 小水题
题意: 给你一个串,如果出现子串 "Apple", "iPhone", "iPod", "iPad"输出MA ...
- POJ2752KMP逆序处理
题意: 给你一个串,问你都哪些位置即使前缀又是后缀. 思路: 可以用KMP来做,尝试过很多种方法,想把两个串接起来然后..失败,后来又想可以倒着匹配,就是把整个串倒过来..失败,说 ...
- Windows XP sp3 系统安装 Windbg 符号文件 Symbols 时微软失去支持的解决方案
0x01 前言 Windbg 是微软的正宗调试器,在正常的情况下调试一些程序并没有什么问题,但是如果需要调试分析程序的堆栈,或者是一些特殊的功能时则需要微软的符号文件的支持,所以符号文件是非常重要的, ...
- 0803-PyTorch的Debug指南
0803-PyTorch的Debug指南 目录 一.ipdb 介绍 二.ipdb 的使用 三.在 PyTorch 中 Debug 四. 通过PyTorch实现项目中容易遇到的问题 五.第八章总结 py ...
- ACM、考研、就业,在我心底已经有了明确的答案_人生没有完整的,只有无悔的
思绪再三,还是决定放弃了ACM,走上考研路(我现在是大二下学期,马上结束).虽然我们ACM的带队老师经常说:"ACM和考研是不冲突的",但是我感觉做ACM和考研的关系不是很紧密,而 ...
- 利用实体bean对象批量数据传输处理
利用实体bean对象批量数据传输处理 需求 现在有两方数据库表结构相同,一方A.另一个方B,现想从A处查询出多个表的数据,传输到B地保存起来. 解决方案1 最简单粗暴的方法就是,查询出A处相关表的数据 ...
- 字符串 前 L的含义
转自http://blog.csdn.net/whz_zb/article/details/7446901 一. 在字符串前加一个L作用: unicode字符集是两个字节组成的.L告示编译器使用两个字 ...