将TVM集成到PyTorch上
将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() - startprint("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上相关推荐
- 将TVM集成到PyTorch
将TVM集成到PyTorch 随着TVM不断展示出对深度学习执行效率的改进,很明显PyTorch将从直接利用编译器堆栈中受益.PyTorch的主要宗旨是提供无缝且强大的集成,而这不会妨碍用户.PyTo ...
- 如何在TVM上集成Codegen(上)
如何在TVM上集成Codegen(上) 许多常用的深度学习内核,或者提供DNNL或TensorRT等框架和图形引擎,让用户以某种方式描述模型,从而获得高性能.此外,新兴的深度学习加速器也有自己的编译器 ...
- 在PyTorch上用Keras,分布式训练开箱即用,告别没完没了的Debug
鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在开始一个新的机器学习项目时,难免要重新编写训练循环,加载模型,分布式训练--然后在Debug的深渊里看着时间哗哗流逝,而自己离项目核心还 ...
- TVM 优化 ARM GPU 上的移动深度学习
TVM 优化 ARM GPU 上的移动深度学习 随着深度学习的巨大成功,将深度神经网络部署到移动设备的需求正在迅速增长.与桌面平台上所做的类似,在移动设备中使用 GPU 既有利于推理速度,也有利于能源 ...
- TVM在ARM GPU上优化移动深度学习
TVM在ARM GPU上优化移动深度学习 随着深度学习的巨大成功,将深度神经网络部署到移动设备的需求正在迅速增长.与在台式机平台上所做的类似,在移动设备中使用GPU可以提高推理速度和能源效率.但是,大 ...
- 【组队学习】【29期】7. 集成学习(上)
7. 集成学习(上) 航路开辟者:李祖贤.薛传雨.六一.杨毅远.陈琰钰 领航员:刘思含 航海士:李祖贤 基本信息 开源内容:https://github.com/datawhalechina/ense ...
- 【组队学习】【23期】Datawhale集成学习(上)
集成学习(上) 开源内容:https://github.com/datawhalechina/team-learning-data-mining/tree/master/IntegratedLearn ...
- ElasticSearch集成SpringData史上最全查询教程
ElasticSearch集成SpringData史上最全查询教程 1.简单介绍 springboot 使用springdata操作es,ElasticsearchRepository使用QueryB ...
- TVM:在树莓派上部署预训练的模型
TVM:在树莓派上部署预训练的模型 之前我们已经介绍如何通过Python接口(AutoTVM)来编译和优化模型.本文将介绍如何在远程(如本例中的树莓派)上部署预训练的模型. 在设备上构建 TVM Ru ...
最新文章
- jQuery插件开发 - 其实很简单
- Windows 7 状态栏图标消失恢复
- More Effective C++: 01基础议题
- python 删除list中的第一个元素
- async/await 的基本实现和 .NET Core 2.1 中相关性能提升
- Java获得时间 String与Timestamp互转
- 立冬节气,设计师需要的PNG素材已为你备好
- matlab中常微分方法,MATLAB解常微分方程组的解法(好东西要共享)
- 围成一圈的排列组合问题_行测技巧:巧解环形排列组合
- 支持向量机很全的代码和数据集
- oracle regexp_instr,Oracle REGEXP_INSTR 用法
- 多元统计分析-联合分析
- windows设置自动获取IP地址
- 台达PLC与紫金桥监控组态软件的连接
- CNN之Xception Keras实现模型训练
- commitizen和cz-customizable配置git commit message
- CVPR2022论文集锦 | CVPR2022最新论文 | CVPR2022审稿结果 | CVPR2022录取结果
- 如何在 JavaScript 中检查数字是正数还是负数
- web项目中上传的图片项目重新部署之后被清空如何解决?
- SPSS数据类型学习
热门文章
- 本地打包Docker镜像上传至阿里云远程仓库(一站式脚本)
- Alibaba Cloud Linux 2.1903 LTS 64位服务器yum源下载404,Alibaba Cloud Linux 2实例中使用docker-ce、epel等YUM源安装软件失败
- ssh(Struts+spring+Hibernate)三大框架整合-简述
- 2022-2028年中国软件测试行业市场研究及前瞻分析报告
- GCC 编译 C++ 程序分步骤流程(预处理 gcc -E、编译 gcc -S、汇编 gcc -c 和链接 gcc 以及 gcc -o 选项)
- centos使用yum快速安装java的方法
- 提高班第三周周记(中秋第一天)
- LeetCode简单题之两个数组的交集 II
- ONNX MLIR应用示例(含源码链接)
- Camera噪声问题