源码编译
从源代码构建 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 包:
- 配置构建—这会提示用户回答构建配置问题。
- 构建用于创建 pip 包的工具。
- 运行该工具以创建 pip 包。
- 调整容器外部文件的所有权。
./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
Version | CPU/GPU | Python version | Compiler | Build tools | cuDNN | CUDA |
---|---|---|---|---|---|---|
tensorflow-1.10.0 | CPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | N/A | N/A |
tensorflow_gpu-1.10.0 | GPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow-1.9.0 | CPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.11.0 | N/A | N/A |
tensorflow_gpu-1.9.0 | GPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.11.0 | 7 | 9 |
tensorflow-1.8.0 | CPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 | N/A | N/A |
tensorflow_gpu-1.8.0 | GPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow-1.7.0 | CPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 | N/A | N/A |
tensorflow_gpu-1.7.0 | GPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow-1.6.0 | CPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | N/A | N/A |
tensorflow_gpu-1.6.0 | GPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow-1.5.0 | CPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.8.0 | N/A | N/A |
tensorflow_gpu-1.5.0 | GPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.8.0 | 7 | 9 |
tensorflow-1.4.0 | CPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.5.4 | N/A | N/A |
tensorflow_gpu-1.4.0 | GPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.5.4 | 6 | 8 |
tensorflow-1.3.0 | CPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | N/A | N/A |
tensorflow_gpu-1.3.0 | GPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 6 | 8 |
tensorflow-1.2.0 | CPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | N/A | N/A |
tensorflow_gpu-1.2.0 | GPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 5.1 | 8 |
tensorflow-1.1.0 | CPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | N/A | N/A |
tensorflow_gpu-1.1.0 | GPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
tensorflow-1.0.0 | CPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | N/A | N/A |
tensorflow_gpu-1.0.0 | GPU | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
macOS
Version | CPU/GPU | Python version | Compiler | Build tools | cuDNN | CUDA |
---|---|---|---|---|---|---|
tensorflow-1.10.0 | CPU | 2.7, 3.3-3.6 | Clang from xcode | Bazel 0.15.0 | N/A | N/A |
tensorflow-1.9.0 | CPU | 2.7, 3.3-3.6 | Clang from xcode | Bazel 0.11.0 | N/A | N/A |
tensorflow-1.8.0 | CPU | 2.7, 3.3-3.6 | Clang from xcode | Bazel 0.10.1 | N/A | N/A |
tensorflow-1.7.0 | CPU | 2.7, 3.3-3.6 | Clang from xcode | Bazel 0.10.1 | N/A | N/A |
tensorflow-1.6.0 | CPU | 2.7, 3.3-3.6 | Clang from xcode | Bazel 0.8.1 | N/A | N/A |
tensorflow-1.5.0 | CPU | 2.7, 3.3-3.6 | Clang from xcode | Bazel 0.8.1 | N/A | N/A |
tensorflow-1.4.0 | CPU | 2.7, 3.3-3.6 | Clang from xcode | Bazel 0.5.4 | N/A | N/A |
tensorflow-1.3.0 | CPU | 2.7, 3.3-3.6 | Clang from xcode | Bazel 0.4.5 | N/A | N/A |
tensorflow-1.2.0 | CPU | 2.7, 3.3-3.6 | Clang from xcode | Bazel 0.4.5 | N/A | N/A |
tensorflow-1.1.0 | CPU | 2.7, 3.3-3.6 | Clang from xcode | Bazel 0.4.2 | N/A | N/A |
tensorflow_gpu-1.1.0 | GPU | 2.7, 3.3-3.6 | Clang from xcode | Bazel 0.4.2 | 5.1 | 8 |
tensorflow-1.0.0 | CPU | 2.7, 3.3-3.6 | Clang from xcode | Bazel 0.4.2 | N/A | N/A |
tensorflow_gpu-1.0.0 | GPU | 2.7, 3.3-3.6 | Clang from xcode | Bazel 0.4.2 | 5.1 | 8 |