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執行提供程序的節點。可用的擴展圖優化如下所示:
為了優化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
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);
總結
以上是生活随笔為你收集整理的ONNX 实时graph优化方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下Flash-LED的处理
- 下一篇: MindSpore基本原理