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
2.安装Mali-G610的驱动
资源下载链接RK3588-Mali-G610驱动
拷贝到RK3588中后安装deb文件
3.配置opencl
4.cmake设置
5:安装Python版本的tvm
如果相关的库没有安装,根据提示进行安装即可,我将我的贴出来
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模型