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接口
如何开发
如下图所示,gotvm
golang应用程序可以集成来自各种框架的深度学习模型,而无需了解每个框架相关的接口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的更多相关文章
- iOS运行时Runtime浅析
运行时是iOS中一个很重要的概念,iOS运行过程中都会被转化为runtime的C代码执行.例如[target doSomething];会被转化成objc)msgSend(target,@select ...
- CUDA运行时 Runtime(一)
CUDA运行时 Runtime(一) 一. 概述 运行时在cudart库中实现,该库通过静态方式链接到应用程序库cudart.lib和libcudart.a,或动态通过cuda ...
- CUDA运行时 Runtime(四)
CUDA运行时 Runtime(四) 一. 图 图为CUDA中的工作提交提供了一种新的模型.图是一系列操作,如内核启动,由依赖项连接,依赖项与执行分开定义.这允许定义一次图形,然后重复启动.将 ...
- CUDA运行时 Runtime(三)
CUDA运行时 Runtime(三) 一.异步并发执行 CUDA将以下操作公开为可以彼此并发操作的独立任务: 主机计算: 设备计算: 从主机到设备的内存传输: 从设备到主机的存储器传输: 在给定设备的 ...
- CUDA运行时 Runtime(二)
CUDA运行时 Runtime(二) 一. 概述 下面的代码示例是利用共享内存的矩阵乘法的实现.在这个实现中,每个线程块负责计算C的一个方子矩阵C sub,块内的每个线程负责计算Csub的一个元素.如 ...
- “ compiler-rt”运行时runtime库
" compiler-rt"运行时runtime库 编译器-rt项目包括: Builtins-一个简单的库,提供了代码生成和其他运行时runtime组件所需的特定于目标的低级接口. ...
- 在Linux安装ASP.Net Core的运行时(Runtime)
在部署的时候,如果您不想在您的Linux服务器上安装.Net Core SDK,您可以只安装Runtime,接下来我们看看该如何安装运行时Runtime. 下载运行时文件 下载页面:https://w ...
- 【原】iOS动态性(五)一种可复用且解耦的用户统计实现(运行时Runtime)
声明:本文是本人 编程小翁 原创,转载请注明. 为了达到更好的阅读效果,强烈建议跳转到这里查看文章. iOS动态性是我的关于iOS运行时的系列文章,由浅入深,从理论到实践.本文是第5篇.有兴趣可以看看 ...
- iOS 运行时runtime控制私有变量以及私有方法
OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法.利用runtime机制让我们可以在程序运行时动态修改类.对象中的所有属性.方法,就算是私有方法以及私有属性都是可以动 ...
随机推荐
- PHP学员分享:126个常用的正则表达式分享
PHP学员分享:126个常用的正则表达式分享 电子邮件:/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/变量:/[a-zA-Z_\x7f-\xff][a-z ...
- LNMP环境搭建Wordpress博客
目录 LNMP架构工作原理 yum源安装 网站源包安装 LNMP是Linux Nginx MySQL/MariaDB Php/perl/python 的简称,是近些年才逐渐发展起来的构架,发展非常迅 ...
- hdu4784 不错的搜索( 买卖盐,要求整钱最多)
题意: 给你一个有向图,每个节点上都有一个盐价,然后给你k个空间,么个空间上节点与节点的距离不变,但盐价不同,对于每一个节点,有三种操作,卖一袋盐,买一袋盐 ,不交易,每一个节点可以跳掉( ...
- UVA11019KMP(二维矩阵匹配出现次数)
题意: 给你两个矩阵,一个大的一个小的,然后问你这个小矩阵在大的矩阵里出现了多少次? 思路: 说好了AC自动机的,我自己尝试写了个暴力的KMP竟然过了,AC自动机自己的模板还没写完 ...
- [CTF]维吉尼亚密码(维基利亚密码)
[CTF]维吉尼亚密码(维基利亚密码) ----------------------百度百科 https://baike.baidu.com/item/维吉尼亚密码/4905472?fr=aladdi ...
- c# p/invoke 无法加载指定的dll 找不到指定的模块 解决方法
写的程序本来开始好好的,不知道怎么突然就出现了以上这个问题,纠结了好久,网上找了各种方法,比如什么嵌入dll,在system32下面放入dll等等,均宣告失败 下面把我的解决方法写出来,以后只要是这个 ...
- Redis—简单动态字符串(SDS)
目录 Redis-简单动态字符串(SDS) SDS的定义 SDS与C字符串的区别 1. 常数复杂度获取字符串长度: 2. 杜绝缓冲区溢出: 3. 减少修改字符串时带来的内存重分配次数 4. 二进制安全 ...
- unity怎么把工程打包成unitypackage文件
unity怎么把工程打包成unitypackage文件 想探讨问题的原因 上课的时候,看到老师的磁盘都要爆满了,主要的原因是同学们提交的2DGameKit,工程文件太大了. 文件没有压缩,占用空间是2 ...
- IntelliJ IDEA中项目的包和目录结构显示设置
在新建的目录下再创建一个新目录时,出现了目录没有分层显示,这样使用起来十分不方便. 解决方案:点击右上方的设置按钮,将"compact middle packages"取消勾选,实 ...
- 使用C#进行数据库增删改查ADO.NET(一)
这节讲一下如何使用C#进行数据库的增删改查操作,本节以SQL Server数据库为例. .NET 平台,使用ADO.NET 作为与数据库服务器的桥梁,我们通过ADO.NET就可以使用C#语言操作数据库 ...