树莓派设备上编译tensorflow源代码

对 TensorFlow Raspbian package 进行交叉编译 (cross-compiling)。 交叉编译使用的平台与部署平台不同。 相较于在 Raspberry Pi 使用有限的 RAM 和相对较慢的处理器,我们更加建议在 Linux ,macOS 或 Windows 等功能更强大的主机上构建TensorFlow。

宿主机 (host) 设置

安装 Docker

为了简化依赖关系管理,构建脚本使用 Docker 来创建虚拟 Linux 开发环境进行编译。通过执行以下操作来验证您的 Docker 是否安装成功: docker run –rm hello-world。

具体安装过程请参考如何在 Ubuntu 20.04 上安装和使用 Docker

Docker使用方法

以 koa-demos 项目为例,介绍怎么写 Dockerfile 文件,实现让用户在 Docker 容器里面运行 Koa 框架。

1
2
git clone https://github.com/ruanyf/koa-demos.git
cd koa-demos

编写 Dockerfile 文件

首先,在项目的根目录下,新建一个文本文件.dockerignore,写入下面的内容。

1
2
3
.git
node_modules
npm-debug.log

上面代码表示,这三个路径要排除,不要打包进入 image 文件。如果你没有路径要排除,这个文件可以不新建。

然后,在项目的根目录下,新建一个文本文件 Dockerfile,写入下面的内容。

1
2
3
4
5
FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000

创建 image 文件

有了 Dockerfile 文件以后,就可以使用docker image build命令创建 image 文件了。

1
2
3
$ docker image build -t koa-demo .
# 或者
$ docker image build -t koa-demo:0.0.1 .

如果运行成功,就可以看到新生成的 image 文件koa-demo了。

1
docker image ls

生成容器

docker container run命令会从 image 文件生成容器。

1
2
3
$ docker container run -p 8000:3000 -it koa-demo /bin/bash
# 或者
$ docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash

下载 Tensorflow 源代码

使用 Git 克隆 TensorFlow:

1
2
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow

默认为 master 分支。您还可以签出要构建的 release 分支:

1
git checkout branch_name  # r1.9, r1.10, etc.

交叉编译源代码

交叉编译 TensorFlow 源代码,从而构建一个基于 ARM 指令的 Python pip 包。构建脚本启动 Docker 容器以进行编译。

生成tensorflow构建环境的Docker映像

使用如下命令获得所需Docker映像:

1
2
3
4
5
6
git clone https://github.com/lhelontra/tensorflow-on-arm.git
cd tensorflow-on-arm/build_tensorflow/

# 修改Dockerfile.bullseye,加上代理
# ENV http_proxy=http://x.x.x.x:xx https_proxy=http://x.x.x.x:xx
docker build -t tf-arm -f Dockerfile.bullseye .

启动容器

使用如下命令:

1
docker run -it -v /tmp/tensorflow_pkg/:/tmp/tensorflow_pkg/ --env TF_PYTHON_VERSION=3.8 tf-arm ./build_tensorflow.sh configs/<conf-name> # rpi.conf, rk3399.conf ...

交叉编译tensorflow

使用如下命令交叉编译tensorflow:

1
2
3
4
5
6
7
8
9
10
11
12
# Docker容器内设置全局代理
export http_proxy=http://x.x.x.x:xx
export https_proxy=http://x.x.x.x:xx


# 交叉编译tensorflow
cd build_tensorflow/
chmod +x build_tensorflow.sh
TF_PYTHON_VERSION=3.7 ./build_tensorflow.sh <path-of-config> [noclean]

# Copying files from Docker container to host
sudo docker cp 820e780536b6:/tmp/tensorflow_pkg/tensorflow-2.3.0-cp37-none-linux_armv7l.whl ./

参考链接

  1. 在树莓派设备上编译 tensorflow 源代码 ,by tensorflow.
  2. Docker 入门教程,by 阮一峰.
  3. 如何在 Ubuntu 20.04 上安装和使用 Docker,by 雪梦科技.
  4. Ubuntu 20.04系统下更改apt源为阿里源,by 一缕诗风.
  5. docker:containerd.io docker-ce-cli docker-ce 的区别,by 非正经研究生.
  6. [Why does “drm:vmw_host_log [vmwgfx]] ERROR Failed to send host log message” show up and what can I do to fix it?](https://unix.stackexchange.com/questions/502540/why-does-drmvmw-host-log-vmwgfx-error-failed-to-send-host-log-message-sh),by stackexchange.
  7. 交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别,by 左手牛奶,右手面包.
  8. 基于源代码为树莓派设备构建 TensorFlow,by Spoony.
  9. Docker — 从入门到实践,by yeasy.
  10. 史上讲解最好的 Docker 教程,从入门到精通(建议收藏的教程),by 周辰晨.
  11. Docker篇之镜像打标签tag,by 听说唐僧不吃肉.
  12. Docker容器内设置全局代理,by Liao.
  13. Bazel入门:编译C++项目,by Elaine_Bao.