RK3588安装TVM-GPU版本

发布时间:2023年12月22日

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

文章来源:https://blog.csdn.net/weixin_43999691/article/details/135081157
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。