编译ONNX模型Compile ONNX Models

本文是一篇介绍如何使用Relay部署ONNX模型的说明。

首先,必须安装ONNX包。

一个快速的解决方案是安装protobuf编译器,然后

pip install onnx –user

或者参考官方网站: https://github.com/onnx/onnx

import onnx

import numpy as np

import tvm

from tvm import te

import tvm.relay as relay

from tvm.contrib.download import download_testdata

Load pretrained ONNX model

这里使用的示例超分辨率模型与onnx说明中的模型完全相同

http://pytorch.org/tutorials/advanced/super_resolution_with_caffe2.html

跳过pytorch模型构造部分,下载保存的onnx模型

model_url = "".join(

[

"https://gist.github.com/zhreshold/",

"bcda4716699ac97ea44f791c24310193/raw/",

"93672b029103648953c4e5ad3ac3aadf346a4cdc/",

"super_resolution_0.2.onnx",

]

)

model_path = download_testdata(model_url, "super_resolution.onnx", module="onnx")

# now you have super_resolution.onnx on disk

onnx_model = onnx.load(model_path)

Out:

File /workspace/.tvm_test_data/onnx/super_resolution.onnx exists, skip.

Load a test image

Load a test image

A single cat dominates the examples!

from PIL import Image

img_url = "https://github.com/dmlc/mxnet.js/blob/main/data/cat.png?raw=true"

img_path = download_testdata(img_url, "cat.png", module="data")

img = Image.open(img_path).resize((224, 224))

img_ycbcr = img.convert("YCbCr")  # convert to YCbCr

img_y, img_cb, img_cr = img_ycbcr.split()

x = np.array(img_y)[np.newaxis, np.newaxis, :, :]

Out:

File /workspace/.tvm_test_data/data/cat.png exists, skip.

Compile the model with relay

target = "llvm"

input_name = "1"

shape_dict = {input_name: x.shape}

mod, params = relay.frontend.from_onnx(onnx_model, shape_dict)

with tvm.transform.PassContext(opt_level=1):

intrp = relay.build_module.create_executor("graph", mod, tvm.cpu(0), target)

Out:

/workspace/docs/../python/tvm/relay/frontend/onnx.py:2737: UserWarning: Mismatched attribute type in ' : kernel_shape'

==> Context: Bad node spec: input: "1" input: "2" output: "11" op_type: "Conv" attribute { name: "kernel_shape" ints: 5 ints: 5 } attribute { name: "strides" ints: 1 ints: 1 } attribute { name: "pads" ints: 2 ints: 2 ints: 2 ints: 2 } attribute { name: "dilations" ints: 1 ints: 1 } attribute { name: "group" i: 1 }

warnings.warn(str(e))

Execute on TVM

dtype = "float32"

tvm_output = intrp.evaluate()(tvm.nd.array(x.astype(dtype)), **params).asnumpy()

Display results

We put input and output image neck to neck

from matplotlib import pyplot as plt

out_y = Image.fromarray(np.uint8((tvm_output[0, 0]).clip(0, 255)), mode="L")

out_cb = img_cb.resize(out_y.size, Image.BICUBIC)

out_cr = img_cr.resize(out_y.size, Image.BICUBIC)

result = Image.merge("YCbCr", [out_y, out_cb, out_cr]).convert("RGB")

canvas = np.full((672, 672 * 2, 3), 255)

canvas[0:224, 0:224, :] = np.asarray(img)

canvas[:, 672:, :] = np.asarray(result)

plt.imshow(canvas.astype(np.uint8))

plt.show()

Notes

默认情况下,ONNX以动态形状定义模型。ONNX导入器在导入时保留这种动态性,编译器在编译时尝试将模型转换为静态形状。如果失败,模型中可能仍有动态操作。目前并非所有TVM内核都支持动态形状,请在discuss.tvm.apache.org上提交问题讨论,如果使用动态内核遇到错误。.

https://tvm.apache.org/docs/tutorials/frontend/from_onnx.html#sphx-glr-tutorials-frontend-from-onnx-py

Download Python source code: from_onnx.py

Download Jupyter notebook: from_onnx.ipynb

编译ONNX模型Compile ONNX Models的更多相关文章

  1. 使用Relay部署编译ONNX模型

    使用Relay部署编译ONNX模型 本文介绍如何使用Relay部署ONNX模型的入门. 首先,必须安装ONNX软件包. 一个快速的解决方案是安装protobuf编译器,然后 pip install o ...

  2. 【推理引擎】ONNX 模型解析

    定义模型结构 首先使用 PyTorch 定义一个简单的网络模型: class ConvBnReluBlock(nn.Module): def __init__(self) -> None: su ...

  3. python正则表达式--编译正则表达式re.compile

    编译正则表达式-- re.compile 使用re的一般步骤是先将正则表达式的字符串形 式编译为pattern实例,然后使用pattern实例处理文本并获取匹配结果(一个Match实例(值为True) ...

  4. python正则表达式(2)--编译正则表达式re.compile

    编译正则表达式-- re.compile 使用re的一般步骤是先将正则表达式的字符串形 式编译为pattern实例,然后使用pattern实例处理文本并获取匹配结果(一个Match实例(值为True) ...

  5. Django模型类之models字段类型和参数以及元数据meta

    models之字段类型和参数 示例: # class Test(models.Model): # courses_test # """测试学习用""& ...

  6. 隐马尔科夫模型(Hidden Markov Models)

    链接汇总 http://www.csie.ntnu.edu.tw/~u91029/HiddenMarkovModel.html 演算法笔记 http://read.pudn.com/downloads ...

  7. 隐马尔科夫模型(Hidden Markov Models) 系列之三

    转自:http://blog.csdn.net/eaglex/article/details/6418219 隐马尔科夫模型(Hidden Markov Models) 定义 隐马尔科夫模型可以用一个 ...

  8. Django模型层(models.py)之模型创建

    Django数据库操作是十分重要的内容,这两天简单学习了数据库的操作,这里做个总结. 1.ORM简介 简单的来说,ORM就是对象-关系-映射.它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖 ...

  9. ffmpeg源码编译安装(Compile ffmpeg with source) Part 2 : 扩展安装

    在Ubuntu,Debian,Mint上编译ffmpeg 本文主要为在Ubuntu,Debian和Mint上编译安装ffmpeg和库文件以及一些扩展的编解码器.当然这与从源中安装无关. 请首先看一下通 ...

随机推荐

  1. DVWA之Brute Force(暴力破解)

    目录 Low Medium High Impossible 暴力破解是指使用穷举法,举出所有的可能的结果,然后逐一验证是否正确! Low 源代码: <?php if( isset( $_GET[ ...

  2. unity怎么把工程打包成unitypackage文件

    unity怎么把工程打包成unitypackage文件 想探讨问题的原因 上课的时候,看到老师的磁盘都要爆满了,主要的原因是同学们提交的2DGameKit,工程文件太大了. 文件没有压缩,占用空间是2 ...

  3. IDEA 导入Springboot 项目:

    更多精彩关注公众号: IDEA 导入Springboot 项目: 1. 菜单->File->New->Project From Existing Sources 2. 选中项目中的p ...

  4. word打印华文字体出现乱码

    乱码原因:打印机自带字体库支持的问题 解决方法:解决方法是修改打印机的设置,不使用打印机的字体,直接使用电脑的字体. 具体操作:控制面板-设备和打印机-选中要设置的打印机-打印首选项-图像品质-设置字 ...

  5. 使用TK框架中updateByPrimaryKey与updateByPrimaryKeySelective区别

    int updateByPrimaryKey(T var1); int updateByPrimaryKeySelective(T var1); updateByPrimaryKeySelective ...

  6. window系统搭建医药后台系统

    软件准备: mysql版本: 5.7 jdk版本:1.8 tomcat版本: 9.0 mysql:5.7 第一步:新建Mysql连接   新建Mysql连接 第二步:新建数据库   新建数据库 第三步 ...

  7. C#读写内置类型的数据时是否原子操作

    Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uin ...

  8. [DB] ElasticSearch

    安装 root用户解压,修改配置文件 创建新用户es 修改文件权限:chown -R es:es /kkb/install/elasticsearch-6.7.0/ 用es用户启动ElasticSea ...

  9. Java中日志组件详解

    avalon-logkit Java中日志组件详解 lanhy 发布于 2020-9-1 11:35 224浏览 0收藏 作为开发人员,我相信您对日志记录工具并不陌生. Java还具有功能强大且功能强 ...

  10. python基础之常用模块一(sys、greenlet、pymysql、paramiko、pexpect、configparser)

    一.sys模块(内置模块) 用于提供对解释器相关的操作 import syssys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) ...