RK3588安装TVM-GPU版本

1.前言

RK3588还有相应的GPU可以使用,我们也可以配置相关的环境,进行GPU的使用

2. RK3588的GPU介绍

Mali-G610 是 Arm 公司开发的第三代 Valhall 架构的 GPU。它于 2022 年 7 月发布,面向中端和高端移动设备。

Mali-G610 采用 Armv9 架构,具有 10 个核心,每个核心都有 128 个 FP32 ALU。它还支持 FP16、INT8 和 INT4 计算,以及硬件加速的 AI 功能。

Mali-G610 的性能比前代 Mali-G57 提高了 20%。它能够在 1080p 分辨率下以 60fps 的帧率运行复杂的游戏和应用程序。

Mali-G610 的具体参数如下:

  • 核心数:10 个
  • 每个核心的 FP32 ALU 数量:128
  • 架构:Armv9
  • 支持的计算类型:FP32、FP16、INT8、INT4
  • 支持的 AI 功能:硬件加速

Mali-G610 已被多家移动设备制造商采用,包括 OPPO、vivo、Realme、Redmi 等。它将在未来几年内成为中端和高端移动设备的常用 GPU。

以下是 Mali-G610 的一些优势:

  • 性能强大:比前代 Mali-G57 提高了 20%
  • 支持最新的计算类型:FP16、INT8、INT4
  • 支持硬件加速的 AI 功能

Mali-G610 将为中端和高端移动设备带来更出色的图形性能和 AI 功能。

3.安装

参考之前的文章RK3588安装TVM-CPU版本,从step1~step3都是一样的,接下来配置不一样的内容

1.安装opencl

sudo apt install ocl-icd-* opencl-headers

sudo apt install clinfo

查看信息

clinfo

2.安装Mali-G610的驱动

资源下载链接RK3588-Mali-G610驱动

拷贝到RK3588中后安装deb文件

sudo dpkg -i ***.deb

3.配置opencl

修改文件build/config.cmake

set(USE_OPENCL /usr/lib/aarch64-linux-gnu/libmali.so)

4.cmake设置

cd build

cmake -DOpenCL_LIBRARY=/usr/lib/aarch64-linux-gnu/libmali.so -DOpenCL_INCLUDE_DIR=/usr/include/ .. -G Ninja

ninja

5:安装Python版本的tvm

如果相关的库没有安装,根据提示进行安装即可,我将我的贴出来

sudo vim ~/.bashrc
export TVM_HOME=/path/to/tvm # 编译的python/tvm路径

export TVM_HOME=/home/ubuntu/apache-tvm-src-v0.14.0/python/tvm

export PYTHONPATH=TVM_HOME/python3.7:{PYTHONPATH}

export PYTHONPATH=TVM_HOME/python:{PYTHONPATH}
source ~/.bashrc
cd /home/ubuntu/apache-tvm-src-v0.10.0/python

python3.7 setup.py install --user # 我的是3.7,根据自己的修改

4.验证

代码参考https://zhuanlan.zhihu.com/p/584849555

复制代码
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 tvm.contrib.graph_executor as runtime
from tvm.contrib.download import download_testdata
import timeit

#ONNX model path
model_path = "/home/firefly/myscripts/my_model.onnx"
onnx_model = onnx.load(model_path)
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")

# 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}

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

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

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

dtype = "float32"
module.set_input(input_name, img_data)

ftimer = module.module.time_evaluator("run", dev, number=1, repeat=30)
prof_res = np.array(ftimer().results) * 1000  # 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()


# Download a list of labels
labels_url = "https://s3.amazonaws.com/onnx-model-zoo/synset.txt"
labels_path = download_testdata(labels_url, "synset.txt", module="data")

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]))

这里的onnx模型就是安装cpu版本时候的测试的onnx模型

相关推荐
徽京人10 分钟前
VS Code 接入Esp 32步骤
vscode·单片机·嵌入式硬件
230万光年的思念32 分钟前
分子动力学模拟参考文献
python
HongXu_CaiYi1 小时前
0103-python相关-函数、文件
python
QH139292318801 小时前
Keysight N5183B N5183B 微波模拟信号发生器
网络·单片机·嵌入式硬件·集成测试·信息与通信
笨笨饿2 小时前
#110_SCH3000 平台图传系统配置指南:从 DVP 摄像头到 UVC/WiFi 双通道传输
c语言·stm32·单片机·嵌入式硬件·物联网·vim
vortex52 小时前
从Conda到UV:Python项目依赖管理的现代演进
python·conda·uv
何以解忧,唯有..2 小时前
Python time 模块详解:时间处理与日期操作指南
开发语言·python
梅雅达编程笔记3 小时前
Day 18 · 综合实战 B:AI 客服 Agent(专栏收官)
python·智能客服·ai agent·意图识别·ai客服·大模型应用·ai办公自动化
测试老哥3 小时前
Pytest自动化测试框架tep环境变量、fixtures、用例三者之间的关系
自动化测试·软件测试·python·测试工具·测试用例·pytest·职场发展
Buke..3 小时前
【APP 逆向】哔哩哔哩 sign 参数逆向(下):OLLVM 混淆还原 sign 算法
java·javascript·爬虫·python·算法