TensorFlow Lite 如何用 CMake 为 ARM 设备构建 tflite-runtime Python 包?
【免费下载链接】tensorflowAn Open Source Machine Learning Framework for Everyone项目地址: https://gitcode.com/GitHub_Trending/te/tensorflow
如果你只想在树莓派等 ARM 设备上跑 TFLite 解释器,又不想装完整的 TensorFlow,就需要把tflite_runtimePython 包针对目标 ARM 架构交叉编译成 wheel,再安装到设备上。TensorFlow 提供了一条基于 CMake 的构建路径:在 x86 主机上用 Docker 容器自动完成交叉编译,产出可安装到 ARM 设备的.whl文件。
以下操作在 build_cmake_pip.md 中说明,文档中记录的测试环境为 Ubuntu 16.04.3 64-bit PC、macOS Catalina (x86_64) 和 TensorFlow 官方 devel Docker 镜像。该功能自 TensorFlow 2.4 起可用。
构建前需要准备什么
- 一份 TensorFlow 源码副本(在源码根目录下执行构建命令)。
- CMake 3.16 或更高版本。按 build_cmake.md 的说明,Ubuntu 上可执行:
sudo apt-get install cmake- 交叉编译路径需要主机安装 Docker,构建通过 Makefile 调用预定义 Docker 容器完成,避免在主机上手动配置交叉编译环境。
- 目标设备的 Python 版本需为 3.7 或更高(
PYTHON_VERSION参数只支持 3.7+)。
先确认目标设备属于哪种 ARM 环境
build_pip_package_with_cmake.sh根据TENSORFLOW_TARGET参数确定目标架构,文档给出的可用 target 如下:
| Target | 目标架构 | 说明 |
|---|---|---|
armhf | ARMv7 VFP with Neon | 兼容 Raspberry Pi 3 和 4 |
rpi0 | ARMv6 | 兼容 Raspberry Pi Zero |
aarch64 | aarch64 (ARM 64-bit) | 兼容 Coral Mendel Linux 4.0、安装了 Ubuntu Server 20.04.01 LTS 64-bit 的树莓派 |
native | 你的工作站 | 以-mnative优化构建 |
<default> | 你的工作站 | 默认 target |
选 target 之前,build_cmake_arm.md 建议在目标设备上检查环境:
- glibc 版本:在目标设备上执行
ldd --version。注意默认工具链是 GCC 8.3,用它构建的二进制要求目标 glibc 2.28 或更高;glibc 更低时需要更换更老的 GCC 工具链。 - ABI:ARM 32-bit 目标存在 armhf 和 armel 两种 ABI,文档示例只覆盖 armhf,armel 目标需要使用不同的工具链。
- CPU 能力:ARMv7 目标需确认 VFP 版本和 NEON 支持情况,在目标设备上执行
cat /proc/cpuinfo查看。
用 docker-build 执行交叉构建
在 TensorFlow 源码根目录执行make命令,指定 target 和 Python 版本。文档给出的两个示例命令:
armhf 目标(对应 Python 3.7):
make -C tensorflow/lite/tools/pip_package docker-build \ TENSORFLOW_TARGET=armhf PYTHON_VERSION=3.7aarch64 目标(对应 Python 3.8):
make -C tensorflow/lite/tools/pip_package docker-build \ TENSORFLOW_TARGET=aarch64 PYTHON_VERSION=3.8docker-build目标会先构建构建用的 Docker 镜像(docker-image),再运行容器执行 build_pip_package_with_cmake.sh。执行过程中脚本会自动下载 GCC 8.3 交叉工具链到tensorflow/lite/tools/cmake/toolchains/(由 download_toolchains.sh 完成,已存在则跳过),因此构建过程需要网络访问。
Makefile 中的默认值为PYTHON_VERSION=3.11、TENSORFLOW_TARGET=native,不传参数时就是为本机构建,ARM 交叉构建务必显式指定TENSORFLOW_TARGET。Makefile 注释中列出的 target 取值还包括rpi,脚本内部会把rpi映射为armhf。
如果只想清理已生成的 wheel 和 deb 文件(删除产物,不影响源码),可以运行make -C tensorflow/lite/tools/pip_package clean。
构建结果如何验证
构建脚本结尾会打印Output can be found here:,随后find列出产物位置,即tensorflow/lite/tools/pip_package/gen/tflite_pip/<python解释器>/dist目录下的.whl文件。
wheel 的平台名由 target 决定,脚本中的对应关系:armhf对应linux-armv7l,rpi0对应linux-armv6l,aarch64对应linux-aarch64。检查产物文件名后缀是否符合目标设备,是快速确认没有选错 target 的方式。
把 wheel 拷贝到目标设备后安装:
pip install --upgrade <wheel>其中<wheel>替换为上一步dist目录中生成的.whl文件名。安装后按 README 中的用法验证解释器可用:
from tflite_runtime.interpreter import Interpreter interpreter = Interpreter(model_path="foo.tflite")生成的二进制与目标不兼容时的处理
如果文档默认的工具链产出的二进制不兼容你的目标设备,可以改用自有工具链或自定义编译参数。做法是修改 download_toolchains.sh,让它为build_pip_package_with_cmake.sh定义以下两个变量:
| 变量 | 作用 | 文档示例 |
|---|---|---|
ARMCC_PREFIX | 定义工具链前缀 | arm-linux-gnueabihf- |
ARMCC_FLAGS | 编译参数 | -march=armv7-a -mfpu=neon-vfpv4 |
文档提示ARMCC_FLAGS可能需要包含 Python 库的 include 路径,可参考download_toolchains.sh中现有 target 的写法。修改后重新执行上面的make docker-build命令即可。
使用限制
- 该 wheel 只包含 TensorFlow Lite 内置算子,不能运行 TensorFlow Select ops;目前也不支持注册自定义 ops 和 delegates(见 pip_package README 的 Caveats)。
- 包安装后使用的是
tflite_runtime命名空间,而不是tensorflow,导入路径与完整 TensorFlow 不同。 - armel ABI 的 ARM 32-bit 目标不在文档示例范围内,需要自行准备工具链,参考上文自定义工具链一节。
【免费下载链接】tensorflowAn Open Source Machine Learning Framework for Everyone项目地址: https://gitcode.com/GitHub_Trending/te/tensorflow
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考