/ ai资讯

瑞萨RA8P1嵌入式AI开发四部曲之一:RUHMI框架

发布时间:2026-08-17 11:46:08

RUHMI从入门到实战

10分钟搞定!RUHMI让RA8P1跑起你的第一个AI模型

作为第一篇,本文的目标很直接:先让模型真正跑起来。我们将以瑞萨EK-RA8P1开发板为载体,使用RUHMI完成模型转换、代码生成和上板推理验证,并通过CPU与NPU两种运行模式的对比,直观看到Ethos-U55带来的加速效果。

(更完整的工具说明可参考RUHMI官方仓库,您可识别下方二维码或复制链接至浏览器中打开查阅)

RUHMI官方仓库

https://github.com/renesas/ruhmi-framework-mcu

RUHMI框架简介

简单来说,RUHMI就像是一条面向嵌入式AI部署的“自动化产线”。我们只需要把训练好的TFLite或ONNX模型交给它,模型解析器(Model Importer/Parser)会先把模型转换成统一的中间表示(Intermediate Representation);接着,模型优化器(Model Optimizer)会继续做量化、微调、剪枝等优化,比如把FP32模型压到更适合MCU运行的INT8格式;最后,RUHMI会根据硬件能力自动判断哪些计算可以交给NPU加速,哪些算子会发生CPU fallback(CPU fallback指的是把NPU不支持的算子,回退到CPU上),并生成对应的软件代码或可执行二进制文件。也就是说,它尽量打通了从“模型文件”到“RA8P1可运行部署产物”的完整链路。

点击可查看大图

RUHMI安装准备:先把开发环境搭起来

安装RUHMI前,需要先准备好Python环境和对应平台的MERA wheel包。需要注意的是,安装包或文件名中出现的MERA并不是另一个独立工具,而是RUHMI AI MCU编译器中集成的核心编译引擎。

安装准备要点

建议优先使用官方仓库中的安装说明,并根据自己的系统选择Linux或Windows路径。

实际安装时重点关注三件事:

使用匹配的Python版本

安装对应平台的MERA wheel包

通过import mera确认安装是否成功。

(如果需要完整命令,可参考官方安装目录,您可识别下方二维码或复制链接至浏览器中打开查阅)

官方安装目录

https://github.com/renesas/ruhmi-framework-mcu/tree/main/install

MERA Visualizer是可视化工具,提供交互式Web界面,可用于查看设备兼容性(模型划分情况)以及相关性能指标。

(有关使用的更多信息,您可识别下方二维码或复制链接至浏览器中打开查阅)

更多信息

https://github.com/renesas/ruhmi-framework-mcu/tree/main/install

点击可查看大图

模型文件训练和工程创建

模型训练、量化和工程创建过程不是本文重点,本文将直接从已准备好的量化模型和目标工程开始,聚焦RUHMI的模型转换与部署流程。

模型编译与部署流程

RUHMI支持两种方式转换模型文件。

GUI图形方式:上手简单、界面直观,适合快速完成模型转换与部署。

点击可查看大图

CLI命令行方式:灵活度更高,适合脚本化流程、自动化集成,以及与VS Code等开发工具配合使用。

点击可查看大图

本文仅介绍GUI图形方式。CLI命令行方式,请参考文章开头提及到的RUHMI的GitHub官方仓库链接。

1打开e2studio中的AI Navi,选择下图中的”Use Your Project & AI Model”,并选择模型部署的目标工程名。

点击可查看大图

点击可查看大图

2通过”Use AI Model on Your PC”,导入需要部署的模型。

点击可查看大图

3确保图片中右边工程名正确,点击左侧的Convert AI Model。

点击可查看大图

4点击”Convert”,进行转换设置的参数设置。

点击可查看大图

5按照下图设置,进行配置。点击Next。注意Input model file所需模型文件,使用右边的Browse导入。

点击可查看大图

6mnist_quant.tflite是已经量化过的模型,所以在Quantization result处显示“A quantized model has been loaded.”,点击Next。

(如果导入的是非量化的模型,量化操作您可识别下方二维码或复制链接至浏览器中打开查阅)

量化操作

https://tool-support.renesas.com/tool-support/Zoo/guides/help/conversion_tool/conversion_tool_windows_main.html#view2

点击可查看大图

7按照下图设置后,点击Start conversion,等待代码生成。

Option settings解释如下:

Optimize mode(优化模式):

Performance(性能):(默认)优化为最大化性能。

Size(大小):优化为最小RAM使用量。

Memory mode(内存模式):

Sram_Only:(默认)当权重放置在片内ROM时选择。

Shared_Sram:当权重放置在片外ROM时选择。

Use only CPU(仅使用CPU):

未勾选:使用Ethos-U55 NPU和CPU协同执行推理。(默认)

已勾选:生成CPU-only版本,仅使用CPU执行推理。

Weight location(权重存放位置,仅在使用CPU时适用):

·ROM:(默认)神经网络权重数据存储在ROM中。

·RAM:神经网络权重数据存储在RAM中。

点击可查看大图

模型转换完成后,在Console界面会显示如下信息,表示转换成功。

显示模型占用的RAM和ROM空间。

模型算子的映射情况,包括哪些算子运行在NPU上,哪些算子发生CPU fallback(回退到CPU执行)。

本例中,模型中的39个算子,全部100%转换成部署到NPU上的算子。推理完全由NPU独立完成,不存在NPUCPU切换开销。

神经网络MAC值。

模型转换成功提示信息。

点击可查看大图

conversion_results/converted/build/MCU/compilation/src文件夹下是转换的模型代码。

注意,NPU版本和CPU-only版本生成的代码内容会有所不同。如下所示:

NPU版本的模型转换代码

CPU-only版本的模型转换代码

mnist_inference_npu是推理的核心代码,主要完成以下工作:

将sample_images数组中的图像拷贝到模型输入缓冲区。Optimize mode(优化模式):

左右滑动查看完整内容

 memcpy(GetModelInputPtr_serving_default_input_1_0(), sample_images[2], model_serving_default_input_1_0_SIZE);

重置计数器并记录起始时间,调用RunModel同步执行推理,记录结束时间并计算耗时(以周期数),通过RTT打印耗时。

左右滑动查看完整内容

 TimeCounter_CountReset();
  g_dwt_start_0 =TimeCounter_CurrentCountGet();
 RunModel(false);

invalidate(使失效)是把CPU数据缓存(D-cache)中指定地址范围的缓存行标记为“无效”,这样下一次CPU访问这些地址时会直接从主内存读取最新数据,而不是使用已失效的缓存副本。

为什么需要:当外设(例如NPU、DMA)直接写内存(绕过CPU缓存)后,CPU的D-cache可能仍保留旧数据。为了让CPU读到外设写入的新数据,需要先invalidate相关缓存行。如果不调用该指令,会发现全速运行的AI推理结果和单步调试的AI推理结果不一致。

左右滑动查看完整内容

 invalidate_dcache_range((void*)output_ptr,10);

获取模型输出指针,遍历前10个输出并打印每个值;若某个输出值等于0xFF,则把该索引记为识别结果并打印“recognized”信息。

左右滑动查看完整内容

  output_ptr=GetModelOutputPtr_StatefulPartitionedCall_0_70018();
 for(i=0; i< 10; i  ) {
        SEGGER_RTT_printf(0, "Output %d: %d
", i,output_ptr[i]);
        if(output_ptr[i]==0xFF)
        {
            result = i;
            SEGGER_RTT_printf(0, "recognized! idx is %d
",i);
        }
    }

调用print_digi(result)在RTT上以像素形式打印识别到的数字。

左右滑动查看完整内容

  print_digi(result);

mnist_inference_cpu是推理的核心代码,主要完成以下工作:

将sample_images数组中的图像拷贝到模型输入缓冲区。

左右滑动查看完整内容

 memcpy(input_buffer, p,28*28);

重置计数器并记录起始时间,调用RunModel同步执行推理,记录结束时间并计算耗时(以周期数),通过RTT打印耗时。

左右滑动查看完整内容

  TimeCounter_CountReset();
  g_dwt_start_0 = TimeCounter_CurrentCountGet();
  compute_sub_0000(compute_buffer, input_buffer, output_buffer);

遍历前10个输出并打印每个值;若某个输出值等于0xFF,则把该索引记为识别结果并打印“recognized”信息。

左右滑动查看完整内容

 for(cnt=0; cnt< 10; cnt  )
    {
        SEGGER_RTT_printf(0, "Output %d: %d
", cnt,output_buffer[cnt]);
        if(output_buffer[cnt]==0xFF)
        {
            result = cnt;
            SEGGER_RTT_printf(0, "recognized! idx is %d
",result);
        }

调用print_digi(result)在RTT上以像素形式打印识别到的数字。

左右滑动查看完整内容

  print_digi(result);

完成CPU-only和NPU两种推理代码的集成后,下一步,我们不仅需要关注程序是否能运行,还需要同时回答两个问题:第一,模型输出是否正确;第二,NPU版本相比CPU-only版本是否真正带来了性能收益。因此,性能测试章节会把结果验证和耗时对比放在一起分析。

推理结果验证与性能测试

下图展示了同一MNIST模型在两种运行模式下的实际输出。左侧为CPU Ethos-U55 NPU(本例中,算子全部放到NPU上运行)推理结果,右侧为CPU-only推理结果。只有在两者识别结果一致的前提下,后续的推理时间对比才有意义。

CPU Ethos-U55 NPU

推理结果

CPU-only推理结果

在确认输出结果正确后,再对比两种模式的推理耗时。这里的目的不是给出绝对性能结论,而是建立一个清晰的基线:同一个模型、同一个输入、同一套工程中,启用NPU之后是否能明显降低推理延迟。

推理模式 MNIST 推理时间(参考1cycle=1纳秒)
CPU Ethos-U55 NPU
左上图
~20us(约10倍提升)
纯CPU(Cortex-M85 @1GHz)右上图 ~200us

需要注意的是,MNIST模型结构较简单、输入尺寸较小,因此这组测试更适合作为“功能验证 加速链路确认”的示例,而不是代表RA8P1 NPU的完整性能上限。对于卷积层更多、计算量更大的视觉AI模型,Ethos-U55的加速优势通常会更加明显。

(上面提到的RA8P1 MNIST e2studio工程文件。注意:配合e2studio 2026.04.2 FSP 6.5.0使用,您可识别下方二维码或复制链接至浏览器中打开下载

RA8P1 MNISTe2studio工程文件

https://ramcu-cn.oss-cn-shenzhen.aliyuncs.com/0A_test/RA8P1 RUHMI MNIST参考工程.zip

为了更直观地理解NPU在真实视觉AI场景中的价值,可以再参考RUHMI官方RA8P1例程中的测试数据。相比MNIST这类小模型,面部检测和图像分类等模型更能体现Ethos-U55在卷积密集型计算中的优势。

应用场景 模型 NPU推理时间 CPU推理时间 加速
效果
Face Detection(面部识别) Yolo-fastest 4ms 74ms 约18.5倍
Image Classification(图像分类) MobileNetV1 2ms 50ms 约25倍

从上表可以看到,在这些更接近真实视觉应用的例程中,启用Ethos-U55 NPU后,相比纯CPU推理可以获得约18到25倍的性能提升。这也说明,CPU-only与NPU版本的对比不仅能验证模型是否跑通,更能帮助工程师判断NPU加速链路是否真正生效。

常见问题与调试方法

(常见问题与算子支持您可识别下方二维码或复制链接至浏览器中打开查阅)

常见问题

ruhmi-framework-mcu/docs/known_issues at main · renesas/ruhmi-framework-mcu

算子支持

https://github.com/renesas/ruhmi-framework-mcu/blob/main/docs/operator_support.md

小结

至此,我们已经完成了从RUHMI环境准备、模型转换到上板推理验证的完整闭环。第一篇重点解决“模型如何跑起来”的问题。

下一篇将进入Arm Vela,进一步分析模型如何被编译到Ethos-U55 NPU上,以及如何通过算子映射、内存模式和性能报告来判断NPU是否真正发挥作用。

  • 嵌入式 嵌入式 关注

    关注

    5220

    文章

    21115

    浏览量

    346028

免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。

如有疑问请发送邮件至:bangqikeconnect@gmail.com