天天看點

【模型推理】談談推理引擎的推理組織流程

  本文主要讨論一下推理引擎的推理組織流程,包括 英偉達 tensorrt、華為 CANN 以及 TVM。

  對于使用者和大多開發者來說,其實不用太關心推理引擎内部是怎麼實作推理的,比如你在使用 tensorrt 的時候你隻要知道使用流程,怎麼去生成 Eng,怎麼調用 Eng 去 doInference 就好了。但是你不好奇嗎,它到底是怎麼 create Eng,怎麼 load Eng 去做 inference 的,Eng 到底是個什麼東西,它也不能像 .pth、.cfg、.pb 一樣用 netron 來直覺可視化。這裡我們就對 tensorrt、CANN、TVM 的推理組織流程展開讨論一下。

文章目錄

    • 1、TensorRT
    • 2、CANN
    • 3、TVM

1、TensorRT

  tensorrt 是一個非常好用的高性能推理架構,它的使用方式主要有以下兩種:

  (1)将 tensorrt 嵌入到成熟的 AI 架構中,如 TF-TRT、Torch-TRT、ONNX-TRT、TVM-TRT 等,大多做法是将 tensorrt 支援的算子優先以 tensorrt 的方式執行,tensorrt 不支援的算子回退到原架構執行;

  (2)直接使用 C++ API 或 Python API 去搭 tensorrt 的推理引擎,至于 tensorrt 不原生支援的算子,我可以采用更細粒度的算子進行拼接或替換(如用 resize 替換 upsample,用 clip 激活函數替換 relu6 等)甚至可以直接用 cuda 來自定義算子。

  tensorrt 的推理流程如下:

【模型推理】談談推理引擎的推理組織流程

  Network Definition 是用于解析模型之後在 tensorrt 中的網絡定義,Builder 主要作用是把 Network Definition 按照對應的硬體生成相應的可執行程式,也就是 Engine。如果你進行線上推理的話,其實直接接着進 runtime 就好了。而實際中,我們往往需要把這個 Engine 儲存成一個離線模型 .eng,以便于 runtime 過程的解耦,因為 runtime 往往在使用者現場,而 runtime 之前的操作往往在家裡。這個時候就需要用到 serialize 和 deserialize 了。

  通過 serialize(序列化)來生成二進制檔案 .eng,也即這裡的 Optimized Plans,這個就是所謂的離線模型了。

【模型推理】談談推理引擎的推理組織流程

  等去部署的時候,隻要我們手裡有離線模型就好了,然後借助 deserialize(反序列化)成硬體可執行程式 Engine 後繼續執行推理就好了。

【模型推理】談談推理引擎的推理組織流程

  是以這麼看來,整個 tensorrt createEng 和 doInference 的流程是這樣的:

【模型推理】談談推理引擎的推理組織流程

2、CANN

  昇騰的 CANN 可能大家接觸就沒 tessorrt 那麼多了,先簡單介紹一下。

  昇騰 CANN(Compute Architecture for Neural Networks)是華為針對 AI 全場景推出的異構計算架構,它對上支援業界主流的前端AI 架構,向下對使用者屏蔽系列化晶片的硬體差異,以豐富的軟體棧功能使能(我發現華為很喜歡用 “使能” 這兩個詞,我也用一下哈哈)使用者全場景的人工智能應用。CANN 的架構如下:

【模型推理】談談推理引擎的推理組織流程

  下面來談談 CANN create .om(昇騰的離線模型)的組織流程。

  其實 CANN 公開的資訊要比 tensorrt 豐富許多,CANN TBE 軟體棧的邏輯架構如下:

【模型推理】談談推理引擎的推理組織流程

  其中 Graph Engine(GE)+ Fusion Engine(FE)+ Tensor Boost Engine(TBE)就相當于 tensorrt 裡的 builder,下面來看看 GE + FE + TBE 的組織方式:

【模型推理】談談推理引擎的推理組織流程

  GE 是圖引擎,FE 是融合引擎,TBE 是張量加速引擎。GE 主要作用是解析前端架構、連結後端、排程排布的融合引擎;FE 主要作用是實作算子融合、UB 融合;TBE 主要作用是提供了算子在華為加速卡中的實作編譯、任務執行。結合上圖,整個流程分成這麼幾個階段:2~4 為算子适配替換、5 為子圖拆分優化、6 為排程與流程排布。不難看出,經過 6.1 階段後,實際推理過程中已經不存在所謂的網絡層的概念,此時是由一個個 taskinfo 組成了離線模型 .om 檔案,最終的 Runtime 時是通過調用 .om 内的資訊進行任務下發。

3、TVM

  大家都知道,昇騰 CANN 是基于 TVM 的,是以 CANN 的模型編譯過程和 TVM 比較相似。TVM 的模型編譯流程如下,其離線模型組織的位置在 relay.build -> graph optimize 之後。

【模型推理】談談推理引擎的推理組織流程

    整個 TVM 的編譯流邏輯如下[圖檔參考自]:

【模型推理】談談推理引擎的推理組織流程

  TVM 通過 relay.frontend.from_AIFrameworks 來接 AI 架構的模型轉換成 relay IR,在 relay IR 上做圖優化,完了後面接 compile engine 子產品,去做 compute + schedule,然後進行子圖編譯,這時就到了 TIR 層,會走 TIR PASS,最後是 CodeGen,CodeGen 主要實作了記憶體配置設定及指定硬體裝置上代碼生成,完了就可以序列化成 TVM 的離線模型了(.json 和 .params)。

繼續閱讀