Deep Learning部署TVM Golang运行时Runtime
Deep Learning部署TVM Golang運行時Runtime
 介紹
 TVM是一個開放式深度學習編譯器堆棧,用于編譯從不同框架到CPU,GPU或專用加速器的各種深度學習模型。TVM支持來自Tensorflow,Onnx,Keras,Mxnet,Darknet,CoreML和Caffe2等各種前端的模型編譯。TVM編譯模塊可以部署在LLVM(Javascript或WASM,AMD GPU,ARM或X86),NVidia GPU(CUDA),OpenCL和Metal等后端上。
 TVM支持編程語言(如Javascript,Java,Python,C ++…)以及現在的Golang的運行時綁定。通過廣泛的前端,后端和運行時綁定,TVM使開發人員可以通過多種編程語言,將深度學習模型從各種框架集成和部署到各種硬件,并進行部署。
 TVM導入和編譯過程會生成一個圖JSON,一個模塊module和一個參數。集成TVM運行時的任何應用程序,都可以加載這些編譯的模塊并執行推理。可以找到有關使用TVM進行模塊導入和編譯的詳細教程。
 TVM現在支持通過Golang部署已編譯的模塊。Golang應用程序可以利用它通過TVM部署深度學習模型。本文的內容包括gotvm軟件包的介紹,軟件包的構建過程以及gotvm用于加載已編譯模塊并進行推理的示例應用程序。
 Package
 golang軟件包gotvm建立在TVM的C運行時接口之上。該軟件包中的API提取了本機C類型并提供了與Golang兼容的類型。軟件包源可以在gotvm上找到。
 該軟件包利用golang的接口,切片,函數閉包,并隱式處理API調用之間的必要轉換。
 
TVM運行時上的Golang接口
 如何開發
 如下圖所示,gotvmgolang應用程序可以集成來自各種框架的深度學習模型,而無需了解每個框架相關的接口API。開發人員可以利用TVM導入和編譯深度學習模型并生成TVM工件。 gotvm軟件包提供了golang友好的API來加載,配置,提供輸入和獲取輸出。
 
Import, Compile, Integrate and Deploy
 TVM編譯深度學習模型教程可用于從TVM前端支持的所有框架中編譯模型。該編譯過程生成了將模型集成并部署到目標上所需的組件工具。
 API
 gotvm軟件包提供了一些數據類型和API函數,用于從golang應用程序初始化,加載和推斷。像任何其他golang包一樣,我們只需要在gotvm此處導入包即可。
 ? 模塊:模塊API可用于將TVM編譯的模塊加載到TVM運行時并訪問任何功能。
 ? 值:Value API提供了一些輔助函數,用于設置golang類型(例如基本類型或切片)中的參數或獲取返回值。
 ? Function:Function API對于獲取函數的句柄并調用它們很有用。
 ? Array:Array API可用于通過golang slice設置和獲取Tensor數據。
 ? 上下文:上下文API包含用于構建后端上下文句柄的幫助程序函數。
 Example
 下面顯示了一個簡單的示例,其中包含內聯文檔,其中包含加載已編譯模塊并執行推理的過程。為簡單起見,這里忽略了錯誤處理,但在實際應用中很重要。
package main
// Import compiled gotvm package.
 import (
 “./gotvm”
 )
// Some constants for TVM compiled model paths.
 // modLib : Is the compiled library exported out of compilation.
 // modJson : TVM graph JSON.
 // modParams : Exported params out of TVM compilation process.
 const (
 modLib = “./libdeploy.so”
 modJSON = “./deploy.json”
 modParams = “./deploy.params”
 )
// main
 func main() {
 // Some util API to query underlying TVM and DLPack version information.
 fmt.Printf(“TVM Version : v%v\n”, gotvm.TVMVersion)
 fmt.Printf(“DLPACK Version: v%v\n\n”, gotvm.DLPackVersion)
// Import tvm module (so).
modp, _ := gotvm.LoadModuleFromFile(modLib)// Load module on tvm runtime - call tvm.graph_runtime.create
// with module and graph JSON.
bytes, _ := ioutil.ReadFile(modJSON)
jsonStr := string(bytes)
funp, _ := gotvm.GetGlobalFunction("tvm.graph_runtime.create")
graphrt, _ := funp.Invoke(jsonStr, modp, (int64)(gotvm.KDLCPU), (int64)(0))
graphmod := graphrt.AsModule()// Allocate input & output arrays and fill some data for input.
tshapeIn  := []int64{1, 224, 224, 3}
tshapeOut := []int64{1, 1001}
inX, _ := gotvm.Empty(tshapeIn, "float32", gotvm.CPU(0))
out, _ := gotvm.Empty(tshapeOut)
inSlice := make([]float32, (244 * 244 * 3))
rand.Seed(10)
rand.Shuffle(len(inSlice), func(i, j int) {inSlice[i],inSlice[j] = rand.Float32(),rand.Float32() })
inX.CopyFrom(inSlice)// Load params
bytes, _ = ioutil.ReadFile(modParams)
funp, _ = graphmod.GetFunction("load_params")
funp.Invoke(bytes)// Set module input
funp, _ = graphmod.GetFunction("set_input")
funp.Invoke("input", inX)// Run or Execute the graph
funp, _ = graphmod.GetFunction("run")
funp.Invoke()// Get output from runtime.
funp, _ = graphmod.GetFunction("get_output")
funp.Invoke(int64(0), out)// Access output tensor data.
outIntf, _ := out.AsSlice()
outSlice := outIntf.([]float32)// outSlice here holds flattened output data as a golang slice.
 
}
 gotvm擴展了TVM打包函數系統,以支持golang函數閉包作為打包函數。 可以使用示例將golang閉包注冊為TVM打包函數,并跨編程語言障礙調用相同的示例。
總結
以上是生活随笔為你收集整理的Deep Learning部署TVM Golang运行时Runtime的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 使用Relay部署编译ONNX模型
 - 下一篇: NNVM AI框架编译器