ONNX 实时graph优化方法
ONNX 實(shí)時graph優(yōu)化方法
ONNX實(shí)時提供了各種圖形優(yōu)化來提高模型性能。圖優(yōu)化本質(zhì)上是圖級別的轉(zhuǎn)換,從小型圖簡化和節(jié)點(diǎn)消除,到更復(fù)雜的節(jié)點(diǎn)融合和布局優(yōu)化。
圖形優(yōu)化根據(jù)其復(fù)雜性和功能分為幾個類別(或級別)。可以在線或離線執(zhí)行。在聯(lián)機(jī)模式下,優(yōu)化在執(zhí)行推斷之前完成,而在脫機(jī)模式下,實(shí)時將優(yōu)化的圖形保存到磁盤。ONNX實(shí)時提供Python、C++、C++和C API,啟用不同的優(yōu)化級別,并在脫機(jī)與在線模式之間進(jìn)行選擇。
下面將詳細(xì)介紹優(yōu)化級別、在線/離線模式以及控制它們的各種API。
圖優(yōu)化級別Graph Optimization Levels
圖形優(yōu)化分為三個級別:
?基本
?擴(kuò)展
?布局優(yōu)化
屬于一個級別的優(yōu)化,在應(yīng)用前一級別的優(yōu)化之后執(zhí)行(例如,在應(yīng)用基本優(yōu)化之后,應(yīng)用擴(kuò)展優(yōu)化)。
默認(rèn)情況下啟用所有優(yōu)化。
Basic圖優(yōu)化 Basic Graph Optimizations
? 這些都是保留語義的圖重寫,去除了冗余節(jié)點(diǎn)和冗余計(jì)算。在圖形分區(qū)之前運(yùn)行,適用于所有執(zhí)行提供程序。可用的基本圖形優(yōu)化如下:
?常量折疊:靜態(tài)計(jì)算僅依賴常量初始值設(shè)定項(xiàng)的圖形部分。這樣就不需要在實(shí)時計(jì)算它們。
?冗余節(jié)點(diǎn)消除:在不改變圖形結(jié)構(gòu)的情況下刪除所有冗余節(jié)點(diǎn)。目前支持以下此類優(yōu)化:
? Identity Elimination
? Slice Elimination
? Unsqueeze Elimination
? Dropout Elimination
? Semantics-preserving node fusions
?語義保留節(jié)點(diǎn)融合:將多個節(jié)點(diǎn)融合/折疊為單個節(jié)點(diǎn)。例如,Conv Add fusion將Add操作符,折疊為Conv操作符的偏移。目前支持以下此類優(yōu)化::
? Conv Add Fusion
? Conv Mul Fusion
? Conv BatchNorm Fusion
? Relu Clip Fusion
? Reshape Fusion
Extended圖優(yōu)化 Extended Graph Optimizations
這些優(yōu)化包括復(fù)雜的節(jié)點(diǎn)融合。它們在圖形分區(qū)之后運(yùn)行,并且僅應(yīng)用于分配給CPU或CUDA執(zhí)行提供程序的節(jié)點(diǎn)。可用的擴(kuò)展圖優(yōu)化如下所示:
為了優(yōu)化BERT模型的推理性能,GELU逼近和cuda執(zhí)行支持provider,注意融合中使用了近似。結(jié)果可能略有不同。根據(jù)評估,對準(zhǔn)確度的影響可以忽略不計(jì):F1 score for a BERT model on SQuAD v1.1 is almost same (87.05 vs 87.03)。
Layout優(yōu)化 Layout Optimizations
這些優(yōu)化更改了適用節(jié)點(diǎn)的數(shù)據(jù)布局,以實(shí)現(xiàn)更高的性能改進(jìn)。在圖形分區(qū)之后運(yùn)行,并且僅應(yīng)用于分配給CPU執(zhí)行提供程序的節(jié)點(diǎn)。可用的布局優(yōu)化如下:
? NCHWc Optimizer: Optimizes the graph by using NCHWc layout instead of NCHW layout.
在線/離線模式選擇 Online/Offline Mode
所有優(yōu)化都可以在線或離線執(zhí)行。在聯(lián)機(jī)模式下,在初始化推理會話時,還將在執(zhí)行模型推理之前,應(yīng)用所有啟用的圖優(yōu)化。每次啟動會話時,應(yīng)用所有優(yōu)化,都會增加模型啟動時間的開銷(特別是對于復(fù)雜模型),這在輸出場景中非常關(guān)鍵。這就是離線模式可以帶來很多好處的地方。在脫機(jī)模式下,在執(zhí)行圖形優(yōu)化之后,ONNX實(shí)時將生成的模型序列化到磁盤。隨后,當(dāng)為該模型創(chuàng)建新的推理會話時,可以使用已經(jīng)優(yōu)化的模型,來減少啟動時間。
注意:
?在脫機(jī)模式下運(yùn)行時,確保使用與模型推理,將在其上運(yùn)行的目標(biāo)計(jì)算機(jī),完全相同的選項(xiàng)(例如,執(zhí)行提供程序、優(yōu)化級別)和硬件(例如,不能在僅配備CPU的計(jì)算機(jī)上,運(yùn)行為GPU執(zhí)行提供程序預(yù)優(yōu)化的模型)。
?啟用布局優(yōu)化時,脫機(jī)模式只能在保存脫機(jī)模型時在與環(huán)境兼容的硬件上使用。例如,如果模型為AVX2優(yōu)化了布局,那么離線模型將需要支持AVX2的cpu。
使用說明 Usage
通用方法說明 General Note
Levels:
ONNX運(yùn)行時定義GraphOptimizationLevel枚舉,以確定將啟用上述哪些優(yōu)化級別。選擇一個級別可以實(shí)現(xiàn)該級別的優(yōu)化,也可以實(shí)現(xiàn)前面所有級別的優(yōu)化。例如,啟用擴(kuò)展優(yōu)化,也會啟用基本優(yōu)化。這些級別到枚舉的映射如下:
? 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:
要將優(yōu)化模型序列化到磁盤,請將SessionOptions選項(xiàng)optimized_model_path,設(shè)置為存儲優(yōu)化模型的所需路徑。
Python API Usage
import onnxruntime as rt
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);
總結(jié)
以上是生活随笔為你收集整理的ONNX 实时graph优化方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下Flash-LED的处理
- 下一篇: MindSpore基本原理