RK3588-TVM-GPU推理模型

2023-12-22 22:20
文章标签 gpu rk3588 推理模型 tvm

本文主要是介绍RK3588-TVM-GPU推理模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.前言

        之前的博客已经在RK3588上安装了tvm的mali-gpu的版本,我们整理一下思路,本文将从模型的转换和调用两个方面进行讲解,tvm使用的是0.10版本,模型和代码也都是tvm官方的案例。

2.onnx模型转换

        将ONNX格式的ResNet50-v2模型转换为TVM Runtime支持的形式,并将其编译为一个共享库文件。以下是对代码的解释:

1. 导入库和模块

import onnx
import tvm
import tvm.relay as relay

2. 指定ONNX模型路径和加载模型

model_path = "resnet50-v2-7.onnx"

onnx_model = onnx.load(model_path)

        指定了ONNX模型的路径,并使用onnx.load加载模型。

3. 设置TVM的目标和目标主机

target = tvm.target.mali(model='rk3588')

target_host = tvm.target.arm_cpu(model='rk3588')

        设置TVM的目标设备和目标主机:
        (1)目标设备为Mali GPU(mali(model='rk3588'))
        (2)目标主机为ARM CPU(arm_cpu(model='rk3588'))

4. 获取输入名称和形状

input_name = "data"

input_shape = (1, 3, 224, 224)

shape_dict = {input_name: input_shape}

        定义了输入张量的名称(input_name)和形状(input_shape

        使用netron查看onnx模型的输入名和shape。

5. TVM Relay从ONNX创建模块和参数

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

        使用relay.frontend.from_onnx函数将ONNX模型转换为TVM Relay模块和参数。

6. 构建TVM Relay模块

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

        使用TVM Relay的relay.build函数将模块编译为图(graph)、库文件(lib),并使用指定的目标设备和目标主机。

7. 导出编译后的共享库文件

libpath = "./resnet.so"

lib.export_library(libpath)

        将编译后的库文件保存为resnet.so

8. 导出神经网络结构到JSON文件

graph_json_path = "./resnet.json"

with open(graph_json_path, 'w') as fo:

    fo.write(graph)

        将神经网络结构保存为JSON文件(resnet.json)。

9. 导出神经网络模型的权重参数到二进制文件

param_path = "./resnet.params"

with open(param_path, 'wb') as fo:

    fo.write(relay.save_param_dict(params))

        将神经网络模型的权重参数保存为二进制文件(resnet.params)。

10.完整代码

import onnx
import tvm
import tvm.relay as relay#ONNX model path
model_path = "resnet50-v2-7.onnx"
onnx_model = onnx.load(model_path)target = tvm.target.mali(model='rk3588')
target_host = tvm.target.arm_cpu(model='rk3588')
# 使用netron查看onnx模型的输入名和shape
input_name = "data"
input_shape = (1, 3, 224, 224)
shape_dict = {input_name: input_shape}
mod, params = relay.frontend.from_onnx(onnx_model, shape_dict)with tvm.transform.PassContext(opt_level=3):graph, lib, params = relay.build(mod,target=tvm.target.Target(target, host=target_host),params=params)libpath = "./resnet.so"
lib.export_library(libpath)# 下面的函数导出我们神经网络的结构,使用json文件保存
graph_json_path = "./resnet.json"
with open(graph_json_path, 'w') as fo:fo.write(graph)# 下面的函数中我们导出神经网络模型的权重参数
param_path = "./resnet.params"
with open(param_path, 'wb') as fo:fo.write(relay.save_param_dict(params))

3. 模型推理

1.导入所需的库和模块

import onnx

import numpy as np

from scipy.special import softmax

from PIL import Image

import tvm

import tvm.relay as relay

from tvm.contrib import graph_executor

import timeit

        导入了ONNX、NumPy、SciPy、PIL、TVM等相关库和模块。

2.准备输入图像

img_path = "kitten.jpg"

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

img_data = np.asarray(resized_image).astype("float32")

        从文件加载图像,并将其调整为224x224像素大小。

3. 图像预处理

img_data = np.transpose(img_data, (2, 0, 1))

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 img_data = np.expand_dims(norm_img_data, axis=0)

        调整图像的格式和进行归一化,以符合ResNet50模型的输入要求。

4. 设置TVM的目标和目标主机

target = tvm.target.mali(model='rk3588')

target_host = tvm.target.arm_cpu(model='rk3588')

        这里设置了TVM的目标设备和目标主机,与上一个代码片段中相同。

5. 加载模型结构、权重和参数

libpath = "./resnet.so"

graph_json_path = "./resnet.json"

param_path = "./resnet.params"

loaded_json = open(graph_json_path).read()

loaded_lib = tvm.runtime.load_module(libpath)

loaded_params = bytearray(open(param_path, "rb").read())

        从之前保存的文件中加载神经网络的结构(graph_json_path)、库文件(libpath)、权重参数(param_path)。

6.创建TVM图执行器

dev = tvm.device(str(target), 0)

ctx = dev

module = graph_executor.create(loaded_json, loaded_lib, ctx) module.load_params(loaded_params) module.set_input(input_name, img_data)

        创建一个TVM图执行器,加载模型结构和权重,并设置输入数据。

7. 运行模型

ftimer = module.module.time_evaluator("run", dev, number=1, repeat=30)

prof_res = np.array(ftimer().results) * 1

        使用TVM的时间评估器运行模型,并记录执行时间。

8. 输出模型推理结果

module.run()
output_shape = (1, 1000)
tvm_output = module.get_output(0, tvm.nd.empty(output_shape)).numpy()

        获取模型输出。

9. 加载标签文件

labels_path = "synset.txt"

with open(labels_path, "r") as f:

    labels = [l.rstrip() for l in f]

        从文件加载标签。

10. 后处理和输出预测结果

scores = softmax(tvm_output)

scores = np.squeeze(scores)

ranks = np.argsort(scores)[::-1]

for rank in ranks[0:5]:

    print("class='%s' with probability=%f" % (labels[rank], scores[rank]))

        使用Softmax进行后处理,并输出前五个类别的预测结果及其概率。

11.完整代码

import onnx
import numpy as np
from scipy.special import softmax
from PIL import Image
import tvm
import tvm.relay as relay
from tvm.contrib import graph_executor
import timeitimg_path  = "kitten.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)target = tvm.target.mali(model='rk3588')
target_host = tvm.target.arm_cpu(model='rk3588')input_name = "data"
shape_dict = {input_name: img_data.shape}libpath = "./resnet.so"
# 下面的函数导出我们神经网络的结构,使用json文件保存
graph_json_path = "./resnet.json"
# 下面的函数中我们导出神经网络模型的权重参数
param_path = "./resnet.params"loaded_json = open(graph_json_path).read()
loaded_lib = tvm.runtime.load_module(libpath)
loaded_params = bytearray(open(param_path, "rb").read())dev = tvm.device(str(target), 0)
ctx = dev
module = graph_executor.create(loaded_json, loaded_lib, ctx)
module.load_params(loaded_params)
module.set_input(input_name, img_data)ftimer = module.module.time_evaluator("run", dev, number=1, repeat=30)
prof_res = np.array(ftimer().results) * 1  # multiply 1000 for converting to millisecond
print("%-20s %-19s (%s)" % ("resnet50", "%.2f ms" % np.mean(prof_res), "%.2f ms" % np.std(prof_res))
)
module.run()
output_shape = (1, 1000)
tvm_output = module.get_output(0, tvm.nd.empty(output_shape)).numpy()labels_path = "synset.txt"with open(labels_path, "r") as f:labels = [l.rstrip() for l in f]# Open the output and read the output tensor
scores = softmax(tvm_output)
scores = np.squeeze(scores)
ranks = np.argsort(scores)[::-1]
for rank in ranks[0:5]:print("class='%s' with probability=%f" % (labels[rank], scores[rank]))

12.推理结果

4.完整的代码和模型下载

完整代码icon-default.png?t=N7T8https://download.csdn.net/download/weixin_43999691/88652823?spm=1001.2014.3001.5503

这篇关于RK3588-TVM-GPU推理模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/525670

相关文章

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

如何用GPU算力卡P100玩黑神话悟空?

精力有限,只记录关键信息,希望未来能够有助于其他人。 文章目录 综述背景评估游戏性能需求显卡需求CPU和内存系统需求主机需求显式需求 实操硬件安装安装操作系统Win11安装驱动修改注册表选择程序使用什么GPU 安装黑神话悟空其他 综述 用P100 + PCIe Gen3.0 + Dell720服务器(32C64G),运行黑神话悟空画质中等流畅运行。 背景 假设有一张P100-

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

PyInstaller问题解决 onnxruntime-gpu 使用GPU和CUDA加速模型推理

前言 在模型推理时,需要使用GPU加速,相关的CUDA和CUDNN安装好后,通过onnxruntime-gpu实现。 直接运行python程序是正常使用GPU的,如果使用PyInstaller将.py文件打包为.exe,发现只能使用CPU推理了。 本文分析这个问题和提供解决方案,供大家参考。 问题分析——找不到ONNX Runtime GPU 动态库 首先直接运行python程序

麒麟系统安装GPU驱动

1.nvidia 1.1显卡驱动 本机显卡型号:nvidia rtx 3090 1.1.1下载驱动 打开 https://www.nvidia.cn/geforce/drivers/ 也可以直接使用下面这个地址下载 https://www.nvidia.com/download/driverResults.aspx/205464/en-us/ 1.1.3安装驱动 右击,

Kubernetes的alpha.kubernetes.io/nvidia-gpu无法限制GPU个数

问题描述: Pod.yaml文件中关于GPU资源的设置如下: 然而在docker中运行GPU程序时,发现宿主机上的两块GPU都在跑。甚至在yaml文件中删除关于GPU的请求,在docker中都可以运行GPU。 原因: 上例说明alpha.kubernetes.io/nvidia-gpu无效。查看yaml文件,发现该docker开启了特权模式(privileged:ture): 而

GPU池化赋能智能制造

2023年3月10日,“第六届智能工厂高峰论坛”在杭州隆重揭幕。本次会议由e-works数字化企业网、浙江制信科技有限公司主办,中国人工智能学会智能制造专业委员会、长三角新能源汽车产业链联盟、长三角(杭州)制造业数字化能力中心、浙江省智能工厂操作系统技术创新中心协办。趋动科技作为钻石合作伙伴出席了本次峰会,与制造业精英企业以及行业专业人士共同分享制造业在智能工厂推进过程中的成功经验,探讨工厂改进中

【linux 常用命令】查看gpu、显卡常用命令

1.查看显卡基本信息 lspci | grep -i nvidia 2.查看显卡驱动版本 nvidia-smi -a 3.查看gpu使用情况 nvidia-smi (spam) [dongli@dt-gpu-1 train]$ nvidia-smi Fri Sep 27 16:42:33 2019 +----------------------------------------

图形API学习工程(12):讨论当前工程里同步CPU与GPU的方式

工程GIT地址:https://gitee.com/yaksue/yaksue-graphics 简单讨论CPU和GPU间的交互 《DX12龙书》在【4.2 CPU与GPU间的交互】章节中讨论了这个问题,简单来说: 为了最佳性能,CPU和GPU这两种处理器应该尽量同时工作,少“同步”。因为“同步”意味着一种处理器以空闲状态等待另一种处理器,即它破坏了“并行”。 但有时,又不得不进行二者的同步

pytorch gpu国内镜像下载,目前最快下载

前言         pytorch的cpu的包可以在国内镜像上下载,但是gpu版的包只能通过国外镜像下载,网上查了很多教程,基本都是手动从先将gpu版whl包下载下来,然后再手动安装,如何最快的通过pip的命令安装呢?下面我细细讲下。 解决办法        目前国内有pytorch的gpu版的whl包只有阿里云上的:https://mirrors.aliyun.com/pytorch-w