【推理引擎】ONNXRuntime 的架構設計


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當前只支持同步的運行模式,並且由其控制整個計算圖的運行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM