Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

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

    A Series
    1
    1
    1404
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • miumiu
      WOW LV 5 last edited by miumiu

      原文链接:https://aijishu.com/a/1060000000190639

      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之后,就得吃中饭了,先去吃饭先~好好做个干饭人~拜拜~

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

      。。。。。。

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

      好在不饿,先开个箱吧~
      05536354-a42c-4191-8fa9-6fa05f209fc9-image.png

      c78166f0-b545-4157-9d5e-cccb46031047-image.png

      fdacdecc-fb47-4dae-a375-c4c0cd0d8490-image.png

      375fda22-4f76-41a4-b740-58395276639a-image.png
      上电后,灯亮了,就知道硬件没啥大问题了,接下来开始准备软件环境。

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

      第一步先装驱动,在http://netstorage.allwinnertech.com:5000/sharing/dsn8IbX8s链接下载驱动,然后在压缩包路径:
      6d4bbf40-ec5b-491b-ade8-80f8b21b87a4-image.png

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

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

      e0c849a6-e326-4395-a4ee-03afe132c959-image.png

      556a8f71-8e53-4765-8701-9dd3d6a81bf8-image.png
      好了,到此可以知道板子是好的了,而且也知道板子是预先烧录好了固件的。

      此时我们按照教程去点灯也没啥问题:
      6c9d4343-c36b-4e88-8ecf-9401bd1ccb80-image.png

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

      18c8292f-2516-4195-aaca-15e0d2f5ade4-image.png

      可以看到,在三通道下是ok的,听上去也挺清晰的。
      82af9545-c985-40ad-bdd2-5d61caf987d6-image.png

      对应的单通道下也是ok的(低音沉~高音丽~![狗头])
      e58dd234-3d19-4729-a27a-7c9bc8445f28-image.png

      2. 编译固件和烧写固件部分
      我们要烧录固件,得先有源码,于是先去搞源码。

      此时你得去全志的客户服务平台(https://open.allwinnertech.com/#/dashboard?menuID=1)申请一个账号,然后让官方给你开通代码权限,开好后就会发个邮件给你:
      2540e168-07fd-409a-93d3-3df50a61cc6a-image.png

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

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

      找到文档《Tina Linux 系统软件 开发指南》
      1f83c7ab-8853-4daf-ae5d-35ff9a8f31df-image.png

      于是知道了要在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/

      ceb78869-5b0f-4943-b6e9-889c923444af-image.png 14.jpg

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

      A few years later……

      f31b977f-a3d1-434b-a4fd-76f4b7a4d1ae-image.png
      快了快了~
      。
      。
      。
      Finally~

      然后我们烧录下:
      2e5729a1-a692-44a2-a43f-56df5f24d7ab-image.png
      然后上电,完美~

      72aab13f-9f93-4918-b05e-27d806d45b62-image.png

      当然,上述过程中假如我们要编译内核支持AIPU驱动可以kernel_menuconfig 进行配置:
      42d86709-e959-45f7-b53b-d62b4697ac92-image.png
      可以看到AIPU是默认驱动支持了的,但是在软件包配置部分:
      5ace472c-83c1-447a-bff9-88d254f56c5f-image.png
      并没有提供支持,也就是说我们用不了哇,据了解是知识产权属于ARM china,全志这边并不能直接使用,需要原IP厂自己开放了;
      其次HIFI双核DSP部分也是不能直接使用的,因为版权属于科声讯,因此作为发烧开发者的我们,可玩性大大降低了!因此期待尽快释放AIPU、DSP部分资源出来呀~

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

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

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

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

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

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

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

      第一步在宿主机造一个简单的helloworld.c
      7967d22b-0cde-424d-81da-fc01bfbbe646-image.png

      确保宿主机能正常运行。
      60a775cd-077b-4ffa-868f-a8fae50babf4-image.png

      第二步找到交叉编译工具,最新的在线文档,https://r329.docs.allwinnertech.com/zh_CN/latest/devboardstudy/r329evb5tina/#_4
      7a999db0-4c73-43b1-9947-4e1d264a2902-image.png
      我们的目标平台是arm,因此选择arm目录;
      目录内有glibc跟musl两套库,我咨询官方得知是musl库,于是我一路先择到:

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

      编译器版本的问题,编译内核的跟应用的而不一致,
      也有可能是因为宿主机是64bit的,而我们目标板的程序是32bit的(试了下aarch64也不行)。
      因此我们先用static编译顶一下:
      54873fa3-d35e-4061-bb1b-6d11091ece93-image.png

      哇~久违的hello world啊~(我们技术渣就是这样的啦,一点点东西就很开心了~)
      400493ed-a383-4765-af20-55f7696c0574-image.png
      至此,整个流程算是跑通啦~

      小结一下:

      文档还是有一些盲区的,对于一些新手朋友不是很友好,建议直接上docker啊,这样我就完全不用管环境配置问题啦~

      主要的玩点在于HIFI双核DSP跟0.25TOPs的AIPU核,但是这两个目前都没法用啊,这部分希望尽快解决呀~后面的语音+图像模型部署还等着上呢~我总不能跑在算力10几个GFLOPs的A53核上 吧~

      文档开放的不够全面,比如AIPU的一系列开发文档(手动狗头)。
      呼~ 开篇总算水完啦~我这次是带着朋友一边做一边写的,根据朋友的建议,特意把某些地方写的很繁琐,希望大家不要嫌弃呀~下次见,掰掰~

      1 Reply Last reply Reply Quote Share 0
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策