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 。
![]()
QEMU 启动界面¶
运行 TensorFlow Lite 用例¶
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
运行结果如下:
![]()
Python 图像分类用例结果¶
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
运行结果如下:
![]()
C++ 图像分类用例结果¶
C++ 最小值用例
登录终端后,执行以下指令运行 C++ 最小值用例:
cd /usr/share/tensorflow/lite/examples/minimal/
./minimal ./mobilenet_v1_1.0_224.tflite
运行结果如下:
![]()
C++ 最小值用例结果¶
至此, TensorFlow Lite 移植到 FUSDK-2022.04 分支版本验证完成。