前言
實驗室的項目需要用到Firefly的AIO-3399 ProC開發闆,該型号開發闆內建了硬體加速晶片NPU(神經網絡加速單元),經tensorflow、PyTorch等訓練好的模型可用官方提供的RKNN Toolkit工具轉換為.rknn格式的模型,運作在開發闆上利用NPU進行對資料的後向推理加速處理。RKNN Toolkit開發套件安裝繁瑣,前前後後折騰了一周的時間才算部署成功,故記錄下部署過程及遇到的問題,以供自己和各位參考。
一、開發部署環境
開發環境 | 軟體版本/配置 |
---|---|
開發闆型号 | Firefly AIO-3399 ProC開發闆 (3+16GB) |
開發闆作業系統 | Ubuntu 18.04LTS |
開發闆固件版本 | AIO-RK3399PROC-UBUNTU18.04-GPT-20200525-1016.img |
RKNN Toolkit版本 | 1.6.0 (rknn_toolkit-1.6.0-cp37-cp37m-linux_aarch64.whl) |
Python版本 | Python 3.7.10 |
電腦遠端軟體 | Xshell 6&Xftpd 6 |
二、RKNN 三件套介紹
1、RKNN-Toolkit → 基于 Python 環境的模型轉換推理開發工具
2、DRV → NPU 和上位機通信的服務
3、API → 調用NPU 硬體的 API 接口
三、安裝過程
3.1 檢視開發闆中DRV的版本(1.3.1)
[email protected]:~$ dpkg -l | grep 3399pro
ii firefly-3399pronpu-driver 1.3.1 arm64 <insert up to 60 chars description>
更新DRV的版本
sudo apt update
sudo apt install firefly-3399pronpu-driver
更新完後,檢查DRV的版本已更新至1.6.0
[email protected]:~$ dpkg -l | grep 3399pro
ii firefly-3399pronpu-driver 1.6.0 arm64 <insert up to 60 chars description>
3.2 關閉開發闆目前系統的圖形界面
使用Xshell 6 SSH登入開發闆,進行下列操作,防止後續編譯軟體包時因系統記憶體不足導緻編譯失敗
(謹慎使用,最新固件AIO-RK3399PROC-UBUNTU-20210304-1705.img關閉圖形界面後會導緻系統無法啟動,序列槽顯示如下報錯資訊:
4189 序列槽[ 4.772713] 00000040: 000002a5 000002a5 00000000 00000000 00000000 00000000 00000000 00000000
4190 序列槽[ 4.773490] 00000060: 00000004 00000004 00000753 00000753 00000000 00000000 00000000 00000000
4191 序列槽[ 4.774254] 00000080: 00000000 00000000
4192 序列槽[ 4.820522] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00007f00
4193 序列槽[ 4.820522]
4194 序列槽DDR Version 1.24 20191016
AIO-RK3399PROC-UBUNTU18.04-GPT-20200525-1016.img該版本可以正常操作)
sudo systemctl set-default multi-user.target
sudo reboot
#未關GUI界面時的系統占用
Memory usage: 12 % of 1893MB
Usage of /: 24% of 15G
#關閉GUI界面時的系統占用
Memory usage: 4 % of 1893MB
Usage of /: 24% of 15G
(PS:待RKNN Toolkit安裝完成後可再手動開啟使用者界面
sudo systemctl set-default graphical.target
sudo reboot
)
3.3 安裝Python3.7
sudo apt update #檢查可更新檔案
sudo apt install software-properties-common #安裝可添加源的工具
sudo add-apt-repository ppa:deadsnakes/ppa #添加源,否則會無法找到python3.7-dev軟體包
sudo apt install python3.7-dev #安裝python3.7
3.4 用virtualenv管理python版本
(開發闆系統中同時存在多個 Python(Python2.7&python3.6)版本,建議使用 virtualenv來管
理 Python環境)
#建立 virtualenv環境
sudo apt install virtualenv #安裝virtualenv軟體
virtualenv -p /usr/bin/python3.7 venv #建立虛拟環境
source venv/bin/activate #激活venv環境
(venv) [email protected]:~$ pip3 -V #檢視目前pip3所在Python的路徑
pip 21.0.1 from /home/firefly/venv/lib/python3.7/site-packages/pip (python 3.7)pip
修改python預設為python3.7:
為了因為C++調用python時,預設是調用python2.7,這導緻很多python3.7的文法報錯。是以需要更改python預設軟連接配接
#檢視路徑python,python3.7路徑
which python python3.7
/usr/bin/python
/usr/bin/python3.7
sudo rm /usr/bin/python
sudo rm /usr/bin/python3
#建立python3.軟連接配接到python&Python3
sudo ln -s /usr/bin/python3.7 /usr/bin/python
sudo ln -s /usr/bin/python3.7 /usr/bin/python3
至此Python3.7環境配置完成。
3.5 安裝相關依賴包(numpy、h5py &opencv)
3.5.1 安裝并更新相關依賴包
sudo apt-get update
sudo apt-get install cmake gcc g++ libprotobuf-dev protobuf-compiler
sudo apt-get install liblapack-dev libjpeg-dev zlib1g-dev
pip3 install --upgrade pip #更新pip包的版本
pip3 install wheel setuptools #安裝 Python 打包工具
3.5.2 安裝并編譯numpy、h5py
(PS:opencv-python和h5py同時依賴的numpy包的版本必須是1.16.3,故需先安裝編譯numpy包。較難編譯和費時較長的whl包已上傳至網盤,如有需要,可從文末的連結下載下傳到PC端,通過Xftpd軟體上傳至開發闆安裝目錄,離線安裝即可
)
重要 :安裝包的順序不可調換,否則預設安裝的依賴包版本與RKNN所要求的沖突
執行以下指令:
pip3 install numpy==1.16.3 #安裝numpy包,編譯完成即可進行下一步
#或将離線包下載下傳後安裝
#pip3 install numpy-1.16.3-cp37-cp37m-linux_aarch64.whl
pip3 install h5py==2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple #安裝h5py包,編譯完成即可進行下一步
這時編譯h5py包報錯
/tmp/pip-install-g8zeu2wp/h5py_e742916510854ca6b68f847f94f04c44/h5py/api_compat.h:27:10: fatal error: hdf5.h: No such file or directory
#include "hdf5.h"
^~~~~~~~
compilation terminated
error: command 'aarch64-linux-gnu-gcc' failed with exit status 1
----------------------------------------
ERROR: Command errored out with exit status 1:
需執行以下操作,安裝缺少的依賴包,重新編譯h5py
sudo apt-get install libhdf5-dev
pip3 install h5py==2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
#或将離線包下載下傳後安裝h5py
#pip3 install h5py-2.8.0-cp37-cp37m-linux_aarch64.whl
3.5.3 安裝并編譯opencv-python
安裝并編譯opencv-Python包,如果不指定版本,預設會從清華源下載下傳已編譯好的最新版本包opencv_python-4.5.1.48-cp37-cp37m-manylinux2014_aarch64.whl (34.5 MB),但該包預設依賴numpy的版本要求numpy>=1.19.3,RKNN Toolkit依賴的numpy版本必須是1.16.3,是以不可安裝最新版本的opencv_python-4.5.1.48版本,需下載下傳4.3.0.38版本的opencv-python源碼包編譯
opencv-python的各個版本可此連結下載下傳https://pypi.tuna.tsinghua.edu.cn/simple/opencv-python/
pip3 install opencv-python==4.3.0.38 -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout=200 #安裝源碼包進行編譯
[2021/ 21:43:23] Building wheels for collected packages: opencv-python
...
[2021/ 22:51:49] Building wheel for opencv-python (PEP 517) ... done
[2021/ 22:51:49] Successfully built opencv-python
[2021/ 22:51:49] Installing collected packages: opencv-python
[2021/ 22:51:50] Successfully installed opencv-python-4.3.0.38
#或将離線包下載下傳後安裝opencv-python
#pip3 install opencv_python-4.3.0.38-cp37-cp37m-linux_aarch64.whl #
大約要1小時左右方可編譯完成,編譯好的opencv_python-4.3.0.38-cp37-cp37m-linux_aarch64.whl包可從文末連結處擷取。
3.5.4 安裝RKNN-Toolkit 1.6.0
執行以下指令,系統會根據RKNN的版本要求安裝編譯固定版本的依賴包,如psutil5.6.2 lmdb0.93 onnx1.6.0 scipy>=1.1.0 protobuf3.11.2 Pillow==5.3.0等。大概10-30分鐘左右編譯安裝成功。(RKNN的各個版本可從此連結下載下傳http://repo.rock-chips.com/pypi/simple/,其他編譯好的whl依賴包不可直接用到AIO-3399ProC上,如onnx,scipy,numpy等,這些包在python中會因未知原因導入失敗,并導緻OpenCV、TensorFlow和RKNN-Toolkit無法使用)
(venv) [email protected]:~/RKNN1.6$ pip3 install rknn_toolkit-1.6.0-cp37-cp37m-linux_aarch64.whl
3.5.5 安裝TensorFlow 1.14.0
将下載下傳好的tensorflow-1.14.0-cp37-none-linux_aarch64.whl 放置目錄下,安裝并編譯,編譯grpcio依賴包大約十多分鐘,耐心等待即可。(若使用pip3 install tensorflow 會自動安裝最新版本的tensorflow包,依賴的numpy包的版本與RKNN要求沖突,故需手動安裝)
基于arm的已編譯好的各版本tensorflow whl包也可從此位址下載下傳https://github.com/lhelontra/tensorflow-on-arm/releases。
(venv) [email protected]:~/RKNN1.6$ pip3 install tensorflow-1.14.0-cp37-none-linux_aarch64.whl
Building wheel for grpcio (setup.py) ... done
Successfully installed absl-py-0.11.0 astor-0.8.1 gast-0.4.0 google-pasta-0.2.0 grpcio-1.36.1 importlib-metadata-3.7.2 keras-applications-1.0.8 keras-preprocessing-1.1.2 markdown-3.3.4 tensorboard-1.14.0 tensorflow-1.14.0 tensorflow-estimator-1.14.0 termcolor-1.1.0 wrapt-1.12.1 zipp-3.4.1
3.5.6 安裝matplotlib
在測試官方給出的rknn-toolkit\examples\darknet\yolov3路徑下的demo時,報如下錯誤:
raceback (most recent call last):
File "test.py", line 5, in <module>
from matplotlib import gridspec
ModuleNotFoundError: No module named 'matplotlib'
可知需要安裝Matplotlib依賴包,官方的docker鏡像中,安裝的Matplotlib版本為3.0.3,故指定該版本手動安裝,但在編譯過程中報錯,無法成功安裝,具體日志如下:
(venv) [email protected]:~/RKNN1.4/examples/darknet/yolov3$ pip3 install matplotlib==3.0.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
ERROR: Command errored out with exit status 1:
command: /home/firefly/venv/bin/python3.7 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-zyrjt7ya/matplotlib_d32c2949086446449427874a51fff411/setup.py'"'"'; __file__='"'"'/tmp/pip-install-zyrjt7ya/matplotlib_d32c2949086446449427874a51fff411/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-v_dy1bs_
Complete output (43 lines):
============================================================================
Edit setup.cfg to change the build options
BUILDING MATPLOTLIB
matplotlib: yes [3.0.3]
python: yes [3.7.10 (default, Feb 20 2021, 21:17:23) [GCC
7.5.0]]
platform: yes [linux]
REQUIRED DEPENDENCIES AND EXTENSIONS
numpy: yes [version 1.16.3]
install_requires: yes [handled by setuptools]
libagg: yes [pkg-config information for 'libagg' could not be found. Using local copy.]
freetype: no [The C/C++ header for freetype2 (ft2build.h) could not be found. You may need to install the
development package.]
png: yes [version 1.6.34]
qhull: yes [pkg-config information for 'libqhull' could not be found. Using local copy.]
OPTIONAL SUBPACKAGES
sample_data: yes [installing]
toolkits: yes [installing]
tests: no [skipping due to configuration]
toolkits_tests: no [skipping due to configuration]
OPTIONAL BACKEND EXTENSIONS
agg: yes [installing]
tkagg: yes [installing; run-time loading from Python Tcl /
Tk]
macosx: no [Mac OS-X only]
windowing: no [Microsoft Windows only]
]
OPTIONAL PACKAGE DATA
dlls: no [skipping due to configuration]
============================================================================
* The following required packages can not be built:
* freetype
* Try installing freetype with `apt-get install
* libfreetype6-dev` and pkg-config with `apt-get
* install pkg-config`
----------------------------------------
Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
ERROR: Could not find a version that satisfies the requirement matplotlib==3.0.3
ERROR: No matching distribution found for matplotlib==3.0.3
由The C/C++ header for freetype2 (ft2build.h) could not be found,You may need to install the development package.報錯日志可推測,是在開發環境缺少所依賴的freetype包,執行以下指令進行安裝,具體日志如下:
sudo apt-get install pkg-config
sudo apt-get install libfreetype6-dev
pip3 install matplotlib==3.0.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
Building wheel for matplotlib (setup.py) ... done
Created wheel for matplotlib: filename=matplotlib-3.0.3-cp37-cp37m-linux_aarch64.whl
Stored in directory: /home/firefly/.cache/pip/wheels/8a/bb/44/9d6804fb3c73fc4f624e76721ed032411f725ac812b070b5b9
Successfully built matplotlib
Installing collected packages: python-dateutil, pyparsing, kiwisolver, cycler, matplotlib
Successfully installed cycler-0.10.0 kiwisolver-1.3.1 matplotlib-3.0.3 pyparsing-2.4.7 python-dateutil-2.8.1
成功安裝了Matplotlib,可繼續測試官方的yolo v3 demo。
3.5.7 安裝PyTorch
因項目暫時用不上PyTorch,故先不安裝,可參考下列連結進行編譯安裝。
https://github.com/yunfeizu/RK3399Pro-pytorch-opencv/
https://blog.csdn.net/zengwubbb/article/details/110936687
四、測試過程
4.1 在python中測試各子產品是否正常
venv) [email protected]:~/RKNN1.6$ python3
Python 3.7.10 (default, )
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import h5py
>>> h5py.__version__
'2.8.0'
>>> import cv2
>>> import numpy
>>> from rknn.api import RKNN
>>>import tensorflow as tf
>>>tf.__version__
>>>1.14.0
>>>
>>> import matplotlib
>>> matplotlib.__version__
'3.0.3'
4.2 運作官方提供的demo,測試RKNN是否安裝成功
(venv) [email protected]:~/RKNN1.6/examples/tensorflow/ssd_mobilenet_v1$ python3 test.py
Traceback (most recent call last):
File "test.py", line 61, in <module>
... ...
File "/home/firefly/venv/lib/python3.7/site-
packages/tensorflow/contrib/__init__.py", line 31, in <module>
from tensorflow.contrib import cloud
ImportError: cannot import name 'cloud' from 'tensorflow.contrib'
出現報錯,參考此連結文章,将/home/firefly/venv/lib/python3.7/site-packages/tensorflow/contrib/init.py出錯那行注釋掉即可,并且,在下一句還需縮進,不然會提示以下錯誤代碼:
File "/home/firefly/venv/lib/python3.7/site-packages/tensorflow/contrib/__init__.py", line 33
from tensorflow.contrib import cluster_resolver
^
IndentationError: expected an indented block
進入/example/tflite目錄下,運作test.py,測試開發環境是否正常
(venv) [email protected]:~/RKNN1.6/examples/tflite/mobilenet_v1$ python3 test.py
--> config model
done
--> Loading model
W:tensorflow:From /home/firefly/venv/lib/python3.7/site-packages/rknn/api/rknn.py:104: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.
W:tensorflow:From /home/firefly/venv/lib/python3.7/site-packages/rknn/api/rknn.py:104: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.
... ... ...
--> Building model
W The target_platform is not set in config, using default target platform rk1808.
... ...
done
--> Export RKNN model
[ done
--> Init runtime environment
I NPUTransfer: Starting NPU Transfer Client, Transfer version 2.1.0 ([email protected]:50:51)
D RKNNAPI: ==============================================
D RKNNAPI: RKNN VERSION:
D RKNNAPI: API: 1.6.0 (79320de build: 2020-12-29 10:57:09)
D RKNNAPI: DRV: 1.6.0 (159d2d3 build: 2021-01-12 15:23:09)
D RKNNAPI: ==============================================
done
--> Running model
D RKNNAPI: __can_use_fixed_point: use_fixed_point = 1.
mobilenet_v1
-----TOP 5-----
[156]: 0.8505859375
[155]: 0.0916748046875
[205]: 0.013580322265625
[284]: 0.00646209716796875
[194]: 0.0024871826171875
done
--> Evaluate model performance
W When performing performance evaluation, inputs can be set to None to use fake inputs.
========================================================================
Performance
========================================================================
Total Time(us): 5561
FPS: 179.82
========================================================================
done
執行tensorflow和Onnx檔案夾下的test.py時,系統提示
E OSError: [Errno 12] Cannot allocate memory
Init runtime environment failed
導入模型時同時用top工具動态檢測開發闆的系統狀态,發現CPU占用率達到了100%,記憶體占用率最高達到了78%,估計是由于開發闆的配置記憶體太小(2GB),記憶體不足導緻demo運作失敗,後續可考慮安裝RKNN-Toolkit-Lite版本或安裝低版本的tensorflow嘗試解決此問題。

在運作yolo 官方的測試腳本時,發現一直停留在Downloading yolov3.weights…指令行,參考網上的文章,并檢視測試腳本,發現需要先從https://pjreddie.com/media/files/yolov3.weights下載下傳yolov3.weights,方可進行下一步測試,而由于未知原因一直無法下載下傳,将此連結放入迅雷中将yolov3.weights檔案下載下傳至本地,通過Xftpd軟體上傳至對應路徑即可,正常運作測試腳本。
4.3 編譯安裝時遇到的報錯及可能解決的方法
- 按照RK提供的安裝文檔方法,自行編譯h5py時,會報錯,提示 You must put some ‘source’ URIs in your sources.list,可按下列指令操作解決此問題。
sudo apt-get build-dep python3-h5py && \
pip3 install h5py
sudo vim /etc/apt/sources.list
#複制以下内容到編輯器中,然後ESC ,:wq儲存退出
deb-src http://archive.ubuntu.com/ubuntu trusty main restricted #Added by software-properties
deb-src http://gb.archive.ubuntu.com/ubuntu/ trusty restricted main universe multiverse #Added by software-properties
deb-src http://gb.archive.ubuntu.com/ubuntu/ trusty-updates restricted main universe multiverse #Added by software-properties
deb-src http://gb.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse #Added by software-properties
deb-src http://security.ubuntu.com/ubuntu trusty-security restricted main universe multiverse #Added by software-properties
deb-src http://gb.archive.ubuntu.com/ubuntu/ trusty-proposed restricted main universe multiverse #Added by software-properties
sudo apt-get update
sudo apt-get build-dep python3-h5py && \
pip3 install h5py
- 當編譯其他依賴包出錯時,可能是缺少依賴工具鍊,可嘗試下列指令:
pip3 install Cython
sudo apt-get install gcc python3-dev
sudo apt-get install libhdf5-dev
sudo apt-get install cmake gcc g++ libprotobuf-dev protobuf-compiler libgfortran5-dbg libopenblas-dev gfortran libprotoc-dev
- 安裝官方提供的基于python3.5版本編譯的opencv-headless 4.0.12.3版本時,如果import cv2報錯,提示 找不到libjpeg.so.62,可執行以下指令即可解決該問題。
sudo apt update
sudo apt-get install libjpeg62-dev
五、總結
不同平台,RKNN提供的基于不同Python版本的安裝包,安裝時不同平台對應的依賴關系需要處理好,具體如下:
1.Windows隻提供 Python3.6的安裝包。
2. MacOS提供 python3.6和 python3.7的安裝包。
3. ARM64平台(安裝 Debian 9或 10作業系統)提供 Python3.5( Debain 9)和 Python3.7(Debian10)的安裝包。
4. Linux_x64平台提供基于 python3.5和 python3.6的安裝包。
5.開發闆編譯好的whl包一般會存放在/.cache/pip/wheels/路徑下,可将這些包導出儲存。
Building wheel for onnx (setup.py) ... done
Created wheel for onnx: filename=onnx-1.6.0-cp37-cp37m-linux_aarch64.whl s
Stored in directory: /home/firefly/.cache/pip/wheels/...
cp -ri ./wheel* /home/firefly
- 項目可能用到的指令
sudo rm -rf ~/.cache/pip #删除pip3緩存檔案
source /home/firefly/venc/bin/activate #進入venc環境
#加速Python pip安裝速度,更改Python軟體源,操作方法:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install pip -U
#RKNN啟動可視化視窗指令
python3 -m rknn.bin.visualization\
#列印核心調試資訊
cat /proc/kmsg
dmesg | grep ov13850 #檢視ov13850驅動是否正常
cd /usr/local/bin/ #相機測試腳本路徑
ls /dev/video #列出裝置挂載到video節點資訊
v4l2-ctl -D #列出攝像頭的驅動資訊
v4l2-ctl -d /dev/video0 --list-formats-ext #列出視訊節點裝置所支援的視訊格式,分辨率
v4l2-ctl --list-devices #列出視訊裝置挂載節點資訊
部署過程中生成的whl包和下載下傳的yolov3.weights檔案如有需要可在下面連結自取,因為每個人的開發環境不同,相應的whl包不保證都能正常使用,對應的whl包僅可在RKNN1.6.0,python3.7環境下安裝使用。請謹慎安裝。
編譯打包好的軟體包的下載下傳連結,提取碼: a1ca