【TVM 学习资料】使用 TVMC Python 入门:TVM 的高级 API

2023-11-16

本篇文章译自英文文档 Getting Starting using TVMC Python: a high-level API for TVM 作者是 Jocelyn Shiue。更多 TVM 中文文档可访问→TVM 中文站

本节将介绍针对 TVM 初学者设计的脚本工具。

开始前如果没有下载示例模型,需要先通过终端下载 resnet 模型:

mkdir myscripts
cd myscripts
wget https://github.com/onnx/models/raw/b9a54e89508f101a1611cd64f4ef56b9cb62c7cf/vision/classification/resnet/model/resnet50-v2-7.onnx
mv resnet50-v2-7.onnx my_model.onnx
touch tvmcpythonintro.py

用你熟悉的文本编辑器来编辑 Python 文件。

第 0 步:导入​

from tvm.driver import tvmc

第 1 步:加载模型

将模型导入 TVMC。这一步将机器学习模型从支持的框架,转换为 TVM 的高级图形表示语言 —— Relay。这是为 TVM 中的所有模型统一起点。目前支持的框架:Keras、ONNX、TensorFlow、TFLite 和 PyTorch。

model = tvmc.load('my_model.onnx') # 第 1 步:加载

查看 Relay,可运行 model.summary()。

所有框架都支持用 shape_dict 参数覆盖输入 shape。对于大多数框架,这是可选的;但对 PyTorch 是必需的,因为 TVM 无法自动搜索它。

model = tvmc.load('my_model.onnx', shape_dict={'input1' : [1, 2, 3, 4], 'input2' : [1, 2, 3, 4]}) #第一步: 加载 + shape_dict

推荐通过 netron 查看模型 input/shape_dict。打开模型后,单击第一个节点查看输入部分中的 name 和 shape。

第 2 步:编译

模型现在是用 Relay 表示的,下一步是将其编译到要运行的硬件(称为 target)。这个编译过程将模型从 Relay,翻译成目标机器可理解的底层语言。

编译模型需要一个 tvm.target 字符串。查看 文档 了解有关 tvm.targets 及其选项的更多信息。一些例子如下:

cuda (英伟达 GPU)
llvm (CPU)
llvm -mcpu=cascadelake(英特尔 CPU)

package = tvmc.compile(model, target="llvm") # 第 2 步:编译

编译完成后返回一个 package。

第 3 步:运行

编译后的 package 可在目标硬件上运行。设备输入选项有:CPU、Cuda、CL、Metal 和 Vulkan。

result = tvmc.run(package, device="cpu") # 第 3 步:运行

用 print(result) 打印结果。

第 1.5 步:调优(可选并推荐)

通过调优可进一步提高运行速度。此可选步骤用机器学习来查看模型(函数)中的每个操作,并找到一种更快的方法来运行它。这一步通过 cost 模型,以及对可能的 schedule 进行基准化来实现。

这里的 target 与编译过程用到的 target 是相同的。

tvmc.tune(model, target="llvm") # 第 1.5 步:可选 Tune

终端输出如下所示:

[Task  1/13]  Current/Best:   82.00/ 106.29 GFLOPS | Progress: (48/769) | 18.56 s
[Task  1/13]  Current/Best:   54.47/ 113.50 GFLOPS | Progress: (240/769) | 85.36 s
.....

出现的 UserWarnings 可忽略。调优会使最终结果运行更快,但调优过程会耗费几个小时的时间。

参阅下面的“保存调优结果”部分,若要应用结果,务必将调优结果传给编译。

tvmc.compile(model, target="llvm", tuning_records = "records.log") # 第 2 步:编译

保存并在终端中启动进程

python my_tvmc_script.py

示例结果

Time elapsed for training: 18.99 s
Execution time summary:
mean (ms)   max (ms)   min (ms)   std (ms)
  25.24      26.12      24.89       0.38



Output Names:
['output_0']

TVMC 附加功能

保存模型

加载模型(第 1 步)后可保存 Relay 版本来提高之后的工作效率。模型将被储存在你指定的位置,随后可以被转换过的语法使用。

model = tvmc.load('my_model.onnx') # 第 1 步:加载
model.save(desired_model_path)

保存 package

模型编译完成(第 2 步)后,可将 package 保存下来。

tvmc.compile(model, target="llvm", package_path="whatever") # 第 2 步:编译

new_package = tvmc.TVMCPackage(package_path="whatever")
result = tvmc.run(new_package, device="cpu") # 第 3 步:运行

使用 Autoscheduler

使用下一代 TVM,运行速度会更快。schedule 的搜索空间以前是手写的,而现在是自动生成的。 (了解更多: 1,2)

tvmc.tune(model, target="llvm", enable_autoscheduler = True)

保存调优结果

把调优结果保存在文件中,方便以后复用。

  • 方法 1:
log_file = "hello.json"

# 运行 tuning
tvmc.tune(model, target="llvm", tuning_records=log_file)

...

# 运行 tuning,然后复用 tuning 的结果
tvmc.tune(model, target="llvm",tuning_records=log_file)
  • 方法 2:
# 运行 tuning
tuning_records = tvmc.tune(model, target="llvm")

...

# 运行 tuning,然后复用 tuning 的结果
tvmc.tune(model, target="llvm",tuning_records=tuning_records)

对更复杂的模型调优

如果 T 的打印类似 …T.T…T…T…T.T.T.T.T.T.,则增加搜索时间范围:

tvmc.tune(model, trials=10000, timeout=10,)

为远程设备编译模型

为不在本地计算机上的硬件进行编译时,TVMC 支持使用远程过程调用(RPC)。要设置 RPC 服务器,可参考本 文档 中的“在设备上设置 RPC 服务器”部分。

TVMC 脚本包括以下内容,并进行了相应调整:

tvmc.tune(
     model,
     target=target, # 编译 target 为字符串 // 要编译的设备
     target_host=target_host, # 主机处理器
     hostname=host_ip_address, # 远程基准测试时使用的 RPC 跟踪器的 IP 地址
     port=port_number, # 要连接的 RPC 跟踪器的端口。默认为 9090。
     rpc_key=your_key, # 目标设备的 RPC 跟踪器密钥。提供 rpc_tracker 时需要
)

下载 Python 源代码
下载 Jupyter Notebook

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【TVM 学习资料】使用 TVMC Python 入门:TVM 的高级 API 的相关文章

随机推荐

  • 以太坊私有链搭建

    https blog csdn net wxb880114 article details 79202378 以太坊私有链搭建
  • 包含中文的properties文件,第一行要空出来

    项目的配置文件中包含了中文 文件的编码格式为UTF 8 当读取properties文件时第一个Key总是失败 后面的Key则正常 Properties类API http docs oracle com javase 7 docs api j
  • setsockopt用法详解

    本文转载于 https www cnblogs com baiduboy p 8127913 html 最近做的一个程序用到了IOCP通信模型 里面用到了setsockopt对套接字进行设置 看源代码的时候最setsockopt函数很不理解
  • windows下用cygwin编译android版ijkplayer

    http blog csdn net ytzys article details 47302123
  • 向服务器请求数据的五种技术

    Ajax 在它最基本的层面 是一种与服务器通讯而不重载当前页面的方法 数据可从服务器获得或发送给服务器 有多种不同的方法构造这种通讯通道 每种方法都有自己的优势和限制 有五种常用技术用于向服务器请求数据 1 XMLHttpRequest X
  • 怎么解决ZBrush保存历史记录太多问题

    经常有用户反映说ZBrush 保存历史记录太多了 导致文件太大了 模型已经是降低级别保存了 在保存历史记录的时候还是很慢很慢 不知道怎么才能减少ZBrush保存的历史步骤的多少 针对这一问题 小编统一解答一下 造成保存历史记录过多的原因 当
  • 使用Python,OpenCV进行形态学操作

    使用Python OpenCV进行形态学操作 1 效果图 2 原理 3 源码 3 1 制作logo源码 https blog csdn net qq 40985985 article details 116025825 3 2 腐蚀膨胀打开
  • uni-app分享微信好友,朋友圈

    1 在mixin文件夹中创建一个 share js文件 export default data return 默认的全局分享内容 share title path 全局分享的路径 imageUrl 全局分享的图片 desc 定义全局分享 1
  • 【无人机】基于灰狼优化算法的无人机路径规划问题研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 随着各种新兴技术的发展 无人机在灾后救援
  • 数据挖掘按技能划分,主要分为几类?

    数据挖掘技能从起初的单一门类的知识逐步发展成为一门综合性的多学科知识 并由此产生了很多的数据挖掘方法 这些方法种类多 类型也有很大的差别 为了满足用户的实际需要 现对数据挖掘技能进行如下几种分类 按挖掘的数据库类型分类 利用数据库对数据分类
  • 使用Chrome浏览器自带命令对web页面进行截图,生产高质量图片

    在平时工作中 我们对浏览器的web页面截图有很多方法 无论是Windows还是Mac操作系统 都自带截图工具 但是 如果我们打开的web页面非常的大 我使用操作系统自带的截屏工具就力不从心了 因为我们的显示屏幕不能显示web页面的所有内容
  • react时间戳转换成需要格式

    后端返回前端日期时间 一般给你的都是时间戳 然后前端展示需要转换成需要格式 以下是我开发中常遇到需要转换成的格式 看代码 class DateApi 将输入的毫秒字符串or毫秒数转换成指定的字符串格式 param string msStr
  • 代码圈复杂度cogC、ev、iv、v分别是什么含义

    代码圈复杂度cogC ev iv v分别是什么含义 前言 cogC ev iv v分别是什么含义 优化这四个指标的好处 优化方法 过度优化的坏处 书本推荐 文章推荐 工具推荐 前言 你好 在工作中看项目的代码有时明明代码很长却觉得容易阅读
  • 未能加载文件或程序集“office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”或它的某一个依赖项。拒绝访问

    未能加载文件或程序集 office Version 15 0 0 0 Culture neutral PublicKeyToken 71e9bce111e9429c 或它的某一个依赖项 拒绝访问 原因 office2013资源 原因 是因为
  • LeetCode基础-图-有向图-最短路径

    最短路径 从图中的一个顶点到另一个顶点的成本最小的路径 单点最短路径 在加权有向图中 给出一个起点 s 找到是否有一条到顶点 v 的路径 如果有 找出权重最小的那条 最短路径的性质 路径是有向的 权重不定表示距离 并不是所有顶点都是可达的
  • 【Javascript】数组拼接的两种方法

    数组拼接的两种方法 1 改变原数组 1 push 扩展运算法 1 不改变原数组 1 concat 2 扩展运算符 1 改变原数组 1 push 扩展运算法 利用push搭配扩展运算符的方法 arr2经过扩展运算符 由 3 4 5 变成3 4
  • 博途V11.0中如何编程模拟量转换步骤

    https blog csdn net u011402289 article details 90041534
  • MATLAB下配置C和C++编译器(MinGW)

    很多时候需要在Matlab下使用C或C 边写的代码 这时候就需要先用编译器将代码编译成Matlab可以用的mex文件 检测Matlab有没有可以使用的编译器 可以在命令行窗口下 输入mex setup 如果有的话就会显示出可以用的编译器 无
  • Python工程师常见的30个基础面试题

    一 Python 的特点和优点是什么 Python 是一门动态解释性的强类型定义语言 编写时无需定义变量类型 运行时变量类型强制固定 无需编译 在解释器环境直接运行 优点 1 解释性 Python 语言写的程序 不需要编译成二进制代码 可以
  • 【TVM 学习资料】使用 TVMC Python 入门:TVM 的高级 API

    本篇文章译自英文文档 Getting Starting using TVMC Python a high level API for TVM 作者是 Jocelyn Shiue 更多 TVM 中文文档可访问 TVM 中文站 本节将介绍针对