Deep Learning部署TVM Golang运行时Runtime

摘要:
DeepLearning部署TVMGolang运行时TVM是一个开放的深度学习编译器堆栈,用于将各种深度学习模型从不同的框架编译到CPU、GPU或专用加速器。任何集成TVM运行时的应用程序都可以加载这些编译的模块并执行推理。TVM现在支持通过Golang部署编译模块。Packagegolang软件包gotvm构建在TVM的C运行时接口上。如何在TVM运行时上开发Golang接口如下图所示。gotvmgolang应用程序可以集成来自各种框架的深度学习模型,而不知道与每个框架相关的接口API。

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调用之间的必要转换。

 Deep Learning部署TVM Golang运行时Runtime第1张

 TVM运行时上的Golang接口

如何开发

如下图所示,gotvmgolang应用程序可以集成来自各种框架的深度学习模型,而无需了解每个框架相关的接口API。开发人员可以利用TVM导入和编译深度学习模型并生成TVM工件。 gotvm软件包提供了golang友好的API来加载,配置,提供输入和获取输出。

 Deep Learning部署TVM Golang运行时Runtime第2张

 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打包函数,并跨编程语言障碍调用相同的示例

 

免责声明:文章转载自《Deep Learning部署TVM Golang运行时Runtime》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇审计基础-PHP命令执行express的学习,与使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

记录ASP.NET CORE 3 部署过程

    环境为:window server 2008 IIS6.1  net core 3     首先时安装net.core 运行时。地址为:https://dotnet.microsoft.com/download/dotnet-core/3.0   大家找对应的版本进行下载安装。     IIS中创建网站,配置应用程序池.NET FrameWork...

XAML

XAML定义   XAML是一种相对简单、通用的声明式编程语言,它适合于构建和初始化.NET对象。   XAML仅仅是一种使用.NET API的方式,把它与HTML、可伸缩向量图形(SVG)或其他特定领域的格式或语言作比较是完全错误的。XAML由一些规则(告诉解析器和编译器如何处 理XML)和一些关键字组成,但它自己没有任何有意义的元素。因此,如果在没有...

26种提高ASP.NET网站访问性能的优化方法 .

1. 数据库访问性能优化 数据库的连接和关闭   访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源。 ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响。系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求...

.NET Runtime Optimization Service 1101 错误的解决

事件类型:    错误事件来源:    .NET Runtime Optimization Service事件种类:    无事件 ID:    1101日期:        2009-9-2事件:        20:27:09用户:        N/A计算机:    Owen-REPORT描述:.NET Runtime Optimization Se...

Golang中使用lua进行扩展

前言 最近在项目中需要使用lua进行扩展,发现github上有一个用golang编写的lua虚拟机,名字叫做gopher-lua.使用后发现还不错,借此分享给大家. 数据类型 lua中的数据类型与golang中的数据类型对应关系作者已经在文档中说明,值得注意的是类型是以L开头的,类型的名称是以LT开头的.golang中的数据转换为lua中的数据就必须转...

Golang反射上篇

目录 1、反射的定义 2、反射的基础数据类型 3、Type 4、Value 5、反射三大定律 5.1 反射第一定律 5.2 反射第二定律 5.3 反射第三定律 6、反射常用的API 6.1 获取type类型 6.2 获取Field信息 6.3 获取method信息 6.4 获取函数信息 6.5 赋值和转换关系 6.6 是否实现接口 6.7 v...