通过 DLPack 构建跨框架深度学习编译器

深度学习框架,如Tensorflow, PyTorch, and ApacheMxNet,快速原型化和部署深度学习模型提供了强大的工具箱。不幸的是,易用性往往以碎片化为代价:孤立地使用每个框架是很容易的。纵向集成使开发简化为常用案例,但冒险走出困境可能比较棘手。

一个支持不力的方案是在内存中将算子从一个框架直接传递到另一个框架,而没有任何数据重复或复制。支持此类使用案例,将使用户能够将管道串联在一起,在一个框架(或更快)中,某些算子比在另一个框架中得到更好的支持。框架之间的共享数据表示也将弥补这一差距,并允许编译器堆栈在为算子生成代码时针对单一格式。

DLPack是拉伸数据结构的中间内存表示标准。以 DLPack 为共同表示形式,可以利用 TVM 编写的脚本,这些框架传统上只能依赖于供应商提供的库。TVM DLPack功能可以在 DLPack 算子上运行,提供DLPack,将 PyTorch 和 MxNet 等框架中的算子数据结构与零数据拷贝进行衔接。

DLPack 提供了一个简单、便携的内存数据结构:

/*!

 * \brief Plain C Tensor object, does not manage memory.

 */

typedef struct {

/*!

   * \brief The opaque data pointer points to the allocated data.

   *  This will be CUDA device pointer or cl_mem handle in OpenCL.

   *  This pointer is always aligns to 256 bytes as in CUDA.

   */

void* data;

/*! \brief The device context of the tensor */

DLContext ctx;

/*! \brief Number of dimensions */

int ndim;

/*! \brief The data type of the pointer*/

DLDataType dtype;

/*! \brief The shape of the tensor */

int64_t* shape;

/*!

   * \brief strides of the tensor,

   *  can be NULL, indicating tensor is compact.

   */

int64_t* strides;

/*! \brief The offset in bytes to the beginning pointer to data */

uint64_t byte_offset;

} DLTensor;

例如,在 TVM 中声明和编译矩阵乘法算子,并构建一个使用 DLPack 表示的wrapper ,使该算子能够支持 PyTorch 算子。还与 MxNet 重复此演示。此扩展允许机器学习开发人员,在不牺牲性能的情况下,将研究代码快速移植到相对不受支持的硬件平台。

DLPack 如何提供框架和 TVM 之间共享的中间wrapper 的插图:

Figure 1

First, we compute a reference output in PyTorch:

import torch

x = torch.rand(56,56)

y = torch.rand(56,56)

z = x.mm(y)

然后,使用默认调度表定义并构建 TVM 矩阵乘法算子:

n = tvm.convert(56)

X = tvm.placeholder((n,n), name='X')

Y = tvm.placeholder((n,n), name='Y')

k = tvm.reduce_axis((0, n), name='k')

Z = tvm.compute((n,n), lambda i,j : tvm.sum(X[i,k]*Y[k,j], axis=k))

s = tvm.create_schedule(Z.op)

fmm = tvm.build(s, [X, Y, Z], target_host='llvm', name='fmm')

简洁性,不涵盖 TVM 的大集合原型调度,可以优化矩阵乘法。

然后,将 TVM 功能转换为支持 PyTorch 算子的功能:

from tvm.contrib.dlpack import to_pytorch_func

# fmm is the previously built TVM function (Python function)

# fmm is the wrapped TVM function (Python function)

fmm_pytorch = to_pytorch_func(fmm)

z2 = torch.empty(56,56)

fmm_pytorch(x, y, z2)

np.testing.assert_allclose(z.numpy(), z2.numpy())

验证结果是否匹配。

可以重复相同的示例,但使用 MxNet 代替:

import mxnet

from tvm.contrib.mxnet import to_mxnet_func

ctx = mxnet.cpu(0)

x = mxnet.nd.uniform(shape=(56,56), ctx=ctx)

y = mxnet.nd.uniform(shape=(56,56), ctx=ctx)

z = mxnet.nd.empty(shape=(56,56), ctx=ctx)

f = tvm.build(s, [X, Y, Z], target_host='llvm', name='f')

f_mxnet = to_mxnet_func(f)

f_mxnet(x, y, z)

np.testing.assert_allclose(z.asnumpy(), x.asnumpy().dot(y.asnumpy()))

在PyTorch Example示例的hood下

由于TVM提供dlpack张量转换为tvm s的功能,反之亦然,因此所有需要的是通过wrapper 功能来增加一些语法。使用带有dlpack支持的张量框架的通用转换器,可用于实现简易转换器。

NDArrayconvert_functo_pytorch_func

def convert_func(tvm_func, tensor_type, to_dlpack_func):

assert callable(tvm_func)

def _wrapper(*args):

args = tuple(ndarray.from_dlpack(to_dlpack_func(arg))\

if isinstance(arg, tensor_type) else arg for arg in args)

return tvm_func(*args)

return _wrapper

def to_pytorch_func(tvm_func):

import torch

import torch.utils.dlpack

return convert_func(tvm_func, torch.Tensor, torch.utils.dlpack.to_dlpack)

通过 DLPack 构建跨框架深度学习编译器的更多相关文章

  1. DLPack构建跨框架的深度学习编译器

    DLPack构建跨框架的深度学习编译器 Tensorflow,PyTorch和ApacheMxNet等深度学习框架提供了一个功能强大的工具包,可用于快速进行原型设计和部署深度学习模型.易用性通常是以碎 ...

  2. torch7框架 深度学习(1)

    前面已经安装好了torch,下面就来看看如何在torch框架上搭建深度学习模型,我一直觉得源码结合原理是机器学习最好的学习途径.所以我们从分析一个简单的案例开始吧. 参考Supervised Lear ...

  3. 学习笔记︱Nvidia DIGITS网页版深度学习框架——深度学习版SPSS

    DIGITS: Deep Learning GPU Training System1,是由英伟达(NVIDIA)公司开发的第一个交互式深度学习GPU训练系统.目的在于整合现有的Deep Learnin ...

  4. ASP.NET Core框架深度学习(一) Hello World

    对于学习Core的框架,对我帮助最大的一篇文章是Artech的<200行代码,7个对象——让你了解ASP.NET Core框架的本质>,最近我又重新阅读了一遍该文.本系列文章就是结合我的阅 ...

  5. ASP.NET Core框架深度学习(四)宿主对象

    11.WebHost  第六个对象 到目前为止我们已经知道了由一个服务器和多个中间件构成的管道是如何完整针对请求的监听.接收.处理和最终响应的,接下来来讨论这样的管道是如何被构建出来的.管道是在作为应 ...

  6. ASP.NET Core框架深度学习(二) 管道对象

    4.HttpContext 第一个对象 我们的ASP.NET Core Mini由7个核心对象构建而成.第一个就是大家非常熟悉的HttpContext对象,它可以说是ASP.NET Core应用开发中 ...

  7. ASP.NET Core框架深度学习(三) Server对象

    8.Server   第五个对象 服务器在管道中的职责非常明确,当我们启动应用宿主的WebHost的时候,服务它被自动启动.启动后的服务器会绑定到指定的端口进行请求监听,一旦有请求抵达,服务器会根据该 ...

  8. 深度学习调用TensorFlow、PyTorch等框架

    深度学习调用TensorFlow.PyTorch等框架 一.开发目标目标 提供统一接口的库,它可以从C++和Python中的多个框架中运行深度学习模型.欧米诺使研究人员能够在自己选择的框架内轻松建立模 ...

  9. [源码解析] 深度学习分布式训练框架 horovod (7) --- DistributedOptimizer

    [源码解析] 深度学习分布式训练框架 horovod (7) --- DistributedOptimizer 目录 [源码解析] 深度学习分布式训练框架 horovod (7) --- Distri ...

随机推荐

  1. Windows下Nexus 5 改user模式为debug模式

    博客链接:http://blog.csdn.net/qq1084283172/article/details/52337241 在学习Android软件安全的过程中,经常要用到Android的动态调试 ...

  2. 路由器逆向分析------MIPS系统网络的配置(QEMU)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69378333 MIPS系统网络的配置  使用QEMU 模拟正在运行的MIPS系统并 ...

  3. LA4636积木艺术

    题意:       有一些1*1*1的单位正方体积木,现在要摆积木,每一块积木有两种方法,要么放在地面上,要么放在别的积木的正上方,现在给你摆好积木的正面图和侧面图,问你最少用了多少块积木. 思路: ...

  4. Cookie、Session和Token认证

    目录 Cookie Session认证机制 Session的一些安全配置 Token认证机制 Token预防CSRF Session认证和Token认证的区别 前言:HTTP是一种无状态的协议,为了分 ...

  5. mimikatz的使用

    mimikatz mimikatz是法国人Gentil Kiwi编写的一款Windows平台下的神器,它具备很多功能,其中最主要的功能是直接从 lsass.exe 进程里获取处于active状态账号的 ...

  6. 一起来看看java并发中volatile关键字的神奇之处

    并发编程中的三个概念: 1.原子性 在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行. 2.可见性 对于可见性,Java提供了volati ...

  7. 基于python对B站收藏夹按照视频发布时间进行排序

    基于python对B站收藏夹按照视频发布时间进行排序 前言 在最一开始,我的B站收藏一直是存放在默认收藏夹中,但是随着视频收藏的越来越多,没有分类的视频放在一起,想在众多视频中找到想要的视频非常困难, ...

  8. restful 与 webapi 详解

    restful 什么是API API全称Aplication Programming Itererface即应用程序编程接口, 我们在开发应用程序时经常用到.API作为接口,用来"连接&qu ...

  9. 附近的人?你zao吗?

    前几天收到一个新的需求,需要实现类似"附近的人"的功能:根据自己当前的定位,获取距离范围内的所有任务地点.刚看到这个需求时有点懵逼,第一想到的就是要利用地球的半径公式去计算距离,也 ...

  10. [网络编程之客户端/服务器架构,互联网通信协议,TCP协议]

    [网络编程之客户端/服务器架构,互联网通信协议,TCP协议] 引子 网络编程 客户端/服务器架构 互联网通信协议 互联网的本质就是一系列的网络协议 OSI七层协议 tcp/ip五层模型 客户端/服务器 ...