<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[探游·R329·AI部署实战（一）]]></title><description><![CDATA[<p dir="auto">原文链接：<a href="https://aijishu.com/a/1060000000190639" target="_blank" rel="noopener noreferrer nofollow ugc">https://aijishu.com/a/1060000000190639</a></p>
<p dir="auto"><strong><strong><strong><strong>1. 先提个纲</strong></strong></strong></strong><br />
今天上手一块板子：R329 EVB板。</p>
<p dir="auto">R329来自国产芯片厂商全志科技，定位是智能语音芯片。<br />
其上一代产品是R328，19年用在了很多智能语音产品上，比如天猫精灵、百度语音助手等。<br />
为什么能用进去？大致可以认为是功耗低、价格低、性能够用、产品阔以（绝不不是因为前东家所以才夸~）。</p>
<p dir="auto">在2020年，全志推出了新一代的R329，主打的是更优功耗，更高性能，更高性价比，其次的亮点是里面的Arm china 0.256T AIPU，双核DSP HIFI，这我刚拿到了开发板r329_evb5_v1，就迫不及待地上手了~</p>
<p dir="auto">上手之前我稍微构思了下，觉得应该做成系列记录教程，由浅入深地记录我的开发过程，让工程能力偏弱的算法工程师也能跟着一步步看懂，然后上手部署实践。</p>
<p dir="auto">于是我就想着以我朋友（接近新手）的视角来玩这块板子，分为三个阶段，上手阶段，应用阶段，魔改阶段。</p>
<p dir="auto"><strong>上手阶段：</strong><br />
就是从一开始的板子上电，接线，搭开发环境、看文档、配置编译内核等等，总之是板子跑起来，为后续的开发做准备；</p>
<p dir="auto"><strong>应用阶段：</strong><br />
我们尝试交叉编译过程，移植深度学习推理框架（如NCNN，TNN等），使用zhouyi AIPU跑深度学习模型，使用双核DSP做回声消除等等，最终的目的是跑一个语音模型实现关键词唤醒，跑yolo实现目标检测功能，咱先实现功能，性能、精度调优留到第三步。</p>
<p dir="auto"><strong>魔改阶段：</strong><br />
这个阶段，我们越过应用者视角，进入精英开发者视角，就NPU、CPU的硬件特点进行深入hack，了解分析底层的硬件原理，知道每一条指令跑在硬件的哪个部分，知道在任一时刻，该指令出现在哪个地方哪个阶段；深入的剖析AI模型部署的方方面面，比如AI算法优化啊、量化分析啊，算子性能优化啊，性能分析啊等等，总之我觉得这部分是最有意思的。</p>
<p dir="auto"><strong>2. 上手篇·新手级记录过程</strong><br />
首先，你得拿到板子对吧，怎么拿？</p>
<p dir="auto">要么淘宝买，要么申请试用（下阶段的试用申请可以私信我了解哟）！</p>
<p dir="auto">板子拿到了，我相信你跟我朋友（没接触过嵌入式有AI基本了解的某一线大厂算法工程师，简称朋友）一样有这样的疑问？</p>
<p dir="auto">“这块板子能干啥？”</p>
<p dir="auto">我想了下，这么回的：</p>
<p dir="auto">“你用过智能音箱没？百度的小度、小米的小爱，阿里的天猫精灵等等，你语音一叫它就答应，还能语音互动；你去吃海底捞的时候，会发现一个端菜的机器人对吧，这种机器人可以分辨行人、桌子、菜品，你挡住它道了还会跟你battle；刚刚所说的那些产品 那些功能都是这样的板子实现的，具体来说就是在板子上跑了深度学习语音模型、图像模型比如KWS，YOLO啊啥的。”</p>
<p dir="auto">解决了朋友的能干啥的疑问之后，我问了下朋友：</p>
<p dir="auto">“从你的角度来看，你觉得应该要有哪些资源以及知识才可把板子跑起来？然后把AI模型部署上去实现上面说的那些功能？”</p>
<p dir="auto">朋友回答说：</p>
<p dir="auto">“。。。我还是之前在大学的时候接触过嵌入式，现在基本都忘了，我也不太清楚了呀，你突然这么一问，现在完全是懵的呀~”</p>
<p dir="auto">也对，其实也理解，边缘嵌入式端模型工程部署是伴随着AI的发展而蓬勃兴起的，17年左右开始发展，在19年到达顶峰，目前已趋于平缓；而原来学校阶段基本教的都是嵌入式的基础知识，毕竟那时候AI还没火起来呢，现在相当于在原来的嵌入式基础上加入了AI的相关属性，因此 一部分的嵌入式工程师学习深度学习的知识，或者新晋的深度学习算法工程师学习嵌入式知识，从而就衍生了边缘端部署优化工程师的岗位，属于一个偏小众的领域。</p>
<p dir="auto">这一顿battle之后，就得吃中饭了，先去吃饭先~好好做个干饭人~拜拜~</p>
<p dir="auto">俺回来啦~开整开整~~~~~~睡午觉~</p>
<p dir="auto">。。。。。。</p>
<p dir="auto">（下次再也不能在周末睡午觉了，比较费钱，刚吃完午饭又得吃晚饭了。。。）</p>
<p dir="auto">好在不饿，先开个箱吧~<br />
<img src="/assets/uploads/files/1616547612285-05536354-a42c-4191-8fa9-6fa05f209fc9-image.png" alt="05536354-a42c-4191-8fa9-6fa05f209fc9-image.png" class=" img-responsive img-markdown" width="796" height="465" /></p>
<p dir="auto"><img src="/assets/uploads/files/1616548767042-c78166f0-b545-4157-9d5e-cccb46031047-image.png" alt="c78166f0-b545-4157-9d5e-cccb46031047-image.png" class=" img-responsive img-markdown" width="735" height="413" /></p>
<p dir="auto"><img src="/assets/uploads/files/1616548808021-fdacdecc-fb47-4dae-a375-c4c0cd0d8490-image.png" alt="fdacdecc-fb47-4dae-a375-c4c0cd0d8490-image.png" class=" img-responsive img-markdown" width="1245" height="651" /></p>
<p dir="auto"><img src="/assets/uploads/files/1616548838840-375fda22-4f76-41a4-b740-58395276639a-image.png" alt="375fda22-4f76-41a4-b740-58395276639a-image.png" class=" img-responsive img-markdown" width="1440" height="1080" /><br />
上电后，灯亮了，就知道硬件没啥大问题了，接下来开始准备软件环境。</p>
<p dir="auto">板子的通信接口有两种一种是adb连接，一种是串口连接，我们作为开发者，两个都得配好。</p>
<p dir="auto">第一步先装驱动，在http://netstorage.allwinnertech.com:5000/sharing/dsn8IbX8s链接下载驱动，然后在压缩包路径：<br />
<img src="/assets/uploads/files/1616548876591-6d4bbf40-ec5b-491b-ade8-80f8b21b87a4-image.png" alt="6d4bbf40-ec5b-491b-ade8-80f8b21b87a4-image.png" class=" img-responsive img-markdown" width="1332" height="245" /></p>
<p dir="auto">分别安装驱动，安装完后记得重启哟~</p>
<p dir="auto">按照官网的教程（<a href="https://r329.docs.allwinnertech.com/zh_CN/latest/devboardstudy/r329evb5compile/%EF%BC%89%E6%9D%A5%E9%85%8D%E7%BD%AE%E5%95%A5%E9%97%AE%E9%A2%98%E4%B9%9F%E6%B2%A1%E6%9C%89%EF%BC%8C" target="_blank" rel="noopener noreferrer nofollow ugc">https://r329.docs.allwinnertech.com/zh_CN/latest/devboardstudy/r329evb5compile/）来配置啥问题也没有，</a></p>
<p dir="auto"><img src="/assets/uploads/files/1616548900556-e0c849a6-e326-4395-a4ee-03afe132c959-image.png" alt="e0c849a6-e326-4395-a4ee-03afe132c959-image.png" class=" img-responsive img-markdown" width="1440" height="1080" /></p>
<p dir="auto"><img src="/assets/uploads/files/1616548942160-556a8f71-8e53-4765-8701-9dd3d6a81bf8-image-resized.png" alt="556a8f71-8e53-4765-8701-9dd3d6a81bf8-image.png" class=" img-responsive img-markdown" /><br />
好了，到此可以知道板子是好的了，而且也知道板子是预先烧录好了固件的。</p>
<p dir="auto">此时我们按照教程去点灯也没啥问题：<br />
<img src="/assets/uploads/files/1616548972948-6c9d4343-c36b-4e88-8ecf-9401bd1ccb80-image.png" alt="6c9d4343-c36b-4e88-8ecf-9401bd1ccb80-image.png" class=" img-responsive img-markdown" width="1788" height="1340" /></p>
<p dir="auto">于是去测一下麦克风，在板子上测得数据，然后adb pull到电脑上听一下效果，一开始用arecord指令出来很大电流声，指定参数如下图所示就声音正常了。</p>
<p dir="auto"><img src="/assets/uploads/files/1616549006460-18c8292f-2516-4195-aaca-15e0d2f5ade4-image.png" alt="18c8292f-2516-4195-aaca-15e0d2f5ade4-image.png" class=" img-responsive img-markdown" width="1305" height="622" /></p>
<p dir="auto">可以看到，在三通道下是ok的，听上去也挺清晰的。<br />
<img src="/assets/uploads/files/1616549036438-82af9545-c985-40ad-bdd2-5d61caf987d6-image-resized.png" alt="82af9545-c985-40ad-bdd2-5d61caf987d6-image.png" class=" img-responsive img-markdown" /></p>
<p dir="auto">对应的单通道下也是ok的(低音沉~高音丽~！[狗头])<br />
<img src="/assets/uploads/files/1616549074642-e58dd234-3d19-4729-a27a-7c9bc8445f28-image-resized.png" alt="e58dd234-3d19-4729-a27a-7c9bc8445f28-image.png" class=" img-responsive img-markdown" /></p>
<p dir="auto"><strong>2. 编译固件和烧写固件部分</strong><br />
我们要烧录固件，得先有源码，于是先去搞源码。</p>
<p dir="auto">此时你得去全志的客户服务平台（<a href="https://open.allwinnertech.com/#/dashboard?menuID=1%EF%BC%89%E7%94%B3%E8%AF%B7%E4%B8%80%E4%B8%AA%E8%B4%A6%E5%8F%B7%EF%BC%8C%E7%84%B6%E5%90%8E%E8%AE%A9%E5%AE%98%E6%96%B9%E7%BB%99%E4%BD%A0%E5%BC%80%E9%80%9A%E4%BB%A3%E7%A0%81%E6%9D%83%E9%99%90%EF%BC%8C%E5%BC%80%E5%A5%BD%E5%90%8E%E5%B0%B1%E4%BC%9A%E5%8F%91%E4%B8%AA%E9%82%AE%E4%BB%B6%E7%BB%99%E4%BD%A0%EF%BC%9A" target="_blank" rel="noopener noreferrer nofollow ugc">https://open.allwinnertech.com/#/dashboard?menuID=1）申请一个账号，然后让官方给你开通代码权限，开好后就会发个邮件给你：</a><br />
<img src="/assets/uploads/files/1616549106602-2540e168-07fd-409a-93d3-3df50a61cc6a-image.png" alt="2540e168-07fd-409a-93d3-3df50a61cc6a-image.png" class=" img-responsive img-markdown" width="1527" height="1598" /></p>
<p dir="auto">此时按照SDK下载方法一步步执行就好啦~</p>
<p dir="auto">然后你可以开始下代码啦，但此时你发现不知道宿主环境是啥？</p>
<p dir="auto">找到文档《Tina Linux 系统软件 开发指南》<br />
<img src="/assets/uploads/files/1616549140918-1f83c7ab-8853-4daf-ae5d-35ff9a8f31df-image.png" alt="1f83c7ab-8853-4daf-ae5d-35ff9a8f31df-image.png" class=" img-responsive img-markdown" width="1213" height="654" /></p>
<p dir="auto">于是知道了要在ubuntu14.04中进行开发，于是我便弄了个虚拟机跑ubuntu 14.04，这其中也碰到了一次问题，就是我下错版本了，下的是32bit版本，因此按照文档进行环境包安装的时候就进行不下去了，最后换为64bit系统就好了，这点也是文档没有明确指出的。</p>
<p dir="auto">好了，下载ubuntu.14.04 64bit系统镜像--&gt;下载虚拟机Vmware--&gt;安装ubuntu--&gt;按照文档(《Tina Linux 系统软件 开发指南》)安装环境。。。。。</p>
<p dir="auto">然后终于可以下代码啦~按照服务指导手册的提醒，一步步开始下代码啦~</p>
<p dir="auto">~~~~~~~~~~~~~~~<br />
································<br />
打个盹的功夫~<br />
································<br />
~~~~~~~~~~~~~~~</p>
<p dir="auto">好的，现在代码下载好了。</p>
<p dir="auto">我们接下来试一下编译固件烧录固件的流程：</p>
<p dir="auto">官网链接在这：<a href="https://r329.docs.allwinnertech.com/zh_CN/latest/devboardstudy/r329evb5compile/" target="_blank" rel="noopener noreferrer nofollow ugc">https://r329.docs.allwinnertech.com/zh_CN/latest/devboardstudy/r329evb5compile/</a></p>
<p dir="auto"><img src="/assets/uploads/files/1616549194110-ceb78869-5b0f-4943-b6e9-889c923444af-image.png" alt="ceb78869-5b0f-4943-b6e9-889c923444af-image.png" class=" img-responsive img-markdown" width="1413" height="891" /> 14.jpg</p>
<p dir="auto">直接按照官网的流程来（行文此时正在编译中），编完后烧录一下看有没有什么问题。。。。。</p>
<p dir="auto">A few years later……</p>
<p dir="auto"><img src="/assets/uploads/files/1616549231822-f31b977f-a3d1-434b-a4fd-76f4b7a4d1ae-image.png" alt="f31b977f-a3d1-434b-a4fd-76f4b7a4d1ae-image.png" class=" img-responsive img-markdown" width="1257" height="1072" /><br />
快了快了~<br />
。<br />
。<br />
。<br />
Finally~</p>
<p dir="auto">然后我们烧录下：<br />
<img src="/assets/uploads/files/1616549268281-2e5729a1-a692-44a2-a43f-56df5f24d7ab-image.png" alt="2e5729a1-a692-44a2-a43f-56df5f24d7ab-image.png" class=" img-responsive img-markdown" width="1379" height="1034" /><br />
然后上电，完美~</p>
<p dir="auto"><img src="/assets/uploads/files/1616549290682-72aab13f-9f93-4918-b05e-27d806d45b62-image.png" alt="72aab13f-9f93-4918-b05e-27d806d45b62-image.png" class=" img-responsive img-markdown" width="1430" height="776" /></p>
<p dir="auto">当然，上述过程中假如我们要编译内核支持AIPU驱动可以kernel_menuconfig 进行配置：<br />
<img src="/assets/uploads/files/1616549327522-42d86709-e959-45f7-b53b-d62b4697ac92-image-resized.png" alt="42d86709-e959-45f7-b53b-d62b4697ac92-image.png" class=" img-responsive img-markdown" /><br />
可以看到AIPU是默认驱动支持了的，但是在软件包配置部分：<br />
<img src="/assets/uploads/files/1616549369136-5ace472c-83c1-447a-bff9-88d254f56c5f-image.png" alt="5ace472c-83c1-447a-bff9-88d254f56c5f-image.png" class=" img-responsive img-markdown" width="1855" height="1128" /><br />
并没有提供支持，也就是说我们用不了哇，据了解是知识产权属于ARM china，全志这边并不能直接使用，需要原IP厂自己开放了；<br />
其次HIFI双核DSP部分也是不能直接使用的，因为版权属于科声讯，因此作为发烧开发者的我们，可玩性大大降低了！因此期待尽快释放AIPU、DSP部分资源出来呀~</p>
<p dir="auto">ok，此时整个流程都算走了一遍了，可以得到阶段性的结论： 板子是ok的，基本环境已搭建好~</p>
<p dir="auto"><strong>3. 交叉编译工具</strong><br />
这个时候我们下一步的探索就是交叉编译环境的确认了，我们只需要造个最简单的hello world函数，交叉编译后能在开发板上运行，</p>
<p dir="auto">我要在开发板上运行怎么弄呢？</p>
<p dir="auto">这个时候就是交叉编译 工具链出场了！啥？你问我啥叫交叉编译？为什么要有这个？</p>
<p dir="auto">嗯，我简单说，你开发机器是虚拟机里面的ubuntu，这里编译的代码只能在虚拟机ubuntu里面跑，但是现在我要移植到目标板R329的tina中去，因此新加一个中间层，我编译的时候选择某个特定的编译器，生成的代码可以直接在R329-tina中跑，这个特定的编译器就是交叉编译器。</p>
<p dir="auto">为什么要有这个？因为宿主机中开发方便很多啊~你要是开发板性能强到跟电脑主机一样了，各种环境也很完善了，那就不需要这么麻烦了呀，直接开发板上开发就完事了~</p>
<p dir="auto">好了，现在到实操了，官方文档这部分不是很详细，我把摸索的过程详尽写出来，希望能帮到后来者：</p>
<p dir="auto"><em><strong>第一步在宿主机造一个简单的helloworld.c</strong></em><br />
<img src="/assets/uploads/files/1616549436150-7967d22b-0cde-424d-81da-fc01bfbbe646-image.png" alt="7967d22b-0cde-424d-81da-fc01bfbbe646-image.png" class=" img-responsive img-markdown" width="1013" height="1130" /></p>
<p dir="auto">确保宿主机能正常运行。<br />
<img src="/assets/uploads/files/1616549472574-60a775cd-077b-4ffa-868f-a8fae50babf4-image.png" alt="60a775cd-077b-4ffa-868f-a8fae50babf4-image.png" class=" img-responsive img-markdown" width="1136" height="130" /></p>
<p dir="auto">第二步找到交叉编译工具，最新的在线文档，<a href="https://r329.docs.allwinnertech.com/zh_CN/latest/devboardstudy/r329evb5tina/#_4" target="_blank" rel="noopener noreferrer nofollow ugc">https://r329.docs.allwinnertech.com/zh_CN/latest/devboardstudy/r329evb5tina/#_4</a><br />
<img src="/assets/uploads/files/1616549514496-7a999db0-4c73-43b1-9947-4e1d264a2902-image.png" alt="7a999db0-4c73-43b1-9947-4e1d264a2902-image.png" class=" img-responsive img-markdown" width="1417" height="705" /><br />
我们的目标平台是arm，因此选择arm目录；<br />
目录内有glibc跟musl两套库，我咨询官方得知是musl库，于是我一路先择到：</p>
<p dir="auto">在该目录下编译hellworld.c函数，得到嵌入式平台下的目标文件helloworld22，经vmhgfs共享文件，再通过adb push helloworld22 /home/，送到板子上，此时运行发现：<br />
<img src="/assets/uploads/files/1616549784289-0c1c5559-591d-420f-acc3-43558d46daec-image.png" alt="0c1c5559-591d-420f-acc3-43558d46daec-image.png" class=" img-responsive img-markdown" width="776" height="188" /><br />
推测可能是：</p>
<p dir="auto">编译器版本的问题，编译内核的跟应用的而不一致，<br />
也有可能是因为宿主机是64bit的，而我们目标板的程序是32bit的（试了下aarch64也不行）。<br />
因此我们先用static编译顶一下：<br />
<img src="/assets/uploads/files/1616549580747-54873fa3-d35e-4061-bb1b-6d11091ece93-image-resized.png" alt="54873fa3-d35e-4061-bb1b-6d11091ece93-image.png" class=" img-responsive img-markdown" /></p>
<p dir="auto">哇~久违的hello world啊~（我们技术渣就是这样的啦，一点点东西就很开心了~）<br />
<img src="/assets/uploads/files/1616549601888-400493ed-a383-4765-af20-55f7696c0574-image.png" alt="400493ed-a383-4765-af20-55f7696c0574-image.png" class=" img-responsive img-markdown" width="755" height="180" /><br />
至此，整个流程算是跑通啦~</p>
<p dir="auto"><strong>小结一下：</strong></p>
<p dir="auto">文档还是有一些盲区的，对于一些新手朋友不是很友好，建议直接上docker啊，这样我就完全不用管环境配置问题啦~</p>
<p dir="auto">主要的玩点在于HIFI双核DSP跟0.25TOPs的AIPU核，但是这两个目前都没法用啊，这部分希望尽快解决呀~后面的语音+图像模型部署还等着上呢~我总不能跑在算力10几个GFLOPs的A53核上 吧~</p>
<p dir="auto">文档开放的不够全面，比如AIPU的一系列开发文档（手动狗头）。<br />
呼~ 开篇总算水完啦~我这次是带着朋友一边做一边写的，根据朋友的建议，特意把某些地方写的很繁琐，希望大家不要嫌弃呀~下次见，掰掰~</p>
]]></description><link>https://bbs.aw-ol.com/topic/13/探游-r329-ai部署实战-一</link><generator>RSS for Node</generator><lastBuildDate>Wed, 13 May 2026 03:43:43 GMT</lastBuildDate><atom:link href="https://bbs.aw-ol.com/topic/13.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Mar 2021 01:41:00 GMT</pubDate><ttl>60</ttl></channel></rss>