隨著針對深度學習的硬體設備不斷增加,我們需要更多知識,才能在不同設備上皆有好表現。為了解決開發新模型時對性能的擔憂,硬體後端提供者提供像 DNNL 等包含許多常用深度學習操作的庫,或提供諸如 TensorRT 的框架,以便用戶可以以特定方式描述模型,從而實現高性能。
然而,當用戶嘗試在新的library或設備上工作時,往往需要學習新的編程接口。
統一編程接口,以便:
下文中將演示作為硬體後端提供者,如何輕鬆實現自己的codegen(代碼生成器),並將其註冊為 Relay 後端編譯器以支援你的硬體設備或庫。下文涵蓋基於不同圖表示的兩種codegen:
1.生成C code
適用於硬體已有經過優化的 C/C++ 庫(如用於 CPU的 Intel CBLAS/MKL 或用於 GPU的 NVIDIA CUBLAS)。
C source code module與TVM runtime module完全相容,這意味著generated code可以由任何帶有適當flag的 C/C++ 編譯器編譯,因此我們唯一任務就是實現一個生成subgraph的 C codegen,並將其作為 C source module整合到 TVM runtime module中。下文將演示如何為硬體實現一個 C codegen。
2.生成其他graph representation
當硬體需要其他形式的圖表示(如 JSON 時),不僅需要實現一個codegen,還需要實現一個客製化的 TVM runtime module,以便 TVM 執行時知道此graph representation該如何執行。如果硬體已有完整的graph execution engine(如用於 GPU 的 TensorRT),就適用此方法。