TVMC python:一种TVM的高级API
Step 0: Imports
from tvm.driver import tvmc
Step 1: Load a model
- 下载模型:
wget https://github.com/onnx/models/raw/b9a54e89508f101a1611cd64f4ef56b9cb62c7cf/vision/classification/resnet/model/resnet50-v2-7.onnx
mv resnet50-v2-7.onnx my_model.onnx
- 模型导入TVMC
此步骤将机器学习模型从支持的框架转换为 TVM 的高级图形表示语言(称为 Relay)。这是为了在tvm中为所有模型提供统一的起点。我们目前支持的框架是:Keras,ONNX,Tensorflow,TFLite和PyTorch。
model = tvmc.load('my_model.onnx') #Step 1: Load
如果想查看Relay,可运行:model.summary()
PS:查看模型Input/shape_dict的一种建议方法是通过 netron。打开模型后,单击第一个节点以查看输入部分中的名称和形状。
Step 2: Compile
现在我们的模型处于 Relay 中,我们的下一步是将其编译为所需的硬件以在其上运行。我们将此硬件称为目标.此编译过程将模型从 Relay 转换为目标计算机可以理解的较低级别语言。
为了编译模型,需要一个 tvm.target 字符串。要了解有关 tvm.targets 及其选项的更多信息,请查看文档。一些例子包括:
- cuda (Nvidia GPU)
- llvm (CPU)
- llvm -mcpu=cascadelake (Intel CPU)
package = tvmc.compile(model, target="llvm") #Step 2: Compile
编译步骤将返回一个包
Step 3: Run
现在可以在硬件目标上运行已编译的包。设备输入选项包括:CPU、Cuda、CL、Metal 和 Vulkan。
result = tvmc.run(package, device="cpu") #Step 3: Run
可以使用print(result)打印输出结果
Step 1.1: Tune [Optional & Recommended]
优化:似乎需要运行在编译只后才能用
通过调优可进一步提高运行速度。此可选步骤使用机器学习来查看模型(函数)中的每个操作,并尝试找到一种更快的方法来运行它。我们通过成本模型和基准测试可能的时间表来做到这一点。
简单示例如下:
tvmc.tune(model, target="llvm") #Step 1.1: Optional Tune
注:自动调优过程中,需要xgboost自行搜索优化空间,即需要xgboost的支持,但在执行过程报如下错误:
ImportError: cannot import name 'EarlyStopException' from 'xgboost.core' (/usr/local/lib/python3.8/dist-packages/xgboost/core.py)
查阅资料:
ImportError: cannot import name 'EarlyStopException' from 'xgboost.core'[Bug]
xgboost在1.6.0及之后的版本,去掉了EarlyStopException函数,同样可在xgboost中的core.py的github中可看到
因此,需要将xgboost版本回退到1.5.x版本
pip uninstall xgboost
pip install xgboost==1.5.0
终端输出结果如下:

可能存在可以忽略的UserWarnings。这应该会使最终结果更快,但可能需要数小时才能调整。
请参阅下面的“‘Saving the Tuning Results”部分。如果要应用优化结果,请确保将优化结果传递到编译中。
#tvmc.compile(model, target="llvm", tuning_records = "records.log") #Step 2: Compile
Example results:
In [102]: print(result)
Execution time summary:
mean (ms) median (ms) max (ms) min (ms) std (ms)
49.7363 49.5313 52.3399 48.5140 0.9405
Output Names:
['output_0']
优化后的模型:
In [29]: print(result)
Execution time summary:
mean (ms) median (ms) max (ms) min (ms) std (ms)
38.9687 39.0195 39.3786 38.2033 0.3377
Output Names:
['output_0']
Saving the tuning results
优化结果可以保存在文件中,供以后重复使用。
Method 1:
log_file = "hello.json"
# Run tuning
tvmc.tune(model, target="llvm", tuning_records=log_file)
...
# Later run tuning and reuse tuning results
tvmc.tune(model, target="llvm",tuning_records=log_file)
Method 2:
# Run tuning
tuning_records = tvmc.tune(model, target="llvm")
...
# Later run tuning and reuse tuning results
tvmc.tune(model, target="llvm",tuning_records=tuning_records)
Saving the model
为了加快速度,以后在加载模型(步骤 1)后,保存 Relay 版本。然后,该模型将显示在您保存它的位置,以便稍后在隐含的语法中使用。
model = tvmc.load('my_model.onnx') #Step 1: Load
model.save(desired_model_path)
Using Autoscheduler
使用下一代 tvm 实现可能更快的运行速度结果。计划搜索空间是自动生成的,这与以前需要手写计划不同。
tvmc.tune(model, target="llvm", enable_autoscheduler = True)
TVMC python:一种TVM的高级API的更多相关文章
- 使用python的Flask实现一个RESTful API服务器端[翻译]
最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务 ...
- Python入门(四,高级)
一,面向对象 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的. ...
- 使用python的Flask实现一个RESTful API服务器端
使用python的Flask实现一个RESTful API服务器端 最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文 ...
- Python进阶:全面解读高级特性之切片!
导读:切片系列文章连续写了三篇,本文是对它们做的汇总.为什么要把序列文章合并呢?在此说明一下,本文绝不是简单地将它们做了合并,主要是修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔 ...
- PJSUA2开发文档--第三章 PJSUA2高级API
3. PJSUA2高级API PJSUA2是PJSUA API以上的面向对象抽象.它为构建会话发起协议(SIP)多媒体用户代理应用程序(也称为IP / VoIP软电话)提供高级API.它将信令,媒体和 ...
- Kafka技术内幕 读书笔记之(三) 生产者——消费者:高级API和低级API——基础知识
1. 使用消费组实现消息队列的两种模式 分布式的消息系统Kafka支持多个生产者和多个消费者,生产者可以将消息发布到集群中不同节点的不同分区上:消费者也可以消费集群中多个节点的多个分区上的消息 . 写 ...
- python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...
- Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)
事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...
- Python几种并发实现方案的性能比较
http://blog.csdn.net/permike/article/details/54846831 Python几种并发实现方案的性能比较 2017-02-03 14:33 1541人阅读 评 ...
- Hadoop(四)HDFS的高级API操作
一 HDFS客户端环境准备 1.1 jar包准备 1)解压hadoop-2.7.6.tar.gz到非中文目录 2)进入share文件夹,查找所有jar包,并把jar包拷贝到_lib文件夹下 3)在全部 ...
随机推荐
- 使用idea合并 dev分支合并到test分支
这里展示将dev分支合并到test分支首先切换到test分支 按下图所示操作
- QT5笔记: 20. QStringListModel的使用
主要为 :添加.插入.修改.删除.清空等操作 例子:本例子中QListView 没有做任何处理,只是拖放至ui文件,设置了布局 MainWindow.h #ifndef MAINWINDOW_H #d ...
- MT Photos——一个比群晖Moments更好用的AI相册管理神器
MT Photos是一款为NAS用户量身打造的照片管理系统. 通过AI技术,自动将您的照片整理.分类,包括但不限于时间.地点.人物.照片类型. 您可以在任何支持Docker的系统中运行它. 如果您的操 ...
- C语言线程池的常见实现方式详解
在 C 语言中,线程池通常通过 pthread 库来实现.以下是一个详细的说明,介绍了 C 语言线程池的常见实现方式,包括核心概念.实现步骤和具体的代码示例. 点击查看代码 1. 线程池的基本结构 线 ...
- Vue3+TS项目无法识别自动导入提示
遇到问题 在写 Vue3 + TS 项目的时候,经常遇到写完一个新方法后,在组件使用的时候无法自动识别. 解决方案 Volar: Restart Vue Server 重新启动 Vue 服务
- JOKER智能可视化平台 20250204版本更新说明
本次 JOKER 低代码平台更新涵盖了代码生成.环境变量.可视化开发工具等多个关键领域的优化与新增功能,致力于为开发者提供更高效.更安全.更便捷的开发体验.同时,服务端功能的正式发布以及核心升级,进一 ...
- 深入浅出CPU眼中的函数调用&栈溢出攻击
深入浅出CPU眼中的函数调用--栈溢出攻击 原理解读 函数调用,大家再耳熟能详了,我们先看一个最简单的函数: #include <stdio.h> #include <stdlib. ...
- Netty源码—7.ByteBuf原理二
大纲 9.Netty的内存规格 10.缓存数据结构 11.命中缓存的分配流程 12.Netty里有关内存分配的重要概念 13.Page级别的内存分配 14.SubPage级别的内存分配 15.Byte ...
- IDEA构建Maven项目生成的文件说明(.mvn、mvnw、mvnw.cmd、.gitignore、.iml、.idea、pom.xml)
IDEA构建的maven+springBoot项目结构如下: 1..gitignore:分布式版本控制系统git的配置文件,意思为忽略提交 在 .gitingore 文件中,遵循相应的语法,即在每一行 ...
- RocketMQ的Producer是如何发送消息的
RocketMQ 的 Producer 发送消息过程涉及多个步骤,包括初始化.消息创建.发送方式选择 1.Producer初始化 首先,我们需要创建并初始化一个Producer示例 这段代码完成了以下 ...