在 RaspberryPi 上编译 TensorFlow

小 Pi 吃灰已久,突然就想再去买个摄像头,装到 Pi 上,然后装个 TensorFlow,搞一点好玩的东西出来。

然而官方并没有提供armV7上的预编译版本……所以天才第一步,在 RaspberryPi 上编译 TensorFlow。

网上大致可以找到几个教程,在这里稍微翻译和总结一下。

挂载 Swap 分区

Pi 的内存少有点小,不另外给个 Swap 分区的话极容易编译失败。下面给出两个方案,都比较简单易行:

再插个 U 盘

随便搞个 U 盘,在 Linux 下面删除所有分区,新建分区,类型为 Swap,确定,等待格式化完毕。

插到 Pi 上,如果能进入图形界面的话,找到磁盘管理工具,将 U 盘上的 Swap 分区挂载。如果没有图形环境,那么需要手动编辑 fstab 进行挂载。

在 SD 卡上分配一个 Swap 区

如果还没有将 / 进行扩容,那么使用磁盘工具在 SD 卡尾部划一个 2G 左右的 Swap 区,然后再进行 “扩容”。

如果已经扩容,那么需要使用 gparted 或者 parted 这个东西进行调整,划分出一个 Swap 区出来。

之后再写 fstab,永久挂载 Swap 分区。

安装依赖

同时推荐做一下这个:

其他依赖的话,缺什么补什么吧。

Bazel

好像是类似于 Make 的东西。

https://github.com/bazelbuild/bazel/releases 下载最新版。由于 Pi 是基于 arm 的,没有对应的打包,所以需要下载源代码包(bazel-X.X.X-dist.zip),然后自己编译。

解压缩,找到 scripts/bootstrap/compile.sh,找到下面的内容(位于第 117 行左右):

在后面加上 -J-Xmx500M,即改为

然后进行编译:

编译大概耗时 2 小时。编译完成后,执行

然后再执行

以完成安装。(第一次执行 bazel 会出现安装进度条,之后就不会再有了)

TensorFlow

首先获取源代码

切换到一个已知的版本上(例如 r1.4

据说 tf 默认会用 64 位的东西,用下面一句话可以强制其使用 32 位:

配置一下:

如果用 Python3 的话,使用 /usr/bin/python3

除了 jemallocY 之外,其余都选 N

编译 Python 版:

如果gcc版本较高,还需要按照官方说明,加上一句--cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"

如果想加快一点编译,可以使用 1024,2.0,1.0 或者 1024,4.0,1.0。如果怕编译崩溃,使用1024,0.5,1.0。大概耗时6小时。如果前面不加 Swap 区的话,这里极容易编译失败。

如果出现name 'sycl_library_path' is not defined错误,可以加上--incompatible_load_argument_is_label=false这个参数进行编译。

如果遇到session.run()崩溃的情况,去掉--copt="-mfpu=neon-vfpv4"再编译试试。

编译好之后,还要再生成 whl 包以便安装:

最后进行安装:

最后打开 python 做个验证:

后记

几个血的教训:

  1. 折腾这些东西之前,一定对整个 SD 卡打个备份包
  2. 一定要有 Swap,不然一定会 GG
    高峰情况下Swap占用接近1G
  3. 不建议去折腾GPU
  4. 建议睡觉的时候进行编译
    总用时

下载

自己编译好的都放在了Google云端硬盘上。戳这里查看并下载。

参考资料

  1. Installing TensorFlow from Sources
  2. Building TensorFlow for Raspberry Pi: a Step-By-Step Guide
  3. Building TensorFlow 1.3.0 as a standalone project (Raspberry pi 3 included)
  4. build issue: invalid paths

《在 RaspberryPi 上编译 TensorFlow》上有1条评论

  1. 不使用neon vfp, 速度会慢不少。
    至少我在树莓派上自己编译opencv是这样。
    我记得看过一篇博客说tf用上neon和vfp指令集也会快不少

发表评论

电子邮件地址不会被公开。 必填项已用*标注