关于如何使用官方系统开启npu的解决办法

上次在社区看见有小伙伴问,使用官方系统固件无法开启并正常使用NPU进行rknn_ssd_demo的测试,官方小伙伴更新了内核,但是还是在最后SUBMIT的时候失败。。。
昨天自己研究了一下,并成功在官方固件下开启NPU并正常运行了DEMO。
方法如下:
1.下载radxa的kernel按照教程编译内核
2.如果成功了说明你的环境没问题了
3.修改rock3a分支下的dts文件,[rk3568-rock-3-a.dts]
4.将里面的reserved_memory节点删除,注意是与npu相关的节点
5.将rknpu节点下的预设节点引用删除,只保留supply和status
6.重新编译内核,完成后会生成rk3568-rock-3-a.dtb
7.将编译好的文件使用root权限覆盖3A里/boot/dtbs/同名文件
8.重启设备----大功告成

原理:
应该是官方为NPU预设保留内存时内核报错,导致预设内存失败节点失效,从而使得NPU节点引用内存也失败,所以NPU无法使用,以上代码是参考firefly的3568设备树文件,发现firefly没有使用预设内存,但是可以成功,所以试试,结果真成功了!
希望这个文档能帮助到大家,谢谢,圣诞快乐!!!!!

更新:
具体原因已经找到,基于Linux rock3a 4.19.193-16-rockchip-g0cca7bdf9cdb内核,在rk3568-rock-3-a.dts文件的reserved-memory节点中,关于“shared-dma-pool”属性参数官方写入了错误的格式
原文如下:
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;

	rknpu_reserved: rknpu {
		compatible = "shared-dma-pool";
		reusable;
		size = <0x0 0x08000000>;
		alignment = <0x0 0x1000>;
	};
};

修改:应该将其中的
size属性参数改为<0x08000000>
alignment属性改为<0x1000>
然后启动时npu报内存资源分配失败,是因为npu的静态内存地址和npu_iommu分配地址冲突了,这个部分是在rk3568.dtsi文件中,我临时将npu_iommu的地址从fde4b000改为了fde5b000【查阅iomem表发现这个地址未被使用】,因为npu分配内存地址为fde40000正好与npu_iommu冲突,导致npu初始化时分配失败。。。。
修改后保存编译,一切正常了~ 这样可以不用删除预留内存节点。。。

正常启动的Console日志:

[ 3.008604] iommu: Adding device fde40000.npu to group 0
[ 3.011693] RKNPU fde40000.npu: Linked as a consumer to fde5b000.iommu
[ 3.015241] RKNPU fde40000.npu: RKNPU: rknpu iommu is enabled, using iommu mode
[ 3.018467] RKNPU fde40000.npu: Linked as a consumer to regulator.15
[ 3.022020] [drm] Initialized rknpu 0.4.2 20210701 for fde40000.npu on minor 1
[ 3.025205] RKNPU fde40000.npu: leakage=4
[ 3.028747] RKNPU fde40000.npu: avs=0
[ 3.032448] RKNPU fde40000.npu: l=0 h=2147483647 hyst=5000 l_limit=0 h_limit=0 h_table=0

最新修改的dtb文件
链接:https://pan.baidu.com/s/1B9jFAhdmAz5V54FiPkt8wA
提取码:GRMX

3 Likes

官方有这新版本 rock-3a-ubuntu-focal-server-arm64-20211223-0731-gpt.img.xz,也不知道修正没有。只需要覆盖rk3568-rock-3-a.dtb,还是内核也要覆盖?

覆盖dtb即可,我在11月的固件中直接覆盖即成功。

能在哪个网盘共享一下这个dtb文件吗,谢谢,圣诞快乐!

感谢,下载了,但是做测试运行./rknn_ssd_demo model/ssd_inception_v2.rknn model/road.bmp
会报以下错误
./rknn_ssd_demo: /lib/aarch64-linux-gnu/libm.so.6: version GLIBC_2.29’ not found (required by ./rknn_ssd_demo)`
请教如何解决

你的系统是什么版本?
我用的是官方固件:https://github.com/radxa/rock-3-images-released/releases
中的rock3a_ubuntu_focal_server_arm64_20211113_0103-gpt.img.gz
11月的版本~
你尝试更新一下GLIBC呢~

你好。我们修复了RNPU 运行时错误问题。
需要更新一下 kernel 版本到 4.19.193-25。用v1.1.0版本的NPU库。
请看文档 https://wiki.radxa.com/Rock3/dev/npu-run-test

只有24啊。。。 没有25啊~
linux-headers-4.19.193-24-rockchip-g526c758e05e0 linux-image-4.19.193-24-rockchip-g526c758e05e0
git上面拉取的kernel源码,dts有问题,修改后虽然npu可用了,但是每次在shutdown和reboot的时候会报rcu错误。。。。

[ 438.537222] watchdog: watchdog0: watchdog did not stop!
[ 500.997705] rcu: INFO: rcu_sched detected stalls on CPUs/tasks:
[ 500.998445] rcu: 3-…0: (4 ticks this GP) idle=d5a/1/0x4000000000000000 softirq=12712/12713 fqs=368
[ 500.999504] rcu: (detected by 1, t=18046 jiffies, g=13781, q=1)
[ 501.000211] Call trace:
[ 501.000522] __switch_to+0xc4/0x128
[ 501.000946] _raw_spin_unlock_irqrestore+0x24/0x34
[ 501.001503] of_find_property+0x5c/0x74
[ 501.001954] of_find_property_value_of_size+0x40/0xa0
[ 501.002538] of_property_read_u32_index+0x44/0x6c

用回16的dtb就不会出现这个问题。。。

报这个错误是因为在编译 rknn_ssd_demo model 是的工具链版本问题。
你用这个预编译好的试一下。https://dl.radxa.com/rock3/npu/rknn_ssd_demo_linux_20211228.tar.gz

如果你使用了 https://github.com/radxa/rknpu2/tree/main/examples/rknn_ssd_demo ,在 X86 PC 交叉编译工具链可以用这个:https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz

你再更新一下 Radxa APT 源,下载最新 kernel。最新的版本为 4.19.193-31。

sudo rm /var/lib/apt/lists/apt.radxa.com*
sudo apt update
sudo apt install -y linux-4.19-rock-3-latest

报这个错误。需要通过更新 u-boot / kernel 来解决。

涉及到的代码修改为:

你可以用最新的 ROCK 3A Ubuntu/Debian。https://github.com/radxa/debos-radxa/releases/tag/main-7a110bf1

1 Like

谢谢:grin:
一会儿测试一下

Hi, @Stephen 试了一下,最新版本下的npu还是没法用……

我是先刷的20220207的官方debian系统(内核版本4.19.193-31),之后用apt update和apt dist-upgrade升级内核到4.19.193-324.19.193-36-rockchip-gd05f98887579, (现在是) 4.19.193-42-rockchip-ge29be2b2ed27,并且下载 dl.radxa.com/rock3/images/loader/rock-3a/ 目录下的idbloader.imgu-boot.itb ( 两个的Last modified时间都是 2022-02-10 10:50 ),用dd刷入tf卡,之后重启,测试rknn_ssd_demo,这样试验出来,npu还是不能用。

不能用的输出如下:

$ ./rknn_ssd_demo model/ssd_inception_v2.rknn model/road.bmp
Loading model ...
rknn_init ...
model input num: 1, output num: 2
input tensors:
index=0 name=Preprocessor/sub:0 n_dims=4 dims=[1 300 300 3] n_elems=270000 size=270000 fmt=0 type=3 qnt_type=2 fl=0 zp=0 scale=0.007812
output tensors:
index=0 name=concat:0 n_dims=4 dims=[1 1917 1 4] n_elems=7668 size=30672 fmt=0 type=0 qnt_type=2 fl=0 zp=53 scale=0.089455
index=1 name=concat_1:0 n_dims=4 dims=[1 1917 91 1] n_elems=174447 size=697788 fmt=0 type=0 qnt_type=2 fl=0 zp=53 scale=0.143593
rknn_run
E RKNN: [00:26:17.861] failed to submit!, op id: 1, op name: Conv:FeatureExtractor/InceptionV2/InceptionV2/Conv2d_1a_7x7/separable_conv2d/depthwise, flags: 0x5, task start: 0, task number: 15, run task counter: 0, int status: 0
rknn_run fail! ret=-1

下载发帖时候最新的radxa官方提供的debian系统,用etcher刷入tf卡,启动,按照页面 https://wiki.radxa.com/Rock3/dev/npu-run-test 测试给的步骤一步不落的测试,输出跟上面一样。


用这个帖子的lz百度网盘分享的dtb文件替换了之后,重启,再测试就成功了。

这个问题在8G内存的板子上持续了半年多,最近才最终解决的:

引用的帖子的主楼是: