1. 项目概述与国产化背景
最近几年,国产芯片的崛起已经从一个行业愿景,变成了我们这些嵌入式开发者触手可及的现实。从消费电子到工业控制,再到汽车和商显领域,国产SoC(片上系统)的性能和生态正在快速追赶,甚至在某些特定场景下已经具备了独特的优势。这次我拿到手的米尔电子MYD-YD9360商显板,就是一颗典型的“国产芯”——它基于芯驰科技(SemiDrive)的D9系列高性能车规级处理器。虽然定位是商显,但其内置的双核Cortex-A55加上一个实时核Cortex-R5的异构架构,以及集成的神经网络处理单元(NPU),让它具备了探索边缘AI应用的潜力。
我这次测评的核心,就是想看看在这块国产开发板上,运行轻量级AI模型的实际体验如何。选择的工具是TinyMaix,一个号称能在任意单片机上跑神经网络的超轻量级推理库。这个组合很有意思:一边是追求高性能、高集成度的国产商规/车规芯片,另一边是极致追求轻量化、低功耗的TinyML推理框架。把它们放在一起,不是为了“炫技”,而是想实实在在地验证一个路径:在国产硬件平台上,从零开始搭建一个可用的、高效的AI推理环境,到底顺不顺手?会遇到哪些坑?最终的效能是否符合预期?这或许是很多正在考虑或已经使用国产平台的工程师最关心的问题。
2. 硬件平台深度解析:米尔MYD-YD9360与芯驰D9
在开始软件折腾之前,我们有必要先吃透手里的硬件。米尔电子MYD-YD9360是一块标准的商显开发板,但其核心的芯驰D9处理器来头不小。
2.1 芯驰D9处理器核心架构
芯驰D9系列属于车规级芯片,这意味着它在设计之初就考虑了严苛的环境可靠性、长期稳定性和功能安全。用在商显板上,可以说是“大材小用”,但也因此带来了极高的稳定性保障。其核心架构是典型的异构多核:
- 双核ARM Cortex-A55 @ 1.2GHz:这是主要的应用处理核心,负责运行Linux操作系统、图形界面、业务逻辑以及我们今天的AI推理主程序。A55是ARM的“高效”核心,在性能和功耗之间取得了很好的平衡。
- 单核ARM Cortex-R5 @ 800MHz:这是一个实时核,通常用于运行实时操作系统(RTOS),处理对时序要求极其严格的任务,如CAN总线通信、电机控制等。在本次纯Linux环境的AI推理测试中,R5核并未被主动使用,但它揭示了该平台在复杂系统(如车载信息娱乐系统+车身控制)中的潜力。
- 神经网络处理单元(NPU):这是AI加速的关键。根据公开资料,D9集成的NPU能提供约0.5 TOPS(每秒万亿次操作)的算力。虽然这个数字与旗舰手机芯片动辄十几TOPS的算力无法相比,但对于TinyMaix所面向的轻量级模型(如MobileNet, MNIST)来说,是完全够用甚至绰绰有余的。关键在于,如何通过软件栈调用它。
注意:很多国产芯片的NPU驱动和编程模型处于快速迭代期,文档和示例可能不如主流平台(如ARM NN, TensorFlow Lite for Microcontrollers)完善。这是评估国产AI平台时必须考虑的成本。
2.2 米尔MYD-YD9360开发板外围配置
米尔作为老牌的嵌入式方案提供商,其开发板做工和配套资源一向比较扎实。MYD-YD9360板载资源对于AI原型开发非常友好:
- 内存:2GB LPDDR4,足够流畅运行Linux和多个应用。
- 存储:16GB eMMC,用于存放系统镜像和用户程序。
- 显示接口:双路LVDS和MIPI-DSI,方便连接商显屏幕,这也是其“商显板”定位的体现。
- 丰富的扩展接口:包括千兆以太网、USB、CAN-FD、UART等,方便进行数据输入输出和系统联调。
- 操作系统支持:米尔提供了基于Yocto Project定制的Linux系统镜像,开箱即用,省去了自己移植BSP(板级支持包)的麻烦。
拿到板子后,我首先通过串口登录系统,查看了系统基本信息。内核版本、CPU信息、内存大小都与规格书一致,系统运行稳定。这为后续的软件环境搭建打下了良好的基础。
3. TinyMaix推理库:为单片机而生的AI轻骑兵
在硬件准备就绪后,我们来深入了解一下本次测试的软件主角——TinyMaix。它的Slogan“TinyML for All Microcontrollers”非常直白地表明了其野心和定位。
3.1 TinyMaix的设计哲学与技术特点
TinyMaix的设计目标是在资源极其有限的微控制器(MCU)上实现神经网络推理,其核心特点决定了它的技术路径:
- 无依赖:整个库采用纯C语言实现,不依赖任何第三方库(如libc, CMSIS-NN)。这意味着你可以把它移植到任何有C编译器的平台上,从8位的8051到32位的ARM Cortex-M系列,再到我们今天用的A55 Linux环境,理论上都可以运行。
- 极简内核:代码核心非常精简,专注于前向推理(Inference)。它不支持训练,模型需要通过其他框架(如TensorFlow, PyTorch)训练好后,再转换(Convert)为TinyMaix支持的格式。
- 低内存消耗:这是TinyMaix的立身之本。它通过一系列内存优化策略,如原位计算(In-place Computation)、内存池、以及针对超小模型的特殊层融合技术,将运行时对RAM的需求压到最低,甚至可以在只有几十KB RAM的MCU上运行模型。
- 支持多种加速:虽然核心是纯C的便携实现,但TinyMaix也提供了针对特定硬件平台的加速接口。例如,对于ARM Cortex-M系列,它可以调用CMSIS-NN库;对于带有SIMD指令集(如ARM NEON)的处理器,它也有相应的优化路径。这为在像D9这样的A核处理器上获得更好性能提供了可能。
3.2 TinyMaix的模型支持与工作流程
TinyMaix目前主要支持以下几种经典的轻量级网络结构,非常适合边缘设备:
- 全连接网络(FCN):用于MNIST手写数字识别这类简单分类任务。
- 轻量级卷积神经网络:如MobileNet, SqueezeNet, 用于图像分类。
- 支持的基本层:卷积(Conv)、深度可分离卷积(Depthwise Conv)、全连接(Fully Connected)、池化(Pooling)、激活函数(ReLU, Softmax)等。
其标准的工作流程分为离线和在线两部分:
- 离线训练与转换:在PC上使用主流的深度学习框架(如TensorFlow)训练你的模型。然后,使用TinyMaix提供的转换工具(
tmConvert),将训练好的模型(通常是.tflite或.onnx格式)转换为TinyMaix专属的.tm模型文件。这个转换过程会进行模型量化、结构简化等优化。 - 在线部署与推理:将转换好的
.tm模型文件、待推理的数据(如图片)以及TinyMaix的源码一起,编译进你的嵌入式应用程序中。程序运行时,调用TinyMaix的API加载模型、输入数据,并执行推理,最后输出结果。
4. 开发环境搭建与踩坑实录
在国产平台上做开发,环境搭建往往是第一道坎。米尔提供的系统镜像已经比较完善,但为了编译TinyMaix,我们还需要准备一些基础工具链。
4.1 基础工具链确认
通过SSH登录到MYD-YD9360板卡的Linux系统后,第一件事就是检查编译环境。
# 查看CMake版本,用于构建项目 cmake --version # 输出:cmake version 3.10.2 # 查看Make版本,用于执行编译 make --version # 输出:GNU Make 4.1版本符合要求。这里有一个关键点:板卡系统自带的GCC编译器是用于在板卡本身进行本地编译(Native Compilation)的。也就是说,我们将在ARM架构的板卡上直接编译ARM架构的程序,无需交叉编译工具链。这简化了流程,但编译速度会比在x86 PC上交叉编译慢一些。
4.2 获取TinyMaix源码
原计划是通过git clone直接从GitHub获取源码,但实际操作中遇到了网络连接不稳定的问题。这是开发者在接触开源项目时,尤其是在某些网络环境下,可能遇到的典型问题。
解决方案与实操心得: 我采用的是一种更稳妥的“曲线救国”方式:
- 在宿主机(PC)上下载:在能稳定访问GitHub的PC上,打开项目主页(
https://github.com/sipeed/TinyMaix),直接下载源码的ZIP压缩包(通常有“Download ZIP”按钮)。 - 传输到板卡:使用
scp命令或图形化的文件传输工具(如FileZilla),将ZIP包传输到板卡的某个目录下,例如/home/root/。这里有一个重要注意事项:尽量避免将源码放在需要特殊权限的系统目录(如/usr/src),以免在编译时出现权限错误。家目录或/tmp(临时性)是更安全的选择。 - 在板卡上解压:
cd /home/root unzip TinyMaix-master.zip cd TinyMaix-master
通过ls命令,可以看到TinyMaix的目录结构清晰,核心源码在src目录,示例在examples目录。
踩坑提醒:直接在线克隆失败时,不要反复尝试消耗时间。提前下载好源码包是一种高效可靠的方法。务必确认下载的是最新
main或master分支的代码,以保证示例和API的兼容性。
5. 核心示例测试与性能分析
环境就绪后,我们进入最核心的环节:运行TinyMaix自带的示例,直观感受其性能和效果。TinyMaix的examples目录下提供了多个经典示例,我们选取三个有代表性的进行测试。
5.1 MNIST手写数字识别测试
MNIST是机器学习领域的“Hello World”,它使用一个简单的全连接网络识别28x28像素的手写数字灰度图。
操作步骤详解:
- 进入示例目录:
cd /home/root/TinyMaix-master/examples/mnist - 创建并进入构建目录:这是一个保持源码整洁的好习惯,避免构建产生的中间文件污染源码目录。
mkdir build && cd build - 生成构建系统:
cmake ..命令会读取上一级目录(..)的CMakeLists.txt文件,生成适用于当前平台的Makefile。
输出信息会显示检查编译器、找到源码等过程,若无错误则成功。cmake .. - 编译项目:
编译成功后,会在当前makebuild目录下生成可执行文件mnist。 - 运行推理:
./mnist
运行结果与解读: 程序运行后,终端会打印出详细的日志信息。最关键的一行输出类似于:
Predict digit is: 7, prob=0.99, time=0.114 msPredict digit is: 7:模型识别出的数字是7。prob=0.99:模型认为该数字是7的置信度(概率)为99%,非常高。time=0.114 ms:这是本次推理消耗的总时间,仅为0.114毫秒。
性能分析: 这个速度非常快。MNIST模型本身极其简单,但0.1毫秒量级的推理时间,意味着即使在主频不高的处理器上,也能实现极高的帧率。这充分展示了TinyMaix在极简模型上的高效性。需要注意的是,这个示例默认使用的是纯C语言实现的通用内核(TM_ARCH_CPU),没有启用任何硬件加速指令(如NEON)。它完全依靠CPU的标量计算能力完成。
5.2 MBNet (MobileNet) 图像分类测试
MobileNet是谷歌为移动和嵌入式设备设计的轻量级卷积神经网络,比MNIST复杂得多,更能体现实战能力。TinyMaix示例中是一个精简版的MBNet。
操作步骤与代码微调:
- 进入示例目录:
cd /home/root/TinyMaix-master/examples/mbnet - (可选)审查并理解main.c:在编译前,我习惯先看一眼
main.c,了解它做了什么。这个示例会加载一张内置的96x96x3的RGB图片(一只猫),然后用模型进行分类。代码中已经包含了模型数据(以C数组形式硬编码)。 - 构建与运行:步骤与MNIST相同。
mkdir build && cd build cmake .. make ./mbnet
运行结果与解读: 输出信息会更丰富,会打印出网络每一层的输出形状,最后是分类结果和耗时:
... layer[5] out shape: 24,24,32 ... Predict class is: 282 (tiger cat), prob=0.12, time=16.615 msPredict class is: 282:模型识别为ImageNet类别中的第282类,对应“虎猫”。prob=0.12:置信度为12%。这并不高,因为示例图片可能不是标准的ImageNet训练集图片,且模型是精简版。但这验证了流程是通的。time=16.615 ms:关键数据!推理耗时约16.6毫秒。
深度性能分析: 16.6毫秒,换算成帧率大约是60 FPS。这个性能对于很多实时性要求不高的边缘视觉应用(如智能门禁、货架巡检)来说,已经非常不错了。它意味着在芯驰D9的A55核心上,仅用CPU进行浮点计算,就能以可观的速度运行一个轻量级卷积网络。
我们可以做一个粗略的算力估算:假设这个精简版MBNet有约0.1M(百万)的乘加运算(MACs)。16.6毫秒完成,那么算力大约是 0.1M MACs / 0.0166s ≈ 6.0 MMACs/s(每秒百万次乘加运算)。这远未达到A55核心的理论峰值(以1.2GHz计,标量浮点算力远超此数),瓶颈可能在于:
- 内存带宽:频繁的卷积操作需要大量的数据搬运。
- 缓存效率:纯C实现可能没有充分利用CPU缓存。
- 未使用SIMD:这是最大的潜力点。ARM Cortex-A55支持NEON SIMD指令集,可以单指令处理多个数据。如果TinyMaix启用了NEON优化,理论上性能能有数倍提升。
5.3 CIFAR-10测试与对比
CIFAR-10是一个包含10类物体(飞机、汽车、鸟等)的彩色小图像数据集,分辨率32x32。运行其示例的步骤与前两者完全一致。其模型复杂度介于MNIST和MBNet之间。
我实测的推理时间大约在2-3毫秒左右。这个结果进一步印证了性能与模型复杂度的正相关关系。我们可以将三个测试结果汇总如下:
| 测试模型 | 输入尺寸 | 模型复杂度 | 推理耗时 (D9 A55 @1.2GHz) | 近似帧率 (FPS) | 备注 |
|---|---|---|---|---|---|
| MNIST | 28x28x1 | 极低 (全连接) | ~0.114 ms | ~8770 | 纯C标量计算,性能过剩 |
| CIFAR-10 | 32x32x3 | 中等 (小型CNN) | ~2.5 ms | ~400 | 纯C标量计算,实时性极佳 |
| MBNet | 96x96x3 | 较高 (轻量级CNN) | ~16.6 ms | ~60 | 纯C标量计算,满足多数实时应用 |
从表格可以清晰看出,即使在未进行任何硬件加速优化的情况下,芯驰D9的CPU核心运行这些轻量级模型已经能取得非常实用的性能。MBNet的60 FPS,为后续启用NPU加速留下了巨大的想象空间和性能提升缓冲区。
6. 进阶探索:启用硬件加速的可能性与挑战
前面的测试都是基于TinyMaix的默认“CPU模式”。要充分发挥D9芯片的潜力,尤其是利用其NPU,我们需要进入更深入的探索阶段。
6.1 探索TinyMaix的加速接口
查阅TinyMaix的源码和文档,发现它已经为性能优化预留了架构抽象层。在src/tm_arch.h和tm_arch.c中,可以看到它通过TM_ARCH_宏来切换不同的后端实现:
TM_ARCH_CPU: 默认的纯C实现,通用但非最优。TM_ARCH_ARM_SIMD: 使用ARM SIMD指令(如NEON)的实现。TM_ARCH_ARM_NEON: 更具体的NEON实现。TM_ARCH_CMSIS_NN: 针对Cortex-M系列,使用ARM CMSIS-NN库。
尝试启用NEON加速: 我尝试在编译时通过定义宏来切换架构。修改examples/mbnet/CMakeLists.txt或在cmake命令中传递参数:
cd build # 尝试清除之前的构建 rm -rf * # 尝试定义宏进行构建 cmake -DTM_ARCH=ARM_SIMD .. make然而,编译过程中出现了错误。提示某些内联汇编或NEON intrinsic函数找不到。这是因为TinyMaix的ARM_SIMD实现可能针对Cortex-M系列的CMSIS-NN,或者其NEON代码路径在A55的Linux GCC环境下需要额外的适配。
实操心得:开源轻量级库为了保持极致的可移植性,其加速代码往往针对最常见的MCU环境(如Cortex-M)进行测试。在像A55这样运行完整Linux的处理器上,虽然指令集兼容,但编译器环境、内存模型、系统调用都有差异,直接使用可能会遇到问题。这需要开发者具备一定的底层调试和代码适配能力。
6.2 对接芯驰D9 NPU的远景与难点
这才是释放这块板子AI算力的终极目标。D9内置的NPU理论上能提供比CPU高一个数量级的能效比。但实现这一点,需要跨越几层障碍:
- 驱动层:首先需要确保Linux内核中已经加载并正确配置了NPU的驱动程序。这通常由芯片原厂(芯驰)或板卡供应商(米尔)提供。需要检查
/dev目录下是否有相关的设备节点(如/dev/npu0),或者通过dmesg | grep -i npu查看内核启动日志。 - 运行时库:NPU通常需要专门的运行时库(如芯驰可能提供的
libnpu.so)来管理任务调度、内存映射等。 - 模型转换与部署工具链:NPU对模型有特定要求,比如只支持特定算子(Operations)、要求量化到INT8精度等。需要将训练好的模型,通过芯驰提供的专用转换工具,转换成NPU能识别的格式。
- 与TinyMaix集成:这是最难的一步。需要为TinyMaix编写一个新的
TM_ARCH后端(例如TM_ARCH_SEMIDRIVE_NPU)。这个后端需要实现TinyMaix定义的算子接口,但在底层调用芯驰NPU的API来完成计算。
这个过程相当于为TinyMaix开发一个新的“硬件加速插件”,工作量不小,且严重依赖芯片厂商提供的SDK完善度和文档支持。
现阶段可行性方案: 对于大多数开发者,在D9上快速部署AI应用,更现实的路径可能是:
- 继续优化CPU版本:尝试修复或适配TinyMaix的NEON代码,争取在CPU上获得2-5倍的性能提升。
- 评估其他推理框架:查看芯驰官方是否对主流框架(如TensorFlow Lite, ONNX Runtime)有更好的NPU支持。这些框架生态更成熟,厂商提供后端支持的可能性更大。
- 使用厂商SDK:如果米尔或芯驰提供了完整的从模型转换到NPU推理的示例程序,那么最稳妥的方式是先遵循官方流程走通,然后再考虑将其集成到自己的应用框架中。
7. 项目总结与国产平台开发思考
经过这一轮从环境搭建、示例测试到加速探索的完整流程,我对在米尔芯驰D9平台上进行TinyML开发有了更立体的认识。
首先,从“可用性”角度来看,这个组合是完全可以跑通的。凭借芯驰D9足够的CPU算力和米尔稳定的Linux系统,运行TinyMaix的轻量级模型毫无压力,性能对于很多实际的边缘AI场景(如传感器数据分析、简单图像分类)已经足够。整个开发流程标准、清晰,没有遇到因“国产”二字带来的特殊障碍,这说明基础的软件生态是健全的。
其次,从“高效性”或“发挥硬件潜力”的角度看,还有很长的路要走。最大的挑战在于如何利用NPU这个专用加速器。这不仅仅是TinyMaix一个库的问题,而是整个国产AI芯片生态面临的共同课题:如何提供更易用、更标准化的软件栈(驱动、工具链、推理引擎)。对于开发者而言,在选型时就必须将“软件生态支持度”作为一个与技术参数同等重要的考量点。是选择硬件参数稍弱但软件生态(如ARM NN, TFLite)成熟的主流平台,还是选择硬件更强但需要更多自研适配工作的国产平台,需要根据项目周期、团队技术储备来权衡。
最后,给打算在类似国产平台上开发AI应用的工程师几点建议:
- 前期验证至关重要:在项目立项前,务必像本次测评一样,做一个最小可行性验证(PoC)。核心就是三件事:硬件驱动是否正常、基础推理框架能否运行、性能是否达标。这个阶段发现的任何问题,其解决成本都远低于项目中期。
- 拥抱“CPU兜底”方案:在NPU等加速器生态不完善的情况下,先将模型优化到能在CPU上以可接受的性能运行。这不仅能保证项目基本功能,也为后续接入加速器提供了一个可靠的性能基线和对标对象。
- 积极寻求原厂支持:遇到底层驱动、工具链问题时,第一时间通过供应商(如米尔)联系芯片原厂(芯驰)的技术支持。他们的内部资料和临时补丁往往是解决问题的捷径。
- 关注社区和开源:像TinyMaix这样的开源项目充满活力。可以关注其GitHub仓库的Issue和Pull Request,看看是否有其他开发者正在为类似平台做适配,甚至可以考虑贡献自己的代码。
国产芯片的进步有目共睹,尤其是在性能、集成度和特定场景的优化上。与之配套的软件和应用生态,则需要我们每一位开发者去使用、去反馈、去共同建设。这次将TinyMaix跑在芯驰D9上,算是一次小小的尝试,它证明了这条路径的可行性,也清晰地指出了下一步需要攻坚的方向。希望这篇详尽的实测记录,能为更多走在国产化替代和边缘AI创新路上的朋友,提供一份有价值的参考。