news 2026/9/9 22:39:06

TensorFlow Lite 如何用 CMake 为 ARM 设备构建 tflite-runtime Python 包?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TensorFlow Lite 如何用 CMake 为 ARM 设备构建 tflite-runtime Python 包?

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目标架构说明
armhfARMv7 VFP with Neon兼容 Raspberry Pi 3 和 4
rpi0ARMv6兼容 Raspberry Pi Zero
aarch64aarch64 (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.7

aarch64 目标(对应 Python 3.8):

make -C tensorflow/lite/tools/pip_package docker-build \ TENSORFLOW_TARGET=aarch64 PYTHON_VERSION=3.8

docker-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.11TENSORFLOW_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-armv7lrpi0对应linux-armv6laarch64对应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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 22:37:01

C语言复合字面量完全指南:C99语法、存储期与悬垂指针陷阱

说实话&#xff0c;我第一次在别人代码里见到 (struct point){ .x 10, .y 20 } 这种写法时&#xff0c;第一反应是“这玩意是什么&#xff1f;C语言什么时候能这样写了&#xff1f;”查了标准才发现&#xff0c;这是 C99 引入的复合字面量&#xff08;compound literal&…

作者头像 李华
网站建设 2026/9/9 22:34:34

微信群如何发起报名活动?2026年最新投票平台深度实测分享

在微信群里发起一场投票评选活动&#xff0c;如今已经成为班级评优、企业评先、社区互动乃至作品征集中最常见的操作。但很多组织者面对的问题是&#xff1a;在群里发通知让大家报名&#xff0c;然后一个一个私聊收作品、整理表格、再统一录入投票平台——光是收集选手信息这一…

作者头像 李华
网站建设 2026/9/9 22:34:14

C++异常处理实战:从栈展开到RAII的完整指南

C 的异常处理&#xff0c;说难不难&#xff0c;说简单也绝对不简单。我最初学的时候&#xff0c;觉得不就是try、catch、throw这三个关键字嘛&#xff0c;写几个 demo 就会了。但真正在项目里用起来&#xff0c;才发现坑一个接一个&#xff1a;析构函数里能不能抛异常、构造函数…

作者头像 李华
网站建设 2026/9/9 22:33:59

FM17XX读写芯片参考代码详解:ISO14443A/B读卡流程与移植要点

简介&#xff1a;FM17XX系列非接触式读卡芯片的参考代码包&#xff0c;面向嵌入式开发及智能门禁、读卡设备调试人员&#xff0c;解决ISO14443A/B协议下寻卡和底层驱动实现问题。资源内含基于STM32F10x的完整工程&#xff0c;涵盖TypeA/TypeB寻卡流程、PcdRequest等函数调用、S…

作者头像 李华
网站建设 2026/9/9 22:33:37

自动化测试模型详解:线性、模块化、数据驱动与关键字驱动

做了快五年自动化测试&#xff0c;面试别人时我特别喜欢问一个问题&#xff1a;“你现在的脚本属于哪种测试模型&#xff1f;”十个人里有八个能讲清楚 Selenium 怎么定位元素&#xff0c;但问到这一句&#xff0c;一半人会愣住。因为很多人做自动化是“先跑起来再说”&#xf…

作者头像 李华
网站建设 2026/9/9 22:32:02

浪潮式发售读书笔记:拆解产品发售公式、序列邮件与种子用户策略

《浪潮式发售》这本书我在不同阶段翻过三遍&#xff0c;每一次都有新的理解。第一遍是把它当成营销书看&#xff0c;关注发邮件、搞预售的套路&#xff1b;第二遍是带着做产品的困惑去看&#xff0c;开始琢磨前后端产品怎么设计&#xff1b;第三遍是在我自己操盘过几次小型发售…

作者头像 李华