diff --git a/README.en.md b/README.en.md index 7658987..d19d9db 100644 --- a/README.en.md +++ b/README.en.md @@ -67,6 +67,8 @@ You can get introduction of openEuler SBC SIG from [sig-SBC](https://gitee.com/o - [Packaging ITX-RK3588J Integrated Burn Write Image](documents/rockchip/打包ITX-RK3588J一体化烧写镜像.md) - [Set up SELinux](documents/rockchip/设置SELinux.md) - [Build an image using Docker](documents/rockchip/使用Docker构建镜像.md) + - [openEuler Adaptation Guide](documents/rockchip/openEuler适配指南.md) + - [Using RKNPU on openEuler](documents/rockchip/在openEuler上使用RKNPU.md) - [scripts](./scripts/): - [Raspberry Pi](./scripts/raspberrypi): Script for building openEuler image for Raspberry Pi - [Quickly Build (without kernel compilation)](scripts/raspberrypi/build-image.sh) diff --git a/README.md b/README.md index afda1bb..a5c649e 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,8 @@ SIG 组基本信息位于 [sig-SBC](https://gitee.com/openeuler/community/tree/m - [打包 ITX-RK3588J 一体化烧写镜像](documents/rockchip/打包ITX-RK3588J一体化烧写镜像.md) - [设置 SELinux](documents/rockchip/设置SELinux.md) - [使用 Docker 构建镜像](documents/rockchip/使用Docker构建镜像.md) + - [openEuler 适配指南](documents/rockchip/openEuler适配指南.md) + - [在openEuler上使用RKNPU](documents/rockchip/在openEuler上使用RKNPU.md) - [scripts](./scripts/): 镜像构建脚本 - [树莓派](./scripts/raspberrypi): 构建 openEuler 树莓派镜像的脚本 - [快速构建(不编译内核)](scripts/raspberrypi/build-image.sh) diff --git a/documents/rockchip/在openEuler上使用RKNPU.md b/documents/rockchip/在openEuler上使用RKNPU.md new file mode 100644 index 0000000..072c42c --- /dev/null +++ b/documents/rockchip/在openEuler上使用RKNPU.md @@ -0,0 +1,465 @@ +- [描述](#描述) +- [在 openEuler 上安装 RKNPU 并运行推理](#在-openeuler-上安装-rknpu-并运行推理) + - [安装 RKNPU 运行环境](#安装-rknpu-运行环境) + - [测试 RKNPU](#测试-rknpu) + - [安装 rknn-toolkit-lite2 Python 环境](#安装-rknn-toolkit-lite2-python-环境) + - [运行 ResNet18 模型推理](#运行-resnet18-模型推理) + - [测试 Dynamic Shape](#测试-dynamic-shape) + +# 描述 + +本文档介绍如何在 openEuler 的 Rockchip 设备上使用 RKNPU。 + +参考的官方文档: + +https://github.com/airockchip/rknn-toolkit2/blob/master/doc/02_Rockchip_RKNPU_User_Guide_RKNN_SDK_V2.3.2_CN.pdf + +内核需求:需要支持 RKNPU 的内核 + +测试设备:Armsom Sige5 (RK3576) + +openEuler 版本:openEuler 22.03 LTS SP3 + +镜像构建命令如下: + +``` +sudo bash build.sh --board armsom-sige5 \ + -n openEuler-22.03-LTS-SP3-Armsom-Sige5-aarch64-alpha1 \ + -k https://github.com/armbian/linux-rockchip.git \ + -b rk-6.1-rkr5.1 \ + -c rockchip_linux_defconfig \ + -r https://gitee.com/src-openeuler/openEuler-repos/raw/openEuler-22.03-LTS-SP3/generic.repo \ + -s headless +``` + +将上面构建成功的 openEuler 镜像刷写到 Armsom Sige5 (RK3576) 开发板,之后就可以按照下面的文档安装 RKNPU 并运行推理。 + +# 在 openEuler 上安装 RKNPU 并运行推理 + +## 安装 RKNPU 运行环境 + +安装所需要的软件包 + +``` +dnf update && dnf install git python3-pip screen gcc g++ make cmake -y +``` + +下载 RKNPU 代码及软件包仓库 + +``` +cd ~ +git clone --depth=1 https://github.com/airockchip/rknn-toolkit2.git +``` + +安装 RKNPU 运行环境到系统 + +``` +cd rknn-toolkit2 + +cp rknpu2/runtime/Linux/librknn_api/aarch64/librknnrt.so /usr/lib64 +cp rknpu2/runtime/Linux/librknn_api/aarch64/librknnrt.so /usr/lib + +cp rknpu2/runtime/Linux/rknn_server/aarch64/usr/bin/* /usr/bin +``` + +添加文件权限 + +``` +chmod +x /usr/bin/start_rknn.sh +chmod +x /usr/bin/restart_rknn.sh +chmod +x /usr/bin/rknn_server +``` + +使用 `screen` 来保持 `rknn_server` 后台运行,这里也可以使用其他软件来实现,例如 `nohup`。 + +``` +screen -S rknn_server +``` + +然后输入以下命令来启动 `rknn_server`: + +``` +start_rknn.sh +``` + +运行结果如下: + +``` +bash-5.1# start_rknn.sh +start rknn server, version:2.3.2 (1842325 build@2025-03-30T09:54:34) +I NPUTransfer(995): Starting NPU Transfer Server, Transfer version 2.2.2 (@2024-06-18T03:50:51) +``` + +如果使用 `screen` 命令使 `rknn_server` 保持后台运行的话,此时使用 `Ctrl A + Z` 来退出当前终端(按住 `Ctrl` 的同时,先按 `A` 再按 `Z`),让 `rknn_server` 保持后台运行。如需恢复 `rknn_server` 终端,使用 `screen -r rknn_server`。 + +## 测试 RKNPU + +### 运行 rknn_benchmark 基准测试 + +进入 `rknn_benchmark` 目录 + +``` +cd ~/rknn-toolkit2/rknpu2/examples/rknn_benchmark +``` + +编译并运行 `rknn_benchmark` + +``` +export GCC_COMPILER=/usr/bin/aarch64-linux-gnu + +bash build-linux.sh -t rk3576 -a aarch64 -b Release +``` + +这里使用的设备是 `rk3576`,如果使用 `rk3588` 平台,将这里的 `rk3576` 改为 `rk3588` 即可。 + +编译过程如下: + +``` +[root@openEuler rknn_benchmark]# bash build-linux.sh -t rk3576 -a aarch64 -b Release +build-linux.sh -t rk3576 -a aarch64 -b Release +/usr/bin/aarch64-linux-gnu +=================================== +TARGET_SOC=RK3576 +TARGET_ARCH=aarch64 +BUILD_TYPE=Release +BUILD_DIR=/root/rknn-toolkit2/rknpu2/examples/rknn_benchmark/build/build_RK3576_linux_aarch64_Release +CC=/usr/bin/aarch64-linux-gnu-gcc +CXX=/usr/bin/aarch64-linux-gnu-g++ +=================================== +-- The CXX compiler identification is GNU 10.3.1 +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Configuring done +-- Generating done +-- Build files have been written to: /root/rknn-toolkit2/rknpu2/examples/rknn_benchmark/build/build_RK3576_linux_aarch64_Release +[ 33%] Building CXX object CMakeFiles/rknn_benchmark.dir/src/cnpy/cnpy.cpp.o +[ 66%] Building CXX object CMakeFiles/rknn_benchmark.dir/src/rknn_benchmark.cpp.o +[100%] Linking CXX executable rknn_benchmark +[100%] Built target rknn_benchmark +Consolidate compiler generated dependencies of target rknn_benchmark +[100%] Built target rknn_benchmark +Install the project... +-- Install configuration: "Release" +-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_benchmark/install/rknn_benchmark_Linux/./rknn_benchmark +-- Set runtime path of "/root/rknn-toolkit2/rknpu2/examples/rknn_benchmark/install/rknn_benchmark_Linux/./rknn_benchmark" to "lib" +-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_benchmark/install/rknn_benchmark_Linux/lib/librknnrt.so +``` + +进入编译完成的目录: + +``` +cd ~/rknn-toolkit2/rknpu2/examples/rknn_benchmark/install/rknn_benchmark_Linux/ +``` + +使用 `MobileNet v1` 运行基准测试 + +``` +./rknn_benchmark ../../../rknn_mobilenet_demo/model/RK3576/mobilenet_v1.rknn +``` + +测试结果如下: + +``` +[root@openEuler rknn_benchmark_Linux]# ./rknn_benchmark ../../../rknn_mobilenet_demo/model/RK3576/mobilenet_v1.rknn +rknn_api/rknnrt version: 2.3.2 (429f97ae6b@2025-04-09T09:09:27), driver version: 0.9.8 +total weight size: 4465024, total internal size: 2157568 +total dma used size: 11530240 +model input num: 1, output num: 1 +input tensors: + index=0, name=input, n_dims=4, dims=[1, 224, 224, 3], n_elems=150528, size=150528, w_stride = 224, size_with_stride=150528, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=0, scale=0.007812 +output tensors: + index=0, name=MobilenetV1/Predictions/Reshape_1, n_dims=2, dims=[1, 1001], n_elems=1001, size=2002, w_stride = 0, size_with_stride=2002, fmt=UNDEFINED, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000 +custom string: +Warmup ... + 0: Elapse Time = 4.98ms, FPS = 200.72 + 1: Elapse Time = 4.61ms, FPS = 216.92 + 2: Elapse Time = 4.44ms, FPS = 225.17 + 3: Elapse Time = 4.39ms, FPS = 228.05 + 4: Elapse Time = 4.39ms, FPS = 227.74 +Begin perf ... + 0: Elapse Time = 4.36ms, FPS = 229.62 + 1: Elapse Time = 4.29ms, FPS = 232.88 + 2: Elapse Time = 4.34ms, FPS = 230.68 + 3: Elapse Time = 4.47ms, FPS = 223.71 + 4: Elapse Time = 4.53ms, FPS = 220.95 + 5: Elapse Time = 4.51ms, FPS = 221.68 + 6: Elapse Time = 4.51ms, FPS = 221.48 + 7: Elapse Time = 4.64ms, FPS = 215.75 + 8: Elapse Time = 4.91ms, FPS = 203.79 + 9: Elapse Time = 2.60ms, FPS = 384.91 + +Avg Time 4.31ms, Avg FPS = 231.771 + +Save output to rt_output0.npy +---- Top5 ---- +0.049622 - 620 +0.044678 - 645 +0.032288 - 627 +0.021011 - 819 +0.016953 - 790 +``` + +可以看到,在使用 `MobileNet v1` 模型进行基准测试时,推理平均时延为 4.31ms,推理平均 FPS 为 231.771。 + +### 测试 MobileNet 模型推理 + +进入 `MobileNet Demo` 目录: + +``` +cd rknn_mobilenet_demo +``` + +编译 `MobileNet Demo` 推理程序: + +``` +bash build-linux.sh -t rk3576 -a aarch64 -b Release +``` + +编译过程如下: + +``` +[root@openEuler rknn_mobilenet_demo]# bash build-linux.sh -t rk3576 -a aarch64 -b Release +build-linux.sh -t rk3576 -a aarch64 -b Release +/usr/bin/aarch64-linux-gnu +=================================== +TARGET_SOC=RK3576 +TARGET_ARCH=aarch64 +BUILD_TYPE=Release +BUILD_DIR=/root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/build/build_RK3576_linux_aarch64_Release +CC=/usr/bin/aarch64-linux-gnu-gcc +CXX=/usr/bin/aarch64-linux-gnu-g++ +=================================== +-- The C compiler identification is GNU 10.3.1 +-- The CXX compiler identification is GNU 10.3.1 +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /usr/bin/aarch64-linux-gnu-gcc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Found OpenCV: /root/rknn-toolkit2/rknpu2/examples/3rdparty/opencv/opencv-linux-aarch64 (found version "3.4.5") +-- target_soc = RK3576 +-- Configuring done +-- Generating done +-- Build files have been written to: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/build/build_RK3576_linux_aarch64_Release +[ 50%] Building CXX object CMakeFiles/rknn_mobilenet_demo.dir/src/main.cc.o +[100%] Linking CXX executable rknn_mobilenet_demo +[100%] Built target rknn_mobilenet_demo +Consolidate compiler generated dependencies of target rknn_mobilenet_demo +[100%] Built target rknn_mobilenet_demo +Install the project... +-- Install configuration: "Release" +-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/./rknn_mobilenet_demo +-- Set runtime path of "/root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/./rknn_mobilenet_demo" to "lib" +-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/./model/RK3576 +-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/./model/RK3576/mobilenet_v1.rknn +-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/./model/cat_224x224.jpg +-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/./model/dog_224x224.jpg +-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/lib/librknnrt.so +``` + +进入编译输出文件目录: + +``` +cd install/rknn_mobilenet_demo_Linux +``` + +使用 `MobileNet` 模型运行推理,测试输入 `cat_224x224.jpg` 图片: + +``` +./rknn_mobilenet_demo ../../model/RK3576/mobilenet_v1.rknn ../../model/cat_224x224.jpg +``` + +推理结果如下: + +``` +[root@openEuler rknn_mobilenet_demo_Linux]# ./rknn_mobilenet_demo ../../model/RK3576/mobilenet_v1.rknn ../../model/cat_224x224.jpg +model input num: 1, output num: 1 +input tensors: + index=0, name=input, n_dims=4, dims=[1, 224, 224, 3], n_elems=150528, size=150528, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=0, scale=0.007812 +output tensors: + index=0, name=MobilenetV1/Predictions/Reshape_1, n_dims=2, dims=[1, 1001, 0, 0], n_elems=1001, size=2002, fmt=UNDEFINED, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000 +rknn_run + --- Top5 --- +283: 0.415283 +282: 0.175781 +286: 0.158813 +278: 0.060303 +279: 0.043427 +``` + +使用 `MobileNet` 模型运行推理,测试输入 `dog_224x224.jpg` 图片: + +``` +./rknn_mobilenet_demo ../../model/RK3576/mobilenet_v1.rknn ../../model/dog_224x224.jpg +``` + +推理结果如下: + +``` +[root@openEuler rknn_mobilenet_demo_Linux]# ./rknn_mobilenet_demo ../../model/RK3576/mobilenet_v1.rknn ../../model/dog_224x224.jpg +model input num: 1, output num: 1 +input tensors: + index=0, name=input, n_dims=4, dims=[1, 224, 224, 3], n_elems=150528, size=150528, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=0, scale=0.007812 +output tensors: + index=0, name=MobilenetV1/Predictions/Reshape_1, n_dims=2, dims=[1, 1001, 0, 0], n_elems=1001, size=2002, fmt=UNDEFINED, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000 +rknn_run + --- Top5 --- +156: 0.935059 +155: 0.057037 +205: 0.003881 +284: 0.003119 +285: 0.000172 +``` + +## 安装 rknn-toolkit-lite2 Python 环境 + +进入 rknn-toolkit-lite2 Python 软件包目录: + +``` +cd ~/rknn-toolkit2/rknn-toolkit-lite2/packages +``` + +查看 `Python` 版本: + +``` +[root@openEuler packages]# python3 -V +Python 3.9.9 +``` + +根据相应的版本应该安装仓库提供的对应 `cp39` 的 `rknn_toolkit_lite2` Python 软件包 `rknn_toolkit_lite2-2.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl`,运行以下命令: + +``` +pip3 install rknn_toolkit_lite2-2.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl +``` + +安装过程如下: + +``` +[root@openEuler packages]# pip3 install rknn_toolkit_lite2-2.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl +WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead. +Processing ./rknn_toolkit_lite2-2.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl +Collecting ruamel.yaml + Downloading ruamel.yaml-0.18.14-py3-none-any.whl (118 kB) + |████████████████████████████████| 118 kB 644 kB/s +Collecting numpy + Downloading numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (13.9 MB) + |████████████████████████████████| 13.9 MB 61 kB/s +Collecting psutil + Downloading psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (279 kB) + |████████████████████████████████| 279 kB 31.8 MB/s +Collecting ruamel.yaml.clib>=0.2.7 + Downloading ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux2014_aarch64.whl (636 kB) + |████████████████████████████████| 636 kB 23.4 MB/s +Installing collected packages: ruamel.yaml.clib, ruamel.yaml, psutil, numpy, rknn-toolkit-lite2 +Successfully installed numpy-2.0.2 psutil-7.0.0 rknn-toolkit-lite2-2.3.2 ruamel.yaml-0.18.14 ruamel.yaml.clib-0.2.12 +WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv +``` + +还需要安装 `opencv-python` Python 软件包: + +``` +[root@openEuler packages]# pip3 install opencv-python +WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead. +Collecting opencv-python + Downloading opencv_python-4.12.0.88-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (45.9 MB) + |████████████████████████████████| 45.9 MB 6.0 kB/s +Requirement already satisfied: numpy<2.3.0,>=2 in /usr/local/lib64/python3.9/site-packages (from opencv-python) (2.0.2) +Installing collected packages: opencv-python +Successfully installed opencv-python-4.12.0.88 +WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv +``` + +## 运行 ResNet18 模型推理 + +进入 ResNet18 Demo 目录: + +``` +cd ~/rknn-toolkit2/rknn-toolkit-lite2/examples/resnet18 +``` + +运行推理: + +``` +[root@openEuler resnet18]# python3 test.py +W rknn-toolkit-lite2 version: 2.3.2 +--> Load RKNN model +done +--> Init runtime environment +I RKNN: [16:56:45.369] RKNN Runtime Information, librknnrt version: 2.3.2 (429f97ae6b@2025-04-09T09:09:27) +I RKNN: [16:56:45.369] RKNN Driver Information, version: 0.9.8 +I RKNN: [16:56:45.369] RKNN Model Information, version: 6, toolkit version: 2.3.2(compiler version: 2.3.2 (839b70f037@2025-04-03T10:34:04)), target: RKNPU f2, target platform: rk3576, framework name: PyTorch, framework layout: NCHW, model inference type: static_shape +W RKNN: [16:56:45.400] query RKNN_QUERY_INPUT_DYNAMIC_RANGE error, rknn model is static shape type, please export rknn with dynamic_shapes +W Query dynamic range failed. Ret code: RKNN_ERR_MODEL_INVALID. (If it is a static shape RKNN model, please ignore the above warning message.) +done +--> Running model +resnet18 +-----TOP 5----- +[812] score:0.999638 class:"space shuttle" +[404] score:0.000281 class:"airliner" +[657] score:0.000014 class:"missile" +[833] score:0.000010 class:"submarine, pigboat, sub, U-boat" +[466] score:0.000010 class:"bullet train, bullet" + +done +``` + +## 测试 Dynamic Shape + +进入 Dynamic Shape Demo 目录: + +``` +cd ~/rknn-toolkit2/rknn-toolkit-lite2/examples/dynamic_shape +``` + +运行推理: + +``` +[root@openEuler dynamic_shape]# python3 test.py +W rknn-toolkit-lite2 version: 2.3.2 +--> Load RKNN model +done +--> Init runtime environment +I RKNN: [16:57:46.389] RKNN Runtime Information, librknnrt version: 2.3.2 (429f97ae6b@2025-04-09T09:09:27) +I RKNN: [16:57:46.389] RKNN Driver Information, version: 0.9.8 +I RKNN: [16:57:46.390] RKNN Model Information, version: 6, toolkit version: 2.3.2(compiler version: 2.3.2 (839b70f037@2025-04-03T10:34:04)), target: RKNPU f2, target platform: rk3576, framework name: Caffe, framework layout: NCHW, model inference type: dynamic_shape +done +--> Running model +model: mobilenet_v2 + +input shape: 1,3,224,224 +W The input[0] need NHWC data format, but NCHW set, the data format and data buffer will be changed to NHWC. +-----TOP 5----- +[155] score:0.937500 class:"Shih-Tzu" +[204] score:0.002548 class:"Lhasa, Lhasa apso" +[154] score:0.001890 class:"Pekinese, Pekingese, Peke" +[283] score:0.000659 class:"Persian cat" +[284] score:0.000172 class:"Siamese cat, Siamese" + +input shape: 1,3,160,160 +W The input[0] need NHWC data format, but NCHW set, the data format and data buffer will be changed to NHWC. +-----TOP 5----- +[155] score:0.634766 class:"Shih-Tzu" +[154] score:0.295166 class:"Pekinese, Pekingese, Peke" +[204] score:0.030182 class:"Lhasa, Lhasa apso" +[194] score:0.001085 class:"Dandie Dinmont, Dandie Dinmont terrier" +[219] score:0.000291 class:"cocker spaniel, English cocker spaniel, cocker" + +input shape: 1,3,256,256 +W The input[0] need NHWC data format, but NCHW set, the data format and data buffer will be changed to NHWC. +-----TOP 5----- +[155] score:0.926758 class:"Shih-Tzu" +[154] score:0.008347 class:"Pekinese, Pekingese, Peke" +[204] score:0.004559 class:"Lhasa, Lhasa apso" +[193] score:0.001019 class:"Australian terrier" +[283] score:0.000481 class:"Persian cat" + +done +``` \ No newline at end of file diff --git a/documents/瑞芯微等开发板.md b/documents/瑞芯微等开发板.md index ce7f603..0ecb400 100644 --- a/documents/瑞芯微等开发板.md +++ b/documents/瑞芯微等开发板.md @@ -30,6 +30,7 @@ - [设置 SELinux](rockchip/设置SELinux.md) - [使用 Docker 构建镜像](rockchip/使用Docker构建镜像.md) - [openEuler 适配指南](rockchip/openEuler适配指南.md) + - [在openEuler上使用RKNPU](rockchip/在openEuler上使用RKNPU.md) - [scripts](../scripts/rockchip): 构建 openEuler RK3399 等开发板镜像的脚本 - [一次构建脚本](../scripts/rockchip/build.sh) - [boot 镜像构建脚本](../scripts/rockchip/build_boot.sh)