demo:tvm优化resnet50 llvm后端cpu上推理

news/2025/1/15 17:26:54/文章来源:https://www.cnblogs.com/qmjc/p/18412599

这是一个完整的例子。

使用预训练的resnet50模型,经过tvm优化调整,target=llvm,在cpu上进行推理。最后打印结果是 1 这个索引代表 gold fish

 

import onnx
from tvm.contrib.download import download_testdata
from PIL import Image
import numpy as np
import tvm.relay as relay
import tvm
from tvm.contrib import graph_executor

model_url = (
    # "https://github.com/onnx/models/blob/main/validated/vision/classification/resnet/model/resnet50-v2-7.onnx"
)

# model_path = download_testdata(model_url, "resnet50-v2-7.onnx", module="onnx")
model_path = "/home/po/.tvm_test_data/onnx/resnet50-v2-7.onnx"
onnx_model = onnx.load(model_path)

# Seed numpy's RNG to get consistent results
np.random.seed(0)

# img_url = "https://s3.amazonaws.com/model-server/inputs/kitten.jpg"
# img_path = download_testdata(img_url, "imagenet_cat.png", module="data")
img_path = "/home/po/.tvm_test_data/data/gold-fish.jpg"

# Resize it to 224x224
resized_image = Image.open(img_path).resize((224, 224))
img_data = np.asarray(resized_image).astype("float32")

# Our input image is in HWC layout while ONNX expects CHW input, so convert the array
img_data = np.transpose(img_data, (2, 0, 1))

# Normalize according to the ImageNet input specification
imagenet_mean = np.array([0.485, 0.456, 0.406]).reshape((3, 1, 1))
imagenet_stddev = np.array([0.229, 0.224, 0.225]).reshape((3, 1, 1))
norm_img_data = (img_data / 255 - imagenet_mean) / imagenet_stddev

# Add the batch dimension, as we are expecting 4-dimensional input: NCHW.
img_data = np.expand_dims(norm_img_data, axis=0)

# The input name may vary across model types. You can use a tool
# like Netron to check input names
input_name = "data"
shape_dict = {input_name: img_data.shape}
target = "llvm"

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

with tvm.transform.PassContext(opt_level=3):
    lib = relay.build(mod, target=target, params=params)

dev = tvm.device(str(target), 0)
module = graph_executor.GraphModule(lib["default"](dev))

dtype = "float32"
module.set_input(input_name, img_data)
module.run()
output_shape = (1, 1000)
tvm_output = module.get_output(0, tvm.nd.empty(output_shape)).numpy()
print("predict imgnet index=", np.argmax(tvm_output))
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796646.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024金砖大赛网络安全赛项区域选拔赛-简单的rce

1. Echo写入一句话木马蚁剑连接木马根目录下找到flag

Google Colab 简单使用

使用Google Colab需要谷歌账号和一点点魔法。注册好账号,找到我的云盘,可以点击右上角的log 跳转。我的云端银盘这里可以选择上传文件还是文件夹,还可以新建文件夹然后在这个文件夹中选择你要上传的文件。例如我这创建了一个train_test 的文件夹,然后上传了 test_ScVgIM0.z…

Go runtime 调度器精讲(四):运行 main goroutine

原创文章,欢迎转载,转载请注明出处,谢谢。0. 前言 皇天不负有心人,终于我们到了运行 main goroutine 环节了。让我们走起来,看看一个 goroutine 到底是怎么运行的。 1. 运行 goroutine 稍微回顾下前面的内容,第一讲 Go 程序初始化,介绍了 Go 程序是怎么进入到 runtime 的…

Python网页应用开发神器Dash 2.18.1稳定版本来啦

本文示例代码已上传至我的Github仓库:https://github.com/CNFeffery/dash-master Gitee同步仓库地址:https://gitee.com/cnfeffery/dash-master大家好我是费老师,上周Dash发布了2.18.0新版本,并于今天发布了可稳定使用的2.18.1版本(自古.1版本最稳✌),今天的文章中就将针…

吊打面试官!从多维度理解架构

大家好,我是汤师爷~ 在工作当中,我们经常会听到以下说法:产品负责人说,现在的业务架构太复杂,需要仔细梳理下。 技术领导说,这个项目很复杂,需要做下系统架构方案评审。 研发经理说,这次秒杀活动访问量非常大,需要用到高并发架构方案。 一线研发说,互联网大厂都会用到…

数组的下标越界

1.数组下标 数组的下标通俗来讲是数组中数据的代号,例如a[0]=1,即数组下标0代表1 2.下标越界 假设创建的数组内存为3(a=new int[3]),则数组的下标为0,1,2. 如果多输出了下标3,则会显示下标越界。 1.正常数组的输出2.下标越界的输出(即提示你数组下标越界异常!) 3.数组…

转载:国产操作系统麒麟v10、UOS在线打开excel文件并动态赋值

在实际的开发过程中,经常会遇到数据库中的数据填充到excel生成一份正式文件的功能,PageOffice客户端控件支持在线预览Excel文件时,通过Workbook对象来实现对Excel文件的数据填充功能,如果只是简单的填充一下数据,那么通过调用Sheet对象的openCell方法获取到Cell对象并赋值…

构建 openEuler Embedded 24.03 LTS (Phytium BSP)

Ubuntu 24.04 构建 openEuler Embedded 24.03 LTS (Phytium BSP) 参考链接:Phytium-OpenEuler-Embedded-BSP - Gitee 1 介绍 本文档介绍如何在Ubuntu 24.04上构建openEuler Embedded 24.03 LTS (Phytium BSP)。对计算机配置有要求。 2 脚本 将以下内容复制到新文件oe_phy.sh,…

架构师备考的一些思考(四)

前言 对于数学,我们之前学的是对的,但不是真的,所以我们没有数学思维。 对于计算机,我们学校教的是对的,但不是真的,所以仅仅从学校学习知识的应届毕业生,不论985,211,本科,专科都一样,都是一张白纸,啥也不会。 案例分析 案例分析是5选3,第一题必答。问题一的类型 …

字符串-面试题

字符串的相关面试题String 的不可变性String底层是一个 final修饰的字符数组,当改变String的值时,会在常量池生成新的字符串,字符数组的地址指向常量池中新的字符串StringBuffer的扩容原理String、StringBuffer、StringBuilder三者对比Strings是不可变的字符序列,底层是一个…

单考一个OCP认证?还是OCP和OCM认证都要考?

​ Oracle的OCP认证是数据库行业非常经典的一个认证,从事数据库行业的人都建考一个 Oracle OCP 认证。 OCP认证内容包括: OCA部分:数据库基础知识、SQL 语言使用、基本的数据库管理技能等,如数据库安装与配置、理解数据库架构、管理数据库实例、备份和恢复,以及使用 SQL 进…

为什么那么多开源软件都用netty来做网络通信编程框架?

1、用netty来做网络通信编程框架而不是我们自己去基于JDK NIO来编程的好处有如下这些: (1)、netty支持常见的应用层协议(如:HTTP、FTP、DNS等),还可以支持自定义协议; (2)、netty可以自动解决网络编程当中的粘包与半包问题; (3)、netty还可以支持流量整形; (4)、netty对…