58

zhangxiaolong · 2021年03月15日

探游·R329·AI部署实战(一)

1. 先提个纲

今天上手一块板子:R329 EVB板。

R329来自国产芯片厂商全志科技,定位是智能语音芯片。
        其上一代产品是R328,19年用在了很多智能语音产品上,比如天猫精灵、百度语音助手等。
        为什么能用进去?大致可以认为是功耗低、价格低、性能够用、产品阔以(绝不不是因为前东家所以才夸\~)。

在2020年,全志推出了新一代的R329,主打的是更优功耗,更高性能,更高性价比,其次的亮点是里面的Arm china 0.256T AIPU,双核DSP HIFI,这我刚拿到了开发板r329\_evb5\_v1,就迫不及待地上手了\~

上手之前我稍微构思了下,觉得应该做成系列记录教程,由浅入深地记录我的开发过程,让工程能力偏弱的算法工程师也能跟着一步步看懂,然后上手部署实践。

于是我就想着以我朋友(接近新手)的视角来玩这块板子,分为三个阶段,上手阶段,应用阶段,魔改阶段。

上手阶段:
        就是从一开始的板子上电,接线,搭开发环境、看文档、配置编译内核等等,总之是板子跑起来,为后续的开发做准备;

应用阶段:
        我们尝试交叉编译过程,移植深度学习推理框架(如NCNN,TNN等),使用zhouyi AIPU跑深度学习模型,使用双核DSP做回声消除等等,最终的目的是跑一个语音模型实现关键词唤醒,跑yolo实现目标检测功能,咱先实现功能,性能、精度调优留到第三步。

魔改阶段:
        这个阶段,我们越过应用者视角,进入精英开发者视角,就NPU、CPU的硬件特点进行深入hack,了解分析底层的硬件原理,知道每一条指令跑在硬件的哪个部分,知道在任一时刻,该指令出现在哪个地方哪个阶段;深入的剖析AI模型部署的方方面面,比如AI算法优化啊、量化分析啊,算子性能优化啊,性能分析啊等等,总之我觉得这部分是最有意思的。

2. 上手篇·新手级记录过程

首先,你得拿到板子对吧,怎么拿?

要么淘宝买,要么申请试用(下阶段的试用申请可以私信我了解哟)!

板子拿到了,我相信你跟我朋友(没接触过嵌入式有AI基本了解的某一线大厂算法工程师,简称朋友)一样有这样的疑问?

“这块板子能干啥?”

我想了下,这么回的:
    “你用过智能音箱没?百度的小度、小米的小爱,阿里的天猫精灵等等,你语音一叫它就答应,还能语音互动;你去吃海底捞的时候,会发现一个端菜的机器人对吧,这种机器人可以分辨行人、桌子、菜品,你挡住它道了还会跟你battle;刚刚所说的那些产品 那些功能都是这样的板子实现的,具体来说就是在板子上跑了深度学习语音模型、图像模型比如KWS,YOLO啊啥的。”

解决了朋友的能干啥的疑问之后,我问了下朋友:

“从你的角度来看,你觉得应该要有哪些资源以及知识才可把板子跑起来?然后把AI模型部署上去实现上面说的那些功能?”

朋友回答说:

“。。。我还是之前在大学的时候接触过嵌入式,现在基本都忘了,我也不太清楚了呀,你突然这么一问,现在完全是懵的呀\~”

也对,其实也理解,边缘嵌入式端模型工程部署是伴随着AI的发展而蓬勃兴起的,17年左右开始发展,在19年到达顶峰,目前已趋于平缓;而原来学校阶段基本教的都是嵌入式的基础知识,毕竟那时候AI还没火起来呢,现在相当于在原来的嵌入式基础上加入了AI的相关属性,因此 一部分的嵌入式工程师学习深度学习的知识,或者新晋的深度学习算法工程师学习嵌入式知识,从而就衍生了边缘端部署优化工程师的岗位,属于一个偏小众的领域。

这一顿battle之后,就得吃中饭了,先去吃饭先\~好好做个干饭人\~拜拜\~

俺回来啦\~开整开整\~\~\~\~\~\~睡午觉\~

。。。。。。



(下次再也不能在周末睡午觉了,比较费钱,刚吃完午饭又得吃晚饭了。。。)

好在不饿,先开个箱吧\~
1.jpg
2.jpg
3.jpg
4.jpg
上电后,灯亮了,就知道硬件没啥大问题了,接下来开始准备软件环境。





板子的通信接口有两种一种是adb连接,一种是串口连接,我们作为开发者,两个都得配好。

第一步先装驱动,在http://netstorage.allwinnertech.com:5000/sharing/dsn8IbX8s链接下载驱动,然后在压缩包路径:
5.jpg

分别安装驱动,安装完后记得重启哟\~

按照官网的教程(https://r329.docs.allwinnertech.com/zh\_CN/latest/devboardstudy/r329evb5compile/)来配置啥问题也没有,
6.jpg
7.jpg

  • 好了,到此可以知道板子是好的了,而且也知道板子是预先烧录好了固件的。





此时我们按照教程去点灯也没啥问题:
8.jpg

于是去测一下麦克风,在板子上测得数据,然后adb pull到电脑上听一下效果,一开始用arecord指令出来很大电流声,指定参数如下图所示就声音正常了。

9.jpg
可以看到,在三通道下是ok的,听上去也挺清晰的。
10.jpg

对应的单通道下也是ok的(低音沉\~高音丽\~![狗头])
11.jpg


2. 编译固件和烧写固件部分

我们要烧录固件,得先有源码,于是先去搞源码。

此时你得去全志的客户服务平台(https://open.allwinnertech.com/#/dashboard?menuID=1)申请一个账号,然后让官方给你开通代码权限,开好后就会发个邮件给你:
12.jpg

此时按照SDK下载方法一步步执行就好啦\~

然后你可以开始下代码啦,但此时你发现不知道宿主环境是啥?

找到文档《Tina Linux 系统软件 开发指南》
13.jpg

于是知道了要在ubuntu14.04中进行开发,于是我便弄了个虚拟机跑ubuntu 14.04,这其中也碰到了一次问题,就是我下错版本了,下的是32bit版本,因此按照文档进行环境包安装的时候就进行不下去了,最后换为64bit系统就好了,这点也是文档没有明确指出的。

好了,下载ubuntu.14.04 64bit系统镜像-->下载虚拟机Vmware-->安装ubuntu-->按照文档(《Tina Linux 系统软件 开发指南》)安装环境。。。。。

然后终于可以下代码啦\~按照服务指导手册的提醒,一步步开始下代码啦\~

\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~
································
打个盹的功夫\~
································
\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~

好的,现在代码下载好了。



我们接下来试一下编译固件烧录固件的流程:

官网链接在这:https://r329.docs.allwinnertech.com/zh\_CN/latest/devboardstudy/r329evb5compile/

14.jpg

直接按照官网的流程来(行文此时正在编译中),编完后烧录一下看有没有什么问题。。。。。



A few years later……

15.jpg
快了快了\~

 。
 。
 。



Finally\~

然后我们烧录下:
16.jpg
然后上电,完美\~

17.jpg

当然,上述过程中假如我们要编译内核支持AIPU驱动可以kernel\_menuconfig 进行配置:

18.jpg
可以看到AIPU是默认驱动支持了的,但是在软件包配置部分:
19.jpg
并没有提供支持,也就是说我们用不了哇,据了解是知识产权属于ARM china,全志这边并不能直接使用,需要原IP厂自己开放了;
其次HIFI双核DSP部分也是不能直接使用的,因为版权属于科声讯,因此作为发烧开发者的我们,可玩性大大降低了!因此期待尽快释放AIPU、DSP部分资源出来呀\~

ok,此时整个流程都算走了一遍了,可以得到阶段性的结论: 板子是ok的,基本环境已搭建好\~


3. 交叉编译工具

这个时候我们下一步的探索就是交叉编译环境的确认了,我们只需要造个最简单的hello world函数,交叉编译后能在开发板上运行,

我要在开发板上运行怎么弄呢?

这个时候就是交叉编译 工具链出场了!啥?你问我啥叫交叉编译?为什么要有这个?

嗯,我简单说,你开发机器是虚拟机里面的ubuntu,这里编译的代码只能在虚拟机ubuntu里面跑,但是现在我要移植到目标板R329的tina中去,因此新加一个中间层,我编译的时候选择某个特定的编译器,生成的代码可以直接在R329-tina中跑,这个特定的编译器就是交叉编译器。

为什么要有这个?因为宿主机中开发方便很多啊\~你要是开发板性能强到跟电脑主机一样了,各种环境也很完善了,那就不需要这么麻烦了呀,直接开发板上开发就完事了\~

好了,现在到实操了,官方文档这部分不是很详细,我把摸索的过程详尽写出来,希望能帮到后来者:

第一步在宿主机造一个简单的helloworld.c
20.jpg
确保宿主机能正常运行。
21.jpg
第二步找到交叉编译工具,最新的在线文档,https://r329.docs.allwinnertech.com/zh\_CN/latest/devboardstudy/r329evb5tina/#\_4
22.jpg
我们的目标平台是arm,因此选择arm目录;
目录内有glibc跟musl两套库,我咨询官方得知是musl库,于是我一路先择到:
23.jpg

在该目录下编译hellworld.c函数,得到嵌入式平台下的目标文件helloworld22,经vmhgfs共享文件,再通过adb push helloworld22 /home/,送到板子上,此时运行发现:
23.5.png
推测可能是:

  1. 编译器版本的问题,编译内核的跟应用的而不一致,
  2. 也有可能是因为宿主机是64bit的,而我们目标板的程序是32bit的(试了下aarch64也不行)。

因此我们先用static编译顶一下:
24.jpg

哇\~久违的hello world啊\~(我们技术渣就是这样的啦,一点点东西就很开心了\~)
25.png
至此,整个流程算是跑通啦\~

小结一下:

  1. 文档还是有一些盲区的,对于一些新手朋友不是很友好,建议直接上docker啊,这样我就完全不用管环境配置问题啦\~
  2. 主要的玩点在于HIFI双核DSP跟0.25TOPs的AIPU核,但是这两个目前都没法用啊,这部分希望尽快解决呀\~后面的语音+图像模型部署还等着上呢\~我总不能跑在算力10几个GFLOPs的A53核上 吧\~
  3. 文档开放的不够全面,比如AIPU的一系列开发文档(手动狗头)。

呼\~ 开篇总算水完啦\~我这次是带着朋友一边做一边写的,根据朋友的建议,特意把某些地方写的很繁琐,希望大家不要嫌弃呀\~下次见,掰掰\~

推荐阅读
关注数
2114
内容数
20
全志科技芯片方案学习专栏,欢迎关注。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息