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模型

相关推荐
YOLO数据集集合14 分钟前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
for_ever_love__43 分钟前
机器学习入门——手写线性回归与梯度下降
人工智能·python·学习·机器学习·线性回归
打工仔折腾 AI1 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
I Am a robert girl1 小时前
当传感器学会“说谎“:拆解可靠性门控的稀疏惯性动捕融合
python·姿态估计·传感器融合·惯性动捕·imu传感器·可靠性门控·可穿戴计算
李航19831 小时前
AI定制柜建模,需要详细的建模规范和标准流程
人工智能·python·计算机视觉·ai·ai编程
hahaha60161 小时前
色彩恒常性概述
人工智能·嵌入式硬件·数码相机·计算机视觉
我叫洋洋2 小时前
Cadence CIS 元器件库合并实战:3000+ 焊盘、156 个符号零冲突并入自有库
数据库·单片机·嵌入式硬件·oracle·电路
沙漠之主2 小时前
Python 教学设计资料:从入门到实战的完整课程方案
爬虫·python
YOLO数据集集合2 小时前
光伏组件异常检测数据集 | 光伏组件 异常检测 红外检测 热斑识别 光伏巡检9147期
人工智能·yolo·目标检测·语言模型·太阳能板·光伏组件
hahaha60163 小时前
Shades-of-Gray (SoG) 算法--白平衡算法
人工智能·嵌入式硬件·算法·计算机视觉