【风火轮YY3568开发板免费体验】第五章:在 Solus 上运行 npu 例程并搭建 nfs 环境实现在 YY3568 上实际运行 npu 例

描述

经过前面几章的铺垫,接下来的章节就开始进入到 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 仿真环境

这里主要参考的资料是:

  1. Rockchip_Quick_Start_RKNN_SDK_V1.3.0_CN.pdf
  2. Rockchip_RKNPU_User_Guide_RKNN_API_V1.3.0_CN.pdf
  3. Rockchip_Quick_Start_RKNN_Toolkit2_CN-1.3.0.pdf
  4. 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 这个包有问题,问题截图如下:RK3566

最新的 bfloat16 已经修复了这个问题,我之前想的是临时修改 pip 下载的 bfloat16 的源码发现找不到源码,后来就在 github 上找到的上游仓库的源码,下面就是怎么打包并安装了,从网上了解到了 Source Distribution,然后尝试在 bfloat16 的源码执行 python setup.py sdist 顺利的打包出来了,接着就是直接 pip install xxxx 安装就可以了。这个问题解决了之后,后面步骤就参考文档进行模型测试了,我选取的是 external/rknn-toolkit2/examples/tflite/mobilenet_v1 这个例程,结果截图如下:RK3566

从图中可以看到仿真模拟结果显示的 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 查看日志又了进一步的印象,比如:

  1. 使用 sudo journalctl -x 相比普通用户的 journalctl 可以看到更多内容的打印信息
  2. 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 也就顺利启动了,解决了之后我现在本地挂载测试下通过了,截图如下:RK3566

下一步就是在 YY3568 上测试了,发现默认竟然没有 mount.nfs 工具,只能在 buildroot 中放开 nfs utils 编译,将需要的 mount.nfs 和依赖库 libtirpc.so.3.0.0 tftp 过去,就可以正常 nfs 挂载了,测试external/rknpu2/examples/rknn_mobilenet_demo 例程,截图如下:RK3566

对比在 Solus 上的仿真结果,发现在 YY3568 的 npu 上进行测试结果具有明显的一致性。

审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分