Linux 的 TensorFlow Lite 移植

SiFive Freedom U SDK(FUSDK)是基于 OpenEmbedded 来提供额外的改进以及新的磁盘镜像的开源项目,目前主要是用来为 QEMU 以及 u540 的开发板构建 Linux RISCV 的镜像。由于近期的编译问题,FUSDK 自 2022.02 分支移除了对 TensorFlow Lite 功能的支持,为了后续进一步地基于 RISC-V 架构进行机器学习相关应用开发和学习,本文档将介绍如何移植 TensorFlow Lite 移植到最新的 FUSDK-2022.04 分支版本。

构建 SiFive Freedom U SDK

环境准备

如果您的主机上没有安装 repo 命令,请按照 Google官方说明 进行操作。

然后为 BitBake(OE 构建工具)安装一些软件包,以便在您的主机系统上正常工作。BitBake 本身依赖于 Python 3。一旦你安装了 Python 3,BitBake 应该能够告诉您大部分缺失的包。

各种发行版的详细说明可以在 Yocto 项目参考手册的 “构建主机所需的包” 部分找到。

创建工作区

如果您想要在最新的图层版本上进行设置,这一步需要每次被执行。

mkdir riscv-sifive-2204 && cd riscv-sifive-2204
repo init -u https://github.com/sifive/freedom-u-sdk -b 2022.04 -m tools/manifests/sifive.xml
repo sync

创建工作分支

如果您想更改现存的图层,建议您创建一个工作分支。

repo start work --all

获取构建工具

OpenEmbedded-Core 要求主机系统提供 GCC 6 或更新版本。如果您使用 LTS(长期支持)Linux 发行版(例如 Ubuntu 16.04.6 具有 GCC 5.4.0),您的主机系统可能具有旧版本的 GCC。您可以通过安装构建工具来解决此问题。这需要少于 400MB 的磁盘空间。

获取与构建 OpenEmbedded-Core 工具:

./openembedded-core/scripts/install-buildtools -r yocto-3.2_M2 -V '3.1+snapshot' -t 20200729

本机 SDK 将安装在如下目录:

$BUILDDIR/../openembedded-core/buildtools

最后,应该能够使用构建工具:

. ./openembedded-core/buildtools/environment-setup-x86_64-pokysdk-linux

配置 BitBake 并行任务/作业数

PARALLEL_MAKE 与 BB_NUMBER_THREADS 用来设置并行任务/作业数。

PARALLEL_MAKE="-j 4" BB_NUMBER_THREADS=4 MACHINE=freedom-u540 bitbake demo-coreip-cli

保留默认值可能会导致平均负载过高,内存使用率较高,IO 等待时间较长,并且可能由于资源过度使用而导致系统无响应。默认值应根据您的系统配置进行更改。

构建磁盘映像

FUSDK 添加了两个磁盘镜像目标:

  • demo-coreip-cli- 基本命令行镜像(推荐);

  • demo-coreip-xfce4- 带有Xfce 4桌面环境的基本图形化磁盘映像。

定义了几个机器目标:

  • qemuriscv64 - RISC-V 64 位 (RV64GC) 用于 QEMU 虚拟机(推荐用于 QEMU 目标)。

  • freedom-u540 - SiFive HiFive Unleashed 开发板。

  • unmatched - SiFive HiFive Unmatched 开发板。

根据您的硬件情况,构建过程大概会花费30分钟到几个小时的时间,本文档的构建映像如下:

MACHINE=qemuriscv64 bitbake demo-coreip-cli
MACHINE=unmatched bitbake demo-coreip-cli

移植 TensorFlow Lite

下载 TensorFlow Lite Layer

经过测试验证,本文档使用 NobuoTsukamoto 维护的 TensorFlow Lite 开源 Layer,为保持与 SiFive Freedom Unleashed SDK(2022.04) 兼容的 Yocto 版本,切换到 kirkstone 分支。

git clone https://github.com/NobuoTsukamoto/meta-tensorflow-lite.git
git checkout -b my-kirkstone remotes/origin/kirkstone

移植 TensorFlow Lite Layer

riscv-sifive-2204 目录下修改 freedom-u-sdk/setup.sh ,增加 TensorFlow Lite Layer:

bitbake-layers add-layer ../meta-tensorflow-lite/

riscv-sifive-2204 目录下修改 freedom-u-sdk/conf/layer.conf ,增加 TensorFlow Lite Layer:

LAYERDEPENDS_freedom-u-sdk += "meta-tensorflow-lite"

riscv-sifive-2204 目录下修改 freedom-u-sdk/recipes-sifive/images/demo-coreip-cli.bb ,在镜像中增加 TensorFlow Lite 的支持库和用例:

libtensorflow-lite \
python3-tensorflow-lite \
python3-tensorflow-lite-example \
tensorflow-lite-label-image \
tensorflow-lite-minimal \

运行 TensorFlow Lite 例子

设置构建环境

使用要使用的工具链修改环境后,必须执行此步骤,否则软件包构建环境中可能会使用错误的宿主工具。例如 gcc 从主机系统将用于构建*-native 软件包。

riscv-sifive-2204 目录下执行:

. ./freedom-u-sdk/setup.sh

备注

当重新开启一个终端以后需要到 riscv-sifive-2204 目录下重新执行上述命令。

生成支持RISC-V 64的 QEMU 镜像

添加需要编译的任务,构建支持 RISC-V 64 的 QEMU 镜像:

PARALLEL_MAKE="-j 16" BB_NUMBER_THREADS=16 MACHINE=qemuriscv64 bitbake demo-coreip-cli

启动 QEMU

环境构建完成后,自动进入 build 目录,启动 QEMU 模拟器,运行生成的镜像:

MACHINE=qemuriscv64 runqemu nographic slirp

启动后如下图所示,其中 login=root , Password=sifive 。

../../../_images/qemu_sifive.png

QEMU 启动界面

运行 TensorFlow Lite 用例

  1. Python 图像分类用例

登录终端后,执行以下指令运行 Python 图像分类用例:

cd /usr/share/tensorflow/lite/examples/python/
python3 label_image.py \
--image ./grace_hopper.bmp \
--model_file ./mobilenet_v1_1.0_224.tflite \
--label_file ./labels.txt

运行结果如下:

../../../_images/Python_classification.png

Python 图像分类用例结果

  1. C++ 图像分类用例

登录终端后,执行以下指令运行 C++ 图像分类用例:

cd /usr/share/tensorflow/lite/examples/label_image/
./label_image \
--tflite_model ./mobilenet_v1_1.0_224.tflite \
--labels ./labels.txt \
--image ./grace_hopper.bmp

运行结果如下:

../../../_images/C%2B%2B__classification.png

C++ 图像分类用例结果

  1. C++ 最小值用例

登录终端后,执行以下指令运行 C++ 最小值用例:

cd /usr/share/tensorflow/lite/examples/minimal/
./minimal ./mobilenet_v1_1.0_224.tflite

运行结果如下:

../../../_images/C%2B%2B_minimal.png

C++ 最小值用例结果

至此, TensorFlow Lite 移植到 FUSDK-2022.04 分支版本验证完成。