Skip to content

源码编译

从源代码构建 TensorFlow pip 安装包并将其安装在 Ubuntu Linux 和 macOS 系统上。虽然这些说明可能适用于其他系统,但它仅针对 Ubuntu 和 macOS 进行测试和支持。

注意:我们已经为 Linux 和 macOS 系统提供了经过充分测试的,预先构建的 TensorFlow 软件包。

Linux 和 macOS 系统设置

安装以下编译工具来配置开发环境。

安装 Python 和 TensorFlow 的相关依赖包

Ubuntu

    sudo apt install python-dev python-pip  # or python3-dev python3-pip
    

mac OS

要求 Xcode 8.3 或者更新版本。

使用 Homebrew 包管理工具安装:

    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
    brew install python@2  # or python (Python 3)
  

安装 TensorFlow pip 安装包的依赖模块(如果使用虚拟环境,忽略 --user 参数):

  pip install -U --user pip six numpy wheel mock
  pip install -U --user keras_applications==1.0.5 --no-deps
  pip install -U --user keras_preprocessing==1.0.3 --no-deps

REQUIRED_PACKAGES 下的 setup.py 文件中罗列了所有的依赖包。

安装 Bazel

安装 Bazel,用于编译 TensorFlow 的构建工具。

将 Bazel 可执行文件的位置添加到 PATH 环境变量中。

安装 GPU 支持(可选项,仅支持 Linux)

GPU 现在还支持 macOS。

阅读 GPU 支持指南,以安装在 GPU 上运行 TensorFlow 所需的驱动程序和其它软件。

注意:设置一个支持 GPU 的 TensorFlow Docker 镜像更容易。

下载 TensorFlow 源码

使用 Git 克隆 TensorFlow 仓库

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

仓库默认是 master 开发分支。你可以检出 release 分支 来编译:

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

要测试源代码副本,请运行以下测试(这可能需要一段时间):

bazel test -c opt -- //tensorflow/... -//tensorflow/compiler/... -//tensorflow/contrib/lite/...

关键点:如果在最新的开发分支上遇到构建问题,请尝试已知可用的发布分支。

编译配置

在 TensorFlow 源码根目录下运行以下命令来配置系统编译参数:

./configure

此脚本会提示输入 TensorFlow 依赖项的位置,并询问其它编译配置选项(例如,编译器标志)。以下显示了 ./configure 的示例运行(你的会话可能不同):

配置选项

对于 GPU 支持,请指定 CUDA 和 cuDNN 的版本。如果系统安装了多个版本的 CUDA 或 cuDNN,请显式设置版本而不是依赖于默认版本。./configure 创建指向系统 CUDA 库的符号链接 — 因此,如果更新 CUDA 库路径,则必须在构建之前再次运行此配置步骤。

对于编译优化标志,默认(-march=native)优化机器 CPU 类型的生成代码。但是,如果为不同的 CPU 类型构建 TensorFlow,请考虑更具体的优化标志。有关示例,请参阅 GCC 手册

有一些预先配置的构建配置可以添加到 bazel build 命令中,例如:

  • --config=mk1 — 支持 Intel® MKL-DNN
  • --config=monolithic — 配置为静态统一编译。

注意:从 TensorFlow 1.6 开始,二进制文件使用 AVX 指令,这些指令可能无法在较旧的 CPU 上运行。

编译 pip 包

Bazel 编译

仅支持 CPU

使用 bazel 使 TensorFlow 包仅支持 CPU:

bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package

支持 GPU

使 TensorFlow 包支持 GPU:

bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

Bazel 编译选项

从源代码构建 TensorFlow 会使用大量的 RAM。如果系统受内存限制,请将 Bazel 的 RAM 使用限制为:--local_resources 2048,.5,1.0

官方 TensorFlow 软件包使用 GCC 4 构建并使用较旧的 ABI。对于 GCC 5 及更高版本,使用以下命令使您的构建与旧 ABI 兼容:--cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"。ABI 兼容性确保针对官方 TensorFlow 包构建的自定义操作继续与 GCC 5 构建的包一起使用。

编译包

bazel build 命令创建一个名为 build_pip_package 的可执行文件 — 这是构建 pip 包的程序。例如,下面在 /tmp/tensorflow_pkg 目录中构建一个 .whl 包:

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

虽然可以在同一源代码树下构建 CUDA 和非 CUDA 配置,但建议在同一源代码树中切换这两种配置时运行 bazel clean

安装包

生成的 .whl 文件的文件名取决于 TensorFlow 版本和您的平台。使用 pip install 来安装软件包,例如:

pip install /tmp/tensorflow_pkg/tensorflow-version-cp27-cp27mu-linux_x86_64.whl

成功:TensorFlow 已安装。

Docker Linux 编译

TensorFlow 的 Docker 开发镜像是一种设置环境以从源代码构建 Linux 包的简单方法。这些镜像已包含构建 TensorFlow 所需的源代码和依赖项。请参阅 TensorFlow Docker 指南进行安装,并查看可用镜像标签列表

仅支持 CPU

以下示例使用 :nightly-devel 镜像从最新的 TensorFlow 源代码编译仅支持 CPU 的 Python 2 的安装包。有关可用的 TensorFlow -devel 标签,请参阅 Docker 指南

下载最新的开发镜像并启动我们将用于构建 pip 包的 Docker 容器:

  docker pull tensorflow/tensorflow:nightly-devel
  docker run -it -w /tensorflow -v $PWD:/mnt -e HOST_PERMS="$(id -u):$(id -g)" \
      tensorflow/tensorflow:nightly-devel bash
  git pull  # within the container, download the latest source code

上面的 docker run 命令将在源代码的根目录 /tensorflow 中启动一个 shell — 源代码的根目录。它将主机的当前目录安装在容器的 /mnt 中,并通过环境变量将主机用户的信息传递给容器(用于设置权限 — Docker 可以使这一点变得简单)。

或者,要在容器中构建主机上的 TensorFlow 副本,请将主机的源码目录树挂载到容器的 /tensorflow 目录:

docker run -it -w /tensorflow -v /path/to/tensorflow:/tensorflow -v $PWD:/mnt \
    -e HOST_PERMS="$(id -u):$(id -g)" tensorflow/tensorflow:nightly-devel bash

设置源树后,在容器的虚拟环境中构建 TensorFlow 包:

  1. 配置构建—这会提示用户回答构建配置问题。
  2. 构建用于创建 pip 包的工具。
  3. 运行该工具以创建 pip 包。
  4. 调整容器外部文件的所有权。
  ./configure  # answer prompts or use defaults
  bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
  ./bazel-bin/tensorflow/tools/pip_package/build_pip_package /mnt  # create package
  chown $HOST_PERMS /mnt/tensorflow-version-cp27-cp27mu-linux_x86_64.whl

在容器中安装并验证包:

  pip uninstall tensorflow  # 卸载当前版本
  pip install /mnt/tensorflow-version-cp27-cp27mu-linux_x86_64.whl
  cd /tmp  # 不要从源目录导入
  python -c "import tensorflow as tf; print(tf.__version__)"

成功:TensorFlow 已安装。

在你的主机上,TensorFlow pip 包在当前的目录下(拥有主机使用者权限):./tensorflow-version-cp27-cp27mu-linux_x86_64.whl

支持 GPU

Docker 是为 TensorFlow 构建 GPU 支持的最简单方法,因为主机机器只需要 NVIDIA® 驱动程序 不需要安装 NVIDIA®CUDA®Toolkit。请参阅 GPU 支持指南和 TensorFlow Docker 指南以设置 nvidia-docker(仅限 Linux)。

下面的示例下载 TensorFlow :nightly-devel-gpu-py3 镜像,并使用 nvidia-docker 来运行支持 GPU 的容器。此开发镜像配置为构建具有 GPU 支持的 Python 3 pip 包:

  docker pull tensorflow/tensorflow:nightly-devel-gpu-py3
  docker run --runtime=nvidia -it -w /tensorflow -v $PWD:/mnt -e HOST_PERMS="$(id -u):$(id -g)" \
      tensorflow/tensorflow:nightly-devel-gpu-py3 bash

然后,在容器的虚拟环境中,构建具有 GPU 支持的 TensorFlow 包:

  ./configure  # answer prompts or use defaults

  bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

  ./bazel-bin/tensorflow/tools/pip_package/build_pip_package /mnt  # create package

  chown $HOST_PERMS /mnt/tensorflow-version-cp35-cp35m-linux_x86_64.whl

安装并验证容器中的包并检查 GPU:

  pip uninstall tensorflow  # remove current version

  pip install /mnt/tensorflow-version-cp27-cp27mu-linux_x86_64.whl
  cd /tmp  # don't import from source directory
  python -c "import tensorflow as tf; print(tf.contrib.eager.num_gpus())"

成功:TensorFlow 已安装。

测试编译配置

Linux

VersionCPU/GPUPython versionCompilerBuild toolscuDNNCUDA
tensorflow-1.10.0CPU2.7, 3.3-3.6GCC 4.8Bazel 0.15.0N/AN/A
tensorflow_gpu-1.10.0GPU2.7, 3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow-1.9.0CPU2.7, 3.3-3.6GCC 4.8Bazel 0.11.0N/AN/A
tensorflow_gpu-1.9.0GPU2.7, 3.3-3.6GCC 4.8Bazel 0.11.079
tensorflow-1.8.0CPU2.7, 3.3-3.6GCC 4.8Bazel 0.10.0N/AN/A
tensorflow_gpu-1.8.0GPU2.7, 3.3-3.6GCC 4.8Bazel 0.9.079
tensorflow-1.7.0CPU2.7, 3.3-3.6GCC 4.8Bazel 0.10.0N/AN/A
tensorflow_gpu-1.7.0GPU2.7, 3.3-3.6GCC 4.8Bazel 0.9.079
tensorflow-1.6.0CPU2.7, 3.3-3.6GCC 4.8Bazel 0.9.0N/AN/A
tensorflow_gpu-1.6.0GPU2.7, 3.3-3.6GCC 4.8Bazel 0.9.079
tensorflow-1.5.0CPU2.7, 3.3-3.6GCC 4.8Bazel 0.8.0N/AN/A
tensorflow_gpu-1.5.0GPU2.7, 3.3-3.6GCC 4.8Bazel 0.8.079
tensorflow-1.4.0CPU2.7, 3.3-3.6GCC 4.8Bazel 0.5.4N/AN/A
tensorflow_gpu-1.4.0GPU2.7, 3.3-3.6GCC 4.8Bazel 0.5.468
tensorflow-1.3.0CPU2.7, 3.3-3.6GCC 4.8Bazel 0.4.5N/AN/A
tensorflow_gpu-1.3.0GPU2.7, 3.3-3.6GCC 4.8Bazel 0.4.568
tensorflow-1.2.0CPU2.7, 3.3-3.6GCC 4.8Bazel 0.4.5N/AN/A
tensorflow_gpu-1.2.0GPU2.7, 3.3-3.6GCC 4.8Bazel 0.4.55.18
tensorflow-1.1.0CPU2.7, 3.3-3.6GCC 4.8Bazel 0.4.2N/AN/A
tensorflow_gpu-1.1.0GPU2.7, 3.3-3.6GCC 4.8Bazel 0.4.25.18
tensorflow-1.0.0CPU2.7, 3.3-3.6GCC 4.8Bazel 0.4.2N/AN/A
tensorflow_gpu-1.0.0GPU2.7, 3.3-3.6GCC 4.8Bazel 0.4.25.18

macOS

VersionCPU/GPUPython versionCompilerBuild toolscuDNNCUDA
tensorflow-1.10.0CPU2.7, 3.3-3.6Clang from xcodeBazel 0.15.0N/AN/A
tensorflow-1.9.0CPU2.7, 3.3-3.6Clang from xcodeBazel 0.11.0N/AN/A
tensorflow-1.8.0CPU2.7, 3.3-3.6Clang from xcodeBazel 0.10.1N/AN/A
tensorflow-1.7.0CPU2.7, 3.3-3.6Clang from xcodeBazel 0.10.1N/AN/A
tensorflow-1.6.0CPU2.7, 3.3-3.6Clang from xcodeBazel 0.8.1N/AN/A
tensorflow-1.5.0CPU2.7, 3.3-3.6Clang from xcodeBazel 0.8.1N/AN/A
tensorflow-1.4.0CPU2.7, 3.3-3.6Clang from xcodeBazel 0.5.4N/AN/A
tensorflow-1.3.0CPU2.7, 3.3-3.6Clang from xcodeBazel 0.4.5N/AN/A
tensorflow-1.2.0CPU2.7, 3.3-3.6Clang from xcodeBazel 0.4.5N/AN/A
tensorflow-1.1.0CPU2.7, 3.3-3.6Clang from xcodeBazel 0.4.2N/AN/A
tensorflow_gpu-1.1.0GPU2.7, 3.3-3.6Clang from xcodeBazel 0.4.25.18
tensorflow-1.0.0CPU2.7, 3.3-3.6Clang from xcodeBazel 0.4.2N/AN/A
tensorflow_gpu-1.0.0GPU2.7, 3.3-3.6Clang from xcodeBazel 0.4.25.18
-->

基于 MIT 许可发布 共建 共享 共管