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 及其选项的更多信息,请查看文档。一些例子包括:

  1. cuda (Nvidia GPU)
  2. llvm (CPU)
  3. 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的更多相关文章

  1. 使用python的Flask实现一个RESTful API服务器端[翻译]

    最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务 ...

  2. Python入门(四,高级)

    一,面向对象 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的. ...

  3. 使用python的Flask实现一个RESTful API服务器端

    使用python的Flask实现一个RESTful API服务器端 最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文 ...

  4. Python进阶:全面解读高级特性之切片!

    导读:切片系列文章连续写了三篇,本文是对它们做的汇总.为什么要把序列文章合并呢?在此说明一下,本文绝不是简单地将它们做了合并,主要是修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔 ...

  5. PJSUA2开发文档--第三章 PJSUA2高级API

    3. PJSUA2高级API PJSUA2是PJSUA API以上的面向对象抽象.它为构建会话发起协议(SIP)多媒体用户代理应用程序(也称为IP / VoIP软电话)提供高级API.它将信令,媒体和 ...

  6. Kafka技术内幕 读书笔记之(三) 生产者——消费者:高级API和低级API——基础知识

    1. 使用消费组实现消息队列的两种模式 分布式的消息系统Kafka支持多个生产者和多个消费者,生产者可以将消息发布到集群中不同节点的不同分区上:消费者也可以消费集群中多个节点的多个分区上的消息 . 写 ...

  7. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  8. Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)

    事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...

  9. Python几种并发实现方案的性能比较

    http://blog.csdn.net/permike/article/details/54846831 Python几种并发实现方案的性能比较 2017-02-03 14:33 1541人阅读 评 ...

  10. Hadoop(四)HDFS的高级API操作

    一 HDFS客户端环境准备 1.1 jar包准备 1)解压hadoop-2.7.6.tar.gz到非中文目录 2)进入share文件夹,查找所有jar包,并把jar包拷贝到_lib文件夹下 3)在全部 ...

随机推荐

  1. vue中的find()函数的用法与扩展用法

    find函数基本格式:let obj=this.list.find(item=>item.code===val)首先在这里我们要知道的两个基础知识一.find是一个查找函数.二.箭头函数find ...

  2. tomcat启动时启动窗口出现乱码的解决方案

    工具/原料   一台安装了tomcat的电脑 方法/步骤     先来看看问题(图示),在tomcat的启动窗口打印的启动信息中包含了大量的中文乱码,虽然这些对tomcat本身的使用没有任何影响,但却 ...

  3. 【COM3D2Mod 制作教程(8)】实战!制作衣服部分(下)

    [COM3D2Mod 制作教程(8)]实战!制作衣服部分(下) 制作袜子 Mod 体会了裙子 Mod 的制作流程,不知道你有没有被麻烦的权重和形态键搞崩溃过,现在做袜子难道还得在来一遍?而且裆下的权重 ...

  4. spring官宣接入deepseek,真的太香了~

    写在前面 经常逛Spring官网(https://docs.spring.io/spring-ai/reference/api/chat/deepseek-chat.html)的小伙伴会发现, Spr ...

  5. Zookeeper - Zookeeper启动失败,日志报错 Missing election port for server: 2

    Missing election port for server: 2 [整理日期]2023年6月1日 [基础环境]JDK 1.8.0_372.Zookeeper 3.4.5 [问题描述]进行部署分布 ...

  6. UE5 C++ 程序进程退出

    // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include ...

  7. JSON驱动的vue可视化表单设计器组件

    form-create-designer 是基于 @form-create/element-ui 实现的表单设计器组件.可以通过拖拽的方式快速创建表单,轻松帮你搞定表单. 源码地址: Github | ...

  8. 使用PySide6/PyQt6实现Python跨平台表格数据分页打印预览处理

    我曾经在前面使用WxPython开发跨平台应用程序的时候,写了一篇<WxPython跨平台开发框架之列表数据的通用打印处理>,介绍在WxPython下实现表格数据分页打印处理的过程,在Wi ...

  9. pytorch报错 No module named 'nn'

    问题描述 pytorch 报错 No module named 'nn' 如果你 import torch 没问题,而 import torch.nn时出现问题,你可能命名使用了一个名字为 torch ...

  10. zookeeper windows 安装

    下载 zookeeper 下载地址为: https://zookeeper.apache.org/releases.html. 选择一个地址点击版本下载: 配置 下载后解压到指定磁盘的 zookeep ...