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相关推荐

  1. “ compiler-rt”运行时runtime库

    " compiler-rt"运行时runtime库 编译器-rt项目包括: • Builtins-一个简单的库,提供了代码生成和其他运行时runtime组件所需的特定于目标的低级接 ...

  2. CUDA运行时 Runtime(四)

    CUDA运行时 Runtime(四) 一. 图 图为CUDA中的工作提交提供了一种新的模型.图是一系列操作,如内核启动,由依赖项连接,依赖项与执行分开定义.这允许定义一次图形,然后重复启动.将图的定义 ...

  3. CUDA运行时Runtime(三)

    CUDA运行时Runtime(三) 一.异步并发执行 CUDA将以下操作公开为可以彼此并发操作的独立任务: 主机计算: 设备计算: 从主机到设备的内存传输: 从设备到主机的存储器传输: 在给定设备的存 ...

  4. CUDA运行时 Runtime(二)

    CUDA运行时 Runtime(二) 一. 概述 下面的代码示例是利用共享内存的矩阵乘法的实现.在这个实现中,每个线程块负责计算C的一个方子矩阵C sub,块内的每个线程负责计算Csub的一个元素.如 ...

  5. CUDA运行时 Runtime(一)

    CUDA运行时 Runtime(一) 一. 概述 运行时在cudart库中实现,该库通过静态方式链接到应用程序库cudart.lib和 libcudart.a,或动态通过cudart.dll或者lib ...

  6. 深入浅出Substrate:剖析运行时Runtime

    基于Substrate开发自己的运行时模块,会遇到一个比较大的挑战,就是理解Substrate运行时(Runtime).本文首先介绍了Runtime的架构,类型,常用宏,并结合一个实际的演示项目,做了 ...

  7. iOS运行时Runtime浅析

    运行时是iOS中一个很重要的概念,iOS运行过程中都会被转化为runtime的C代码执行.例如[target doSomething];会被转化成objc)msgSend(target,@select ...

  8. ios runtime重要性_iOS运行时RunTime详解

    Objective-C语言是扩展于C语言的一种面向对象的编程语言,然而其方法的调用方式又和大多数面向对象语言大有不同,其采用消息传递.转发的方式进行方法的调用.因此在OC中,对象的真正行为往往发生在运 ...

  9. 07|Serverless运行时:使用自定义运行时支持自定义编程语言

    这一讲我将带你了解如何自定义函数运行时. 我们知道 Serverless 应用的函数代码是在 FaaS 中运行的,到目前为止,你也只能选择 FaaS 平台支持的编程语言开发应用,而 FaaS 平台支持 ...

最新文章

  1. winfrom gridview 导出到Excel文件的代码
  2. oracle 执行计划
  3. [云炬商业计划书阅读分享]土鸡养殖创业计划书
  4. Chomp!博弈(巧克力游戏)
  5. Python 直接赋值、浅拷贝和深度拷贝解析
  6. Java技术:Mybatis-plus常用API全套教程,值得收藏!
  7. css3中的渐变效果及花斑动画的实现
  8. asp.net html5 input提交,Render ASP.NET TextBox as HTML5 Input type “Number
  9. 机器人工程师技术资料
  10. 全闪存存储、混合闪存存储
  11. Mapbox Style 规范(中文)
  12. 使用Altium Designer10软件绘制芯片引脚图(以IC1114芯片为例)
  13. risc-v vector扩展1.0版本解读(riscv-v-spec-1.0)
  14. 2016服务器系统稳定吗,Windows Server 2016最受企业欢迎的5大特性
  15. 国内云服务器怎么选配置?如何低价购买国内云主机?
  16. 华为运营商级路由器配置示例 | 配置OptionC方式跨域BGP AD VPLS示例
  17. 【计算机网络】BitTorrent技术对网络的潜在危害
  18. 计组—运算器实验报告1最全分析总结
  19. 不刷单,新手还能怎么做淘宝?
  20. 【C语言项目实战】C语言实现文件加密

热门文章

  1. jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理
  2. 2022-2028年中国电池制造行业市场供需规模及投资前景预测报告
  3. 2022-2028年中国多肽药物市场研究及前瞻分析报告
  4. RPC 笔记(07)— socket 通信(多进程服务器)
  5. pandas dataframe 删除带空值的行 各种空值 (dropna()、isna()、isnull()、fillna())
  6. 高并发下的接口幂等性解决方案
  7. 操作系统学习笔记 第一章:操作系统概述(王道考研)
  8. Deformable 可变形的DETR
  9. Caffe框架GPU与MLU计算结果不一致请问如何调试?
  10. YOLOv5目标检测源码重磅发布了!