RUHMI從入門到實戰
10分鐘搞定!RUHMI讓RA8P1
跑起你的第一個AI模型
作為第一篇,本文的目標很直接:先讓模型真正跑起來。我們將以瑞薩EK-RA8P1開發板為載體,使用RUHMI完成模型轉換、代碼生成和上板推理驗證,并通過CPU與NPU兩種運行模式的對比,直觀看到Ethos-U55帶來的加速效果。
(更完整的工具說明可參考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官方倉庫鏈接。
打開e2studio中的AI Navi,選擇下圖中的”Use Your Project & AI Model”,并選擇模型部署的目標工程名。

點擊可查看大圖

點擊可查看大圖
通過”Use AI Model on Your PC”,導入需要部署的模型。

點擊可查看大圖
確保圖片中右邊工程名正確,點擊左側的Convert AI Model。

點擊可查看大圖
點擊”Convert”,進行轉換設置的參數設置。

點擊可查看大圖
按照下圖設置,進行配置。點擊Next。注意Input model file所需模型文件,使用右邊的Browse導入。

點擊可查看大圖
mnist_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


點擊可查看大圖
按照下圖設置后,點擊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獨立完成,不存在NPU?CPU切換開銷。
神經網絡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\r\n", i,output_ptr[i]);if(output_ptr[i]==0xFF){result = i;SEGGER_RTT_printf(0, "recognized! idx is %d\r\n",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\r\n", cnt,output_buffer[cnt]);if(output_buffer[cnt]==0xFF){result = cnt;SEGGER_RTT_printf(0, "recognized! idx is %d\r\n",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使用,您可識別下方二維碼或復制鏈接至瀏覽器中打開下載)
https://ramcu-cn.oss-cn-shenzhen.aliyuncs.com/0A_test/RA8P1%20RUHMI%20MNIST%E5%8F%82%E8%80%83%E5%B7%A5%E7%A8%8B.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是否真正發揮作用。
如您在使用瑞薩MCU/MPU產品中有任何問題,可識別下方二維碼或復制網址到瀏覽器中打開,進入瑞薩MCU/MPU官方技術論壇尋找答案或獲取在線技術支持。
https://bbs.21ic.com/renesas
未完待續
推薦閱讀
瑞薩嵌入式AI技術漫談 · 實驗室模型與真實世界部署
瑞薩嵌入式AI技術漫談 · 信號處理場景的AI-as-a-Service
瑞薩嵌入式AI技術漫談 · 面向信號數據的機器學習方法

