https://blog.tensorflowcn.cn/2020/06/running-and-testing-tf-lite-on-microcontrollers.html
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNqpsOjaGa86dxTWvDsRDn17yrKbkamkUw0pbruI-1URtpYj8varzNbXAk4qc4qHdxfEIAtkWAWdvEGf41ReiN8Y9HtI-earEC0vrZWexMsFF9LvzSfMl1eqpQWH2Gw7pSZMHHGkG284/s1600/tf-lite-in-renode_TF-blog.png
Antmicro 的 Michael Gielda 的客座文章
每天都有越来越多的软件开发人员探索机器学习、嵌入式系统和物联网的世界。也许这些领域中最新的创新中最令人兴奋的进步之一是在边缘和越来越小的设备中加入机器学习 - 通常被称为 TinyML。
在“
机器学习的未来是微小的”中,
Pete Warden 预测机器学习将在微小、低功耗的设备上变得越来越可用。得益于 TensorFlow 社区的努力,该框架的强大功能和灵活性现在也适用于
资源相当有限的设备,如 Arm Cortex-M MCU,正如 Pete 的预测一样。
现在,数千名使用 TensorFlow 的开发人员可以将机器学习模型部署到嵌入式和物联网设备上,用于关键字检测或手势识别等操作。然而,在许多小型嵌入式设备上大规模测试软件仍然具有挑战性。无论是难以获取硬件组件、错误地设置开发环境,还是在将多个独特的设备合并到多节点网络时遇到配置问题,有时即使看似简单的任务也会变得复杂。
|
Renode 1.9 于上个月发布 |
即使是经验丰富的嵌入式开发人员也发现自己不得不费力地完成在物理硬件上刷机和测试应用程序的过程,仅仅是为了完成在其他环境(如 Web 或桌面应用程序开发)中已经很常见的简单测试驱动型工作流程。
TensorFlow Lite MCU 团队也面临着这些挑战:如何在没有手动重新插拔、重新刷机和摆弄大量小型电路板的情况下,反复可靠地在各种硬件上测试各种演示、模型和场景?
为了解决这些挑战,他们转向了
Renode,这是一个来自
Antmicro的开源模拟框架,其目标正是这样:允许嵌入式和物联网系统进行无硬件、持续集成驱动的开发流程。
在本文中,我们将向您展示如何在 Renode 中使用虚拟 RISC-V MCU 运行 TensorFlow Lite 的基础知识,而无需使用物理硬件(如果您真的想使用,我们也准备了在
Digilent Arty 板上运行完全相同软件的说明)。
虽然本教程重点介绍基于 RISC-V 的平台,但 Renode 能够模拟针对许多不同架构的软件,例如 Arm、POWER 和
其他,因此这种方法也可以用于其他硬件。
Renode 有什么作用?
在
Antmicro,我们为能够让我们的客户和合作伙伴创造可扩展、可持续的先进工程解决方案来应对复杂的技术挑战而感到自豪。在过去的 10 年中,我们的团队一直在努力克服现在大型软件开发人员社区所面临的许多相同结构性障碍和开发工具缺陷。我们最初创建了
Renode 框架来满足我们自己的需求,但作为开源的坚定支持者,我们在 2015 年决定在宽松的许可证下
发布它,以扩大其影响范围,使嵌入式系统设计变得灵活、移动且对每个人都触手可及。
Renode 刚刚发布了
版本 1.9,是一个开发框架,通过让您模拟物理硬件系统(包括 CPU、外设、传感器、环境以及在多节点系统的情况下节点之间的有线或无线介质)来加速物联网和嵌入式系统开发。它被称为“嵌入式的 docker”,虽然这种比较并不完全准确,但它确实很好地传达了这个想法。
Renode 允许您确定性地模拟整个系统和动态环境 - 包括将建模的样本数据馈送到模拟传感器,然后这些数据可以由您的自定义软件和算法读取和处理。能够快速运行未修改的软件,而无需访问物理硬件,使 Renode 成为希望使用 TensorFlow Lite 在嵌入式和物联网设备上进行实验和构建机器学习驱动应用程序的开发人员的理想平台。
获取 Renode 和演示软件
要开始,您首先需要安装 Renode,如
其自述文件所述 - 二进制文件可用于 Linux、Mac 和 Windows。
确保您下载了适合您操作系统的版本,以便可以使用 renode 命令。在您的终端中运行 renode 命令后,您应该会看到监视器出现在您面前,这是 Renode 的命令行界面。
|
Renode“监视器”CLI |
Renode 启动后,您就可以开始了 - 请记住,您不需要任何硬件。
我们已在
专用 GitHub 存储库中准备了您需要进行此演示的所有文件。
使用 git 克隆此存储库(请记住获取子模块)
git clone --recurse-submodules https://github.com/antmicro/litex-vexriscv-tensorflow-lite-demo
我们需要一个演示二进制文件来运行。为了简化操作,您可以使用
binaries/magic_wand 目录中的预编译二进制文件(在“
构建您自己的应用程序”下面,我们将解释如何编译您自己的二进制文件,但您只需要在准备好时这样做)。
在 Renode 中运行 TensorFlow Lite
现在是激动人心的时刻!导航到
renode 目录
cd renode
renode 目录包含 ADXL345 加速度计的模型以及模拟 Magic Wand 演示所需的所有必要脚本和资产。
要启动模拟,首先使用要加载的脚本的名称运行 renode。在这里,我们使用“
litex-vexriscv-tflite.resc”,这是一个包含创建所需平台并将其应用程序加载到其内存中的相关命令的“Renode 脚本”(.resc)文件
renode litex-vexriscv-tflite.resc
您将看到 Renode 的 CLI,称为“监视器”,您可以从中控制仿真。在 CLI 中,使用
start 命令开始模拟
(machine-0) start
您应该在模拟设备的虚拟串行端口(也称为 UART - 它将作为 Renode 中的单独终端自动打开)上看到以下输出
|
就像 1-2-3 一样简单 |
刚刚发生了什么?
Renode 模拟硬件(包括 RISC-V CPU 以及 I/O 和传感器),因此二进制文件认为它正在真实的板上运行。这是通过 Renode 的两个功能实现的:机器代码翻译和完整 SoC 支持。
首先,执行应用程序的机器代码被翻译成本地主机机器语言。
每当应用程序尝试从任何外设读取或写入任何外设时,该调用都会被拦截并定向到相应的模型。Renode 模型通常(但不总是)用 C# 或 Python 编写,实现寄存器接口,其目标是在行为上与实际硬件保持一致。由于这些模型的抽象性质,您可以通过 Renode CLI 或脚本文件以编程方式与它们交互。
在我们的示例中,我们将一些离线、预先录制好的
角度和
圆圈手势数据文件馈送到虚拟传感器
i2c.adxl345 FeedSample @circle.data
在 Renode 中运行的 TF Lite 二进制文件处理数据,并且毫不奇怪地检测到了手势。
这展示了在模拟中运行的另一个好处 - 如果我们选择,我们可以完全确定性地运行,或者设计更随机的测试场景,馈送专门准备好的生成数据,选择不同的模拟种子等等。
构建您自己的应用程序
如果您想构建其他应用程序,或者更改提供的演示,您现在可以使用下载的存储库自己构建它们。您需要安装以下先决条件(在 Ubuntu 18.04 上测试)
sudo apt update
sudo apt install cmake ninja-build gperf ccache dfu-util device-tree-compiler wget python python3-pip python3-setuptools python3-tk python3-wheel xz-utils file make gcc gcc-multilib locales tar curl unzip
由于软件正在运行
Zephyr RTOS,因此您还需要安装 Zephyr 的先决条件
sudo pip3 install psutil netifaces requests virtualenv
# install Zephyr SDK
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.11.2/zephyr-sdk-0.11.2-setup.run
chmod +x zephyr-sdk-0.11.2-setup.run
./zephyr-sdk-0.11.2-setup.run -- -d /opt/zephyr-sdk
一旦所有必要的先决条件到位,请转到您之前下载的存储库
cd litex-vexriscv-tensorflow-lite-demo
并使用以下命令构建软件
cd tensorflow
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=zephyr_vexriscv \
magic_wand_bin
生成的二进制文件可以在
tensorflow/lite/micro/tools/make/gen/zephyr_vexriscv_x86_64/magic_wand/CMake/zephyr 文件夹中找到。
使用以下命令将其复制到根文件夹
TF_BUILD_DIR=tensorflow/lite/micro/tools/make/gen/zephyr_vexriscv_x86_64
cp ${TF_BUILD_DIR}/magic_wand/CMake/zephyr/zephyr.elf ../
cp ${TF_BUILD_DIR}/magic_wand/CMake/zephyr/zephyr.bin ../
您可以像以前一样在 Renode 中运行它。
为了确保教程能够继续使用,并且为了展示模拟如何让您轻松地进行持续集成,我们还为演示准备了一个
Travis CI,这就是示例中二进制文件是如何生成的。
我们将在另一篇说明中描述 TensorFlow Lite 团队如何将 Renode 用于持续集成以及您如何自己做到这一点 - 请继续关注!
在硬件上运行
现在您已经有了二进制文件,并且您已经看到它们在 Renode 中的工作方式,让我们看看相同的二进制文件在物理硬件上的行为如何。
您需要一块
Digilent Arty A7 板和一块
ACL2 PMOD,连接到最右侧的 Pmod 连接器,如图所示。
|
硬件设置 |
该系统是一个名为
LiteX的 SoC-in-FPGA,它具有功能强大的 RISC-V 核心和各种 I/O 选项。
为了构建包含我们的 RISC-V SoC 的必要 FPGA 门控件,我们将使用
LiteX Build Environment,这是一个面向 FPGA 的构建系统,可以作为在各种硬件平台上进行 FPGA 开发的简易入门。
现在初始化 LiteX Build Environment
cd litex-buildenv
export CPU=vexriscv
export CPU_VARIANT=full
export PLATFORM=arty
export FIRMWARE=zephyr
export TARGET=tf
./scripts/download-env.sh
source scripts/enter-env.sh
然后构建门控件
make gateware
构建完门控件后,使用以下命令将其加载到 FPGA 中
make gateware-load
对 FPGA 进行编程后,您可以使用您刚刚初始化的环境中提供的
flterm 程序将 Zephyr 二进制文件加载到设备上
flterm --port=/dev/ttyUSB1 --kernel=zephyr.bin --speed=115200
flterm 将打开串行端口。现在,您可以晃动电路板并查看终端中识别出的手势。恭喜!您现在已经完成了整个教程。
总结
在这篇文章中,我们演示了如何在没有(或有)硬件的情况下使用 TensorFlow Lite for MCUs。在接下来的几个月里,我们将继续描述如何从 Renode 的交互式开发过渡到机器学习代码的持续集成,然后展示将 TensorFlow Lite 的优势与 Zephyr RTOS 的优势相结合的优势。
您可以在
演示仓库 中找到最新的说明。该仓库通过子模块链接到经过测试的 TensorFlow、Zephyr 和 LiteX 代码版本。Travis CI 用于测试指南。
如果您想探索更多 Renode 支持的硬件和软件,请查看完整的
支持板列表。如果您遇到问题或有想法,请在 GitHub 上提交问题,对于特定需求,例如在您的平台上启用 TensorFlow Lite 和模拟,您可以通过
[email protected] 与我们联系。