zoukankan      html  css  js  c++  java
  • 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 ", gotvm.TVMVersion)

        fmt.Printf("DLPACK Version: v%v ", 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打包函数,并跨编程语言障碍调用相同的示例

     

    人工智能芯片与自动驾驶
  • 相关阅读:
    图书馆业务制图
    单元测试(输入一个数组和它的大小,输出这个数组中最大子数组的和)
    build to win读后感
    小学四则运算
    微信公众平台具体方案和人员分工
    问卷调查结果剖析
    题目确定与需求分析
    课程介绍与团队简介
    网站LOGO以及网页样式
    C Sharp进行网站信息抽取与小型内部搜索引擎的讲解
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/14489319.html
Copyright © 2011-2022 走看看