使用 C++ API 部署 TVM 模塊
更多 TVM 中文文檔可訪問 →https://tvm.hyper.ai/
使用 C++ API 部署 TVM 模塊
apps/howto_deploy?中給出了部署 TVM 模塊的示例,執(zhí)行下面的命令運行該示例:
獲取 TVM Runtime 庫
唯一要做的是鏈接到 target 平臺中的 TVM runtime。 TVM 給出了一個最小 runtime,它的開銷大約在 300K 到 600K 之間,具體值取決于使用模塊的數(shù)量。大多數(shù)情況下,可用 libtvm_runtime.so 文件去構建。
若構建 libtvm_runtime 有困難,可查看?tvm_runtime_pack.cc(集成了 TVM runtime 的所有示例)。用構建系統(tǒng)來編譯這個文件,然后將它包含到項目中。
查看?apps?獲取在 iOS、Android 和其他平臺上,用 TVM 構建的應用示例。
動態(tài)庫 vs. 系統(tǒng)模塊
TVM 有兩種使用編譯庫的方法,查看?prepare_test_libs.py?了解如何生成庫,查看?cpp_deploy.cc?了解如何使用它們。
把庫存儲為共享庫,并動態(tài)加載到項目中。
將編譯好的庫以系統(tǒng)模塊模式綁定到項目中。
動態(tài)加載更加靈活,能快速加載新模塊。系統(tǒng)模塊是一種更 static 的方法,可用在動態(tài)庫加載不可用的地方。

部署到 Android
為 Android Target 構建模型
針對 Android target 的 Relay 模型編譯遵循和 android_rpc 相同的方法,以下代碼會保存 Android target 所需的編譯輸出:
deploy_lib.so、deploy_graph.json、deploy_param.params 將轉(zhuǎn)到 Android target。
適用于 Android Target 的 TVM Runtime
參考?此處?為 Android target 構建 CPU/OpenCL 版本的 TVM runtime。參考這個?Java?示例來了解 Android Java TVM API,以及如何加載和執(zhí)行模型。

將 TVM 集成到項目中
TVM runtime 具有輕量級和可移植性的特點,有幾種方法可將 TVM 集成到項目中。
下文介紹如何將 TVM 作為 JIT 編譯器集成到項目中,從而用它在系統(tǒng)上生成函數(shù)的方法
DLPack 支持
TVM 的生成函數(shù)遵循 PackedFunc 約定,它是一個可以接受位置參數(shù)(包括標準類型,如浮點、整數(shù)、字符串)的函數(shù)。PackedFunc 采用?DLPack?約定中的 DLTensor 指針。唯一要做的是創(chuàng)建一個對應的 DLTensor 對象。
集成用戶自定義的 C++ 數(shù)組
在 C++ 中唯一要做的就是將你的數(shù)組轉(zhuǎn)換為 DLTensor,并將其地址作為 DLTensor* 傳遞給生成的函數(shù)。
集成用戶自定義的 Python 數(shù)組
針對 Python 對象 MyArray,需要做:
將 _tvm_tcode 字段添加到返回 tvm.TypeCode.ARRAY_HANDLE 的數(shù)組中
在對象中支持 _tvm_handle 屬性(以 Python 整數(shù)形式返回 DLTensor 的地址)
用 tvm.register_extension 注冊這個類