无需硬件,使用 Renode 在微控制器上运行和测试 TF Lite

2020 年 7 月 13 日 TensorFlow

客座博文 / Michael Gielda,Antmicro


每天,都有越来越多的软件开发者开始探索机器学习、嵌入式系统和物联网的世界。这些领域近期的创新成果中最令人兴奋的进展之一,便是在边缘设备和体积越来越小的设备中构建 ML。我们通常将此类应用称为 TinyML。


在“机器学习的未来——微型化(The Future of Machine Learning is Tiny) 一文中,Pete Warden 预测机器学习将在低功耗的微型设备上越来越普及。正如 Pete 预测的那样,在 TensorFlow 社区的努力下,我们现在同样能在 Arm Cortex-M MCU 等有严重资源限制的设备上展现此框架的强大性和灵活性。

  • Arm Cortex-M MCU 等有严重资源限制的设备上
    https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro


现在,TensorFlow 的开发者们可以将 ML 模型部署到嵌入式设备和 IoT 设备上,执行关键短语检测或手势识别等操作。但是,在多数小型设备和嵌入式设备上进行大规模软件测试仍然充满挑战


在将多个独特设备纳入多节点网络中时会出现各种难题:如难以获取硬件组件、开发环境设置错误,以及遇到配置问题……甚至有时,一项看似简单的任务都有可能会变得非常复杂。

于上月发布的 Renode 1.9


在物理硬件上刷写和测试应用,并测试驱动的简单工作流(在网络或桌面应用开发等其他环境中很常见的工作流),即便经验丰富的嵌入式软件开发者也会发现他们在此过程中举步维艰。


TensorFlow Lite MCU 团队也面临着以下挑战:如何无需手动重插、重新刷写以及摆弄大量的微型板,而在各种硬件上重复且可靠地测试各种演示、模型及场景?


为了解决这些问题,他们开始使用 Renode (https://renode.io/),由 Antmicro 公司打造的开源模拟框架,致力于实现以下目标:能够将无硬件工作流持续集成于嵌入式系统和 IoT 系统。


在本文中,我们将向您展示一些基础知识,说明使用 Renode 如何在虚拟 RISC-V MCU 上运行 TensorFlow Lite 而无需部署物理硬件(不过,如果您确实想使用物理硬件,我们也准备了关于在 Digilent Arty 开发板上运行相同软件的说明)。


虽然本教程主要面向基于 RISC-V 的平台,但 Renode 能够针对多种不同架构(如 Arm、POWER 及其他架构)进行模拟的软件,因此本方法也可以与其他硬件结合使用。



Renode 是什么?

借助 Antmicro 提供的服务,客户和合作伙伴能够创建可扩展且可持续的先进工程解决方案,以应对复杂的技术挑战,我们十分以此为豪。大型软件开发者社区现在面临很多相同的结构性障碍和开发者工具缺陷问题,而在过去 10 年里,我们的团队一直在致力于解决此类问题。起初,我们创建了 Renode 框架来满足自身需要。但是作为开放源代码的支持者,2015 年我们决定使用宽松许可证来发布该框架,以扩大覆盖范围,并为每个人提供灵活且可移动的嵌入式系统设计。

  • 发布
    https://github.com/renode/renode


刚刚发布的 1.9 版本 Renode 是一个开发框架,您可以借助该框架模拟物理硬件系统(包括 CPU、外设、传感器、环境以及多节点系统中节点之间的有线或无线连接)来加速 IoT 和嵌入式系统的开发。该框架曾被称为“嵌入式领域的 docker”。虽然并不完全准确,但这一名称确实较为准确地说明了该框架的用处。


借助 Renode,您可以确定地模拟整个系统和动态环境,包括向模拟传感器提供建模示例数据,随后您的自定义软件和算法将读取并处理这些数据。对于开发者来说,如果要使用 TensorFlow Lite 在嵌入式设备和 IoT 设备上试验及构建由 ML 提供支持的应用,Renode 将是一个理想平台,因为该框架能够快速运行未经修改的软件,且无需访问物理硬件。



获取 Renode 和演示软件

开始使用前,您首先需要按照 README 文件中的详细说明安装 Renode。该二进制文件支持 Linux、Mac 和 Windows 系统。

  • README 文件中的详细说明
    https://github.com/renode/renode/blob/master/README.rst#installation


请确保您下载的是适用于自己操作系统的正确版本,只有这样才能使用 renode 命令。在终端运行 renode 命令时,您会看到弹出的 Monitor,这是 Renode 的命令行界面。

Renode“Monitor”CLI


启动 Renode 后,您就可以运行演示了。别忘了,您不需要使用任何硬件。


我们在 GitHub 代码库中专门准备了此演示所需的所有文件。

  • GitHub 代码库
    https://github.com/antmicro/litex-vexriscv-tensorflow-lite-demo


请使用以下 git 命令克隆此代码库(别忘了下载子模块):

git clone --recurse-submodules https://github.com/antmicro/litex-vexriscv-tensorflow-lite-demo


我们需要一个演示二进制文件来运行该代码库中的代码。为了简化操作,您可以使用 binaries/magic_wand 目录中的预编译二进制文件(在下方的“构建您自己的应用”部分中,我们将说明如何编译您自己的二进制文件,但只有在您准备就绪后才能执行此操作)。

  • 构建您自己的应用
    https://docs.google.com/document/d/1RtVufJ1Q2drlhhgpLG6FZYSewkn6iRkXh9vih2q7WR8/edit#heading=h.6mdeg8vofkyq



在 Renode 中运行 TensorFlow Lite

接下来是最有意思的部分!请进入 renode 目录:

cd renode


renode 目录包含一个 ADXL345 加速度计模型,以及模拟 Magic Wand 演示所需的所有必要脚本和资源。


要启动模拟,请先使用要加载的脚本的名称运行 renode。我们会在此处将“Renode 脚本”(.resc) 文件“litex-vexriscv-tflite.resc”与相关命令结合使用,以创建所需平台并将应用加载到其内存中:

renode litex-vexriscv-tflite.resc


您将看到名为“Monitor”的 Renode 命令行窗口,您可以在其中控制模拟。在该命令行窗口中,您可以使用 start 命令启动模拟:

(machine-0) start


您将在模拟设备的虚拟串行端口(也称为 UART,会在 Renode 中作为单独的终端自动打开)上看到以下输出内容:

过程非常简单



刚才发生了什么?

Renode 模拟了硬件(包括 RISC-V CPU 以及 I/O 和传感器),编译的二进制文件在真实的硬件板上运行的感觉。此过程的实现依赖于 Renode 的以下两项功能:机器代码转换和全面 SoC 支持。


首先,系统会将已执行的应用的机器代码转换为原生主机语言。


只要该应用尝试对任何外设执行读取或写入操作,系统就会拦截该调用并将其重定向至适合的模型。通常(但不限于)使用 C# 或 Python 编写的 Renode 模型将实现注册接口,其目标与实际硬件在行为上保持一致。得益于这些模型的抽象性质,您可以通过 Renode命令行接口或脚本文件以编程方式与其交互。


在示例中,我们会向虚拟传感器提供一些预录制的离线角度圆圈手势数据文件:

i2c.adxl345 FeedSample @circle.data
  • 角度
    https://github.com/antmicro/litex-vexriscv-tensorflow-lite-demo/blob/master/renode/angle.data

  • 圆圈
    https://github.com/antmicro/litex-vexriscv-tensorflow-lite-demo/blob/master/renode/circle.data


Renode 中运行的 TF Lite 二进制文件将处理这些数据,并且肯定会检测这些手势。


这体现出使用模拟运行方式的另一项好处,即我们可以使用完全确定性的方法选择或设计更多的随机测试方案、提供专门准备的生成数据以及选择不同的潜在模拟模型等。



构建您自己的应用

如果您要构建其他应用或者更改所提供的演示,现在可以使用已下载的代码库自行构建。您将需要安装以下依赖组件(已在 Ubuntu 18.04 上测试):

sudo apt updatesudo 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 SDKwget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.11.2/zephyr-sdk-0.11.2-setup.runchmod +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 tensorflowmake -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_64cp ${TF_BUILD_DIR}/magic_wand/CMake/zephyr/zephyr.elf ../cp ${TF_BUILD_DIR}/magic_wand/CMake/zephyr/zephyr.bin ../


您可以完全按照先前的操作在 Renode 中运行该文件。


为了确保本教程发挥作用,并展示如何借助模拟轻松地进行持续集成,我们还提供了适用于演示的 Travis CI,其中说明了示例中二进制文件的生成方式。

  • 适用于演示的 Travis CI
    https://travis-ci.com/github/antmicro/litex-vexriscv-tensorflow-lite-demo


我们很快将在另外的文章说明中解释 TensorFlow Lite 团队如何将 Renode 用于持续集成以及您如何执行该操作,敬请期待!



在硬件上运行

现在您有了二进制文件,并且已看到该文件在 Renode 中的运行情况,接下来让我们看看同一个二进制文件如何在物理硬件上运行。


您需要一块 Digilent Arty A7 开发板和 ACL2 PMOD,并将后者连接到图中最右侧的 Pmod 连接器上。

硬件设置


此系统是一个名为 LiteX 的 SoC-in-FPGA,具备功能强大的 RISC-V 核心及各种 I/O 选项。

  • LiteX
    https://github.com/enjoy-digital/litex


要构建包含 RISC-V SoC 的必要 FPGA Gateware,我们需要使用 LiteX 构建环境。这是一个面向 FPGA 的构建系统,您可以借助该系统在各种硬件平台上轻松进入 FPGA 开发流程。

  • LiteX 构建环境
    https://github.com/timvideos/litex-buildenv


现在,先初始化 LiteX 构建环境:

cd litex-buildenvexport CPU=vexriscvexport CPU_VARIANT=fullexport PLATFORM=artyexport FIRMWARE=zephyrexport TARGET=tf
./scripts/download-env.shsource scripts/enter-env.sh


然后,编译 Gateware:

make gateware


Gateware 编译完成后,使用以下命令将其加载到 FPGA 中:

make gateware-load


借助已编译的 FPGA,您可以使用刚才在上述步骤中初始化的环境所提供的 flterm 程序,在设备上加载 Zephyr 二进制文件:

flterm --port=/dev/ttyUSB1 --kernel=zephyr.bin --speed=115200


flterm 将打开串行端口。现在,您可以尝试使用开发板,并看到终端识别这些手势。恭喜!您现已完成整个教程。



总结

在本文中,我们向您演示了在无硬件和有硬件的情况下,如何在 MCU 上使用 TensorFlow Lite。在接下来的几个月里,我们将继续介绍如何借助 Renode 进行交互式开发,以及实现机器学习代码的持续集成,并会展示将 TensorFlow Lite 和 Zephyr RTOS 的优势相结合的益处。


您可以在演示代码库中找到最新说明。代码库将通过子模块链接到已经过测试的 TensorFlow、Zephyr 和 LiteX 代码版本。Travis CI 可用于测试指南。

  • 演示代码库
    https://github.com/antmicro/litex-vexriscv-tensorflow-lite-demo


如果您想使用 Renode 探索更多硬件和软件,请查看受支持的开发板的完整列表。如果您遇到了问题或有任何建议,请在 GitHub 上提 issue。如果您有特定需求(例如,在您的平台上启用 TensorFlow Lite 和模拟),您可通过 contact@renode.io 联系我们。

  • 受支持的开发板
    https://renode.readthedocs.io/en/latest/introduction/supported-boards.html



— 推荐阅读 —



了解更多请点击 “阅读原文” 访问 Github。

🌟将我们设为星标

第一时间收到更新提醒

不再错过精彩内容!

分享 💬  点赞 👍  在看 ❤️ 

以“三连”行动支持优质内容!

登录查看更多
1

相关内容

嵌入式即嵌入式系统,IEEE(美国电气和电子工程师协会)对其定义是用于控制、监视或者辅助操作机器和设备的装置,是一种专用的计算机系统;国内普遍认同的嵌入式系统定义是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统;从应用对象上加以定义来说,嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。
深度神经网络实时物联网图像处理,241页pdf
专知会员服务
77+阅读 · 2020年3月15日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
70+阅读 · 2020年1月17日
在浏览器中使用tensorflow.js进行人脸识别的JavaScript API
人工智能头条
6+阅读 · 2018年7月2日
快使用TensorFlow,哼哼哈嘿
图灵教育
5+阅读 · 2018年3月16日
TensorFlow神经网络教程
Python程序员
4+阅读 · 2017年12月4日
AliCoCo: Alibaba E-commerce Cognitive Concept Net
Arxiv
13+阅读 · 2020年3月30日
VIP会员
相关VIP内容
深度神经网络实时物联网图像处理,241页pdf
专知会员服务
77+阅读 · 2020年3月15日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
70+阅读 · 2020年1月17日
Top
微信扫码咨询专知VIP会员