经过前面几章的铺垫,接下来的章节就开始进入到 NPU 相关的开发测试了。本章呢,记录下我分别在 Solus 上对 npu 相关例程的仿真以及实际在 YY3568 上进行的 npu 例程测试,本章的重点是在 Solus 上仿真环境的搭建以及为了更友好地在 YY3568 和 Solus 上传递文件而在 Solus 上搭建 NFS 环境走的坑。本章记录了我碰到一下几个问题:
- 搭建仿真环境安装 python 依赖时,bfloat16 软件包使用 pip 直接安装出错(error: ‘unique_ptr’ in namespace ‘std’ does not name a template type),解决方法是下载最新的源码包并对最新的源码打 sdist 包并使用 pip 本地安装
- 搭建 NFS 环境时竟然出错,使用 systemctl status nfs-server.service查看出错(rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)),逐步定位是 /etc/netconfig 内容不正确导致(竟然为空,从网上找到 sample 粘贴进去解决问题)
- 默认 buildroot 编译的根文件系统没有 mount.nfs 支持需要放开
1. 在 Solus 上搭建 NPU 仿真环境
这里主要参考的资料是:
- Rockchip_Quick_Start_RKNN_SDK_V1.3.0_CN.pdf
- Rockchip_RKNPU_User_Guide_RKNN_API_V1.3.0_CN.pdf
- Rockchip_Quick_Start_RKNN_Toolkit2_CN-1.3.0.pdf
- Rockchip_User_Guide_RKNN_Toolkit2_CN-1.3.0.pdf
刚好 Solus 上有 python3.8 版本,所以就按照 python3.8 的依赖进行安装了:
python3.8 -m pip install -r requirements_cp38-1.3.0.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
因为 pypi 上的 bfloat16 这个包有问题,问题截图如下:
最新的 bfloat16 已经修复了这个问题,我之前想的是临时修改 pip 下载的 bfloat16 的源码发现找不到源码,后来就在 github 上找到的上游仓库的源码,下面就是怎么打包并安装了,从网上了解到了 Source Distribution,然后尝试在 bfloat16 的源码执行 python setup.py sdist 顺利的打包出来了,接着就是直接 pip install xxxx 安装就可以了。这个问题解决了之后,后面步骤就参考文档进行模型测试了,我选取的是 external/rknn-toolkit2/examples/tflite/mobilenet_v1 这个例程,结果截图如下:
从图中可以看到仿真模拟结果显示的 Top5 内容,后续可以和在YY3568上实际运行的结果进行对比。
2. 在 Solus 上搭建 NFS 环境并在 YY3568 上测试同样的 npu 例程
这个文章之所以搁了这么就的原因就是这个 NFS 服务的问题,困扰了我将近两天,要不然文章昨天就发出去了。因为我开始是使用 eopkg install nfs-util 从官方仓库安装的 nfs 服务软件包,竟然不能正常启动 nfs-server.service,我感觉很惊讶,接着我就发了帖子start nfs-server.service failed,还好有很热情的社区伙伴回复,我尝试手动安装最新版本的 nfs-util-2.6.3 还是无法正常启动 nfs 服务,我尝试根据 systemd 的错误打印去看 nfs-util 的代码。在这个过程中我对使用 journalctl 查看日志又了进一步的印象,比如:
- 使用 sudo journalctl -x 相比普通用户的 journalctl 可以看到更多内容的打印信息
- journalctl -p xx 可以过滤要打印的日志优先级,如果是单个数字,小于等于这个级别的日志都会打印出来;如果是一个范围:1...2,那么只会打印1和2这个级别范围内的打印信息。
感谢 journalctl ,也正是这个打印后来逐步帮助我解决了这个问题:
首先我在 https://raindocs.blogspot.com/2019/09/kernel-svc-failed-to-register-nfsaclv2.html?m=1 了解到 nfs-server 之前需要启动 rpcbind 服务,然后我就尝试使用 systemd 启动 rpcbind 服务,我尝试启动这个服务并尝试使用 journalctl 查看日志,发现会打开 /etc/netconfig 文件,我的这个文件竟然是空的,所以我搜索了一下这个文件的 sample,找到了相关的内容复制到这个文件如下:
udp6 tpi_clts v inet6 udp - -
tcp6 tpi_cots_ord v inet6 tcp - -
udp tpi_clts v inet udp - -
tcp tpi_cots_ord v inet tcp - -
rawip tpi_raw - inet - - -
local tpi_cots_ord - loopback - - -
unix tpi_cots_ord - loopback - - -
然后再启动 rpcbind 就正常了,接着启动 nfs-server 也就顺利启动了,解决了之后我现在本地挂载测试下通过了,截图如下:
下一步就是在 YY3568 上测试了,发现默认竟然没有 mount.nfs 工具,只能在 buildroot 中放开 nfs utils 编译,将需要的 mount.nfs 和依赖库 libtirpc.so.3.0.0 tftp 过去,就可以正常 nfs 挂载了,测试external/rknpu2/examples/rknn_mobilenet_demo 例程,截图如下:
对比在 Solus 上的仿真结果,发现在 YY3568 的 npu 上进行测试结果具有明显的一致性。
|