将TVM集成到PyTorch上

随着TVM不断展示出对深度学习执行效率的改进,很明显PyTorch将从直接利用编译器堆栈中受益。PyTorch的主要宗旨是提供无缝且强大的集成,而这不会妨碍用户。为此,PyTorch现在具有基于TVM的官方后端torch_tvm

用法很简单:

import
torch_tvm

torch_tvm.enable()

PyTorch将尝试在其JIT编译过程中,将所有可能的运算符转换为已知的Relay运算符。

背景

与许多其他ML框架不同,PyTorch公开了一个渴望执行的编程接口。这种编程风格避免了基于图的元编程,而专注于以Python方式直接控制n维数组(张量)。因此,该框架最初非常适合模型的试验和开发,但不适用于自动性能优化或部署。为了利用优化的编译器技术,PyTorch引入了一些较大的更改来解决此问题。

PyTorch 1.0引入了PyTorch IR,PyTorch专用的中间表示形式,用于类似于Relay的模型。可以通过模型跟踪将PyTorch程序转换为IR,该跟踪记录模型或Python的子集TorchScript的执行。新的TVM后端将PyTorch的IR降低到了Relay,并能够透明地提高PyTorch的性能,而无需用户参与。

整合与结果

为了支持Relay,PyTorch JIT添加了两个功能:自定义转换过程和自定义子图解释器。

当torch_tvm启用时,可以转换到中继PyTorch IR的子图Expr旨意被标记为继电器兼容。由于PyTorch IR并不总是包含形状信息,因此在调用之前,无法以有用的方式编译任何子图。

在用户调用期间,PyTorch JIT运行时将确定输入形状信息,并使用新的Relay C ++构建系统编译先前标记的子图。根据输入形状来缓存编译,以供后续运行。可以在README中找到更多详细信息。

torch_tvm建立了一个连续的基准测试系统,该系统正在监视ResNet18在CPU上的性能。对于各种ResNet型号,TVM的性能都是默认PyTorch
JIT后端的两倍以上。在AWS c5n.4xlarge实例上使用16个线程实现的每秒迭代次数(越大越好)。

这些结果令人鼓舞,该项目将继续致力于,在更多模型上提高CPU推理速度。

未来的工作

现在,PyTorch JIT进行了大量工作来查找其IR的纯功能子集,以馈送到Relay。这避免了将别名和控制流信息映射到中继的需要,但这不是必需的。将更多的PyTorch IR映射到Relay可能会取得性能上的胜利,这是该项目的目标。PyTorch IR在开发过程中正在迅速变化,因此必须谨慎进行。

将做更多的工作来确保PyTorch和TVM代码之间的切换是有效的。这包括统一线程模型,分配器以及减少与将输入复制到TVM相关的开销。

解析

如果已经编写了PyTorch模型,最简单的入门方法就是使用torch.jit.trace以下方法

import
torch_tvm

from
your_model import model, inputs

torch_tvm.enable(opt_level=3)

iters
= 100

warmup
= 10

#
Ensure your model is in eval mode and also turn off gradients.

with
torch.no_grad():

# Use
tuned parameters for better performance.

with
autotvm.apply_history_best("test/autotvm_tuning.log"):

# This is where all the compilation
happens.

trace_tvm = torch.jit.trace(model, inputs)

# Warmup

for _ in range(warmup):

_ =
trace_tvm(*inputs)

# Benchmark

start = time.time()

for _ in range(iters):

_ = trace_tvm(*inputs)

tvm_time = time.time() - start

print("Took {}s to run {}
iters".format(tvm_time, iters))

这段代码大部分来自Benchmarks.py。请注意,用于AVX2 LLVM编译的调整参数位于存储库test/文件夹中。

如果更直接使用Relay,可以通过(隐式)跟踪或TorchScript,直接从PyTorch函数中提取表达式:

def
add(a, b, c):

return a + b + c

#
via tracing

relay_graph
= torch_tvm.to_relay(add, inputs)

@torch.jit.script

def
mul(a, b, c):

return a * b * c

#
via script

relay_graph
= torch_tvm.to_relay(mul, inputs)

将TVM集成到PyTorch上的更多相关文章

  1. 将TVM集成到PyTorch

    将TVM集成到PyTorch 随着TVM不断展示出对深度学习执行效率的改进,很明显PyTorch将从直接利用编译器堆栈中受益.PyTorch的主要宗旨是提供无缝且强大的集成,而这不会妨碍用户.PyTo ...

  2. 如何在TVM上集成Codegen(上)

    如何在TVM上集成Codegen(上) 许多常用的深度学习内核,或者提供DNNL或TensorRT等框架和图形引擎,让用户以某种方式描述他们的模型,从而获得高性能.此外,新兴的深度学习加速器也有自己的 ...

  3. [转载]PyTorch上的contiguous

    [转载]PyTorch上的contiguous 来源:https://zhuanlan.zhihu.com/p/64551412 这篇文章写的非常好,我这里就不复制粘贴了,有兴趣的同学可以去看原文,我 ...

  4. 在Pytorch上使用稀疏矩阵

    在Pytorch上使用稀疏矩阵 最近在写一个NLP的小项目,用到了Pytorch做神经网络模型.但是众所周知NLP的一个特点就是特征矩阵是稀疏矩阵,当时处理稀疏矩阵用的是scipy.sparse,现在 ...

  5. TVM 优化 ARM GPU 上的移动深度学习

    TVM 优化 ARM GPU 上的移动深度学习 随着深度学习的巨大成功,将深度神经网络部署到移动设备的需求正在迅速增长.与桌面平台上所做的类似,在移动设备中使用 GPU 既有利于推理速度,也有利于能源 ...

  6. TVM在ARM GPU上优化移动深度学习

    TVM在ARM GPU上优化移动深度学习 随着深度学习的巨大成功,将深度神经网络部署到移动设备的需求正在迅速增长.与在台式机平台上所做的类似,在移动设备中使用GPU可以提高推理速度和能源效率.但是,大 ...

  7. 【微服务专题之】.Net6下集成消息队列上-RabbitMQ

    ​ 微信公众号:趣编程ACE关注可了解更多的.NET日常实战开发技巧,如需源码 请公众号后台留言 源码;[如果觉得本公众号对您有帮助,欢迎关注] .Net中RabbitMQ的使用 [微服务专题之].N ...

  8. Liferay7 BPM门户开发之45: 集成Activiti文件上传部署流程BPMN模型

    开发文件上传,部署流程模板. 首先,开发jsp页面,deploy.jsp <%@ include file="/init.jsp" %> <h3>${RET ...

  9. iOS支付宝,微信,银联支付集成封装(上)

    一.集成支付宝支付 支付宝集成官方教程https://docs.open.alipay.com/204/105295/ 支付宝集成官方demo https://docs.open.alipay.com ...

随机推荐

  1. 使用var和不使用var的区别(全局变量/局部变量)

    https://blog.csdn.net/czh500/article/details/80429133

  2. Think5之删除单条数据功能

    //删除单条学员信息 public function deleteStu(Request $request){ $stu_id = $request->param('id'); $result ...

  3. POJ 1386 欧拉路的判定

    题意:       给你n个单词,问你有没有一种排列方式可以所有单词的首部是相邻单词的尾部. 思路:       这个题目还挺基础的,就是个欧拉的判定,首先对于每一个单词,我们把他抽象成边,每个单词两 ...

  4. Win64 驱动内核编程-9.系统调用、WOW64与兼容模式

    系统调用.WOW64与兼容模式 这种东西都是偏向于概念的,我就把资料上的东西整理下粘贴过来,资料来源于胡文亮,感谢这位前辈. WIN64 的系统调用比 WIN32 要复杂很多,原因很简单,因为 WIN ...

  5. Windows核心编程 第六章 线程基础知识 (上)

    第6章 线程的基础知识 理解线程是非常关键的,因为每个进程至少需要一个线程.本章将更加详细地介绍线程的知识.尤其是要讲述进程与线程之间存在多大的差别,它们各自具有什么作用.还要介绍系统如何使用线程内核 ...

  6. nodejs-Stream(流)

    Node.js Stream(流) 描述++++++++++++++++++++++++++++++++++++++++++++++++++++ Stream 是一个抽象接口,Node 中有很多对象实 ...

  7. 【flutter学习】基础知识(一)

    今天开始学习一下flutter 学习思路:首先由一个简单的例子引出每次学习的对象,一点一点加入元素,针对于代码去了解学习详细知识. 看完本篇博客能够快速的读懂flutter简单代码. flutter ...

  8. Day003 包机制

    包机制 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包语句的语法格式为: package pkg1[.pkg2[.pkg3....]]; 一般利用公司的域名倒置作为包名; 例如: ...

  9. Spring随堂笔记

    Spring 1.IoC控制反转 IoC特点不用new 就可以初始化类: 控制反转的英文名叫 Ioc(Inversion of Control) ,依赖注入英文名叫DI(Dependency Inje ...

  10. 【小技巧】修改eclipse中Java注释中的作者日期等信息