从源代码构建

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

Linux 和 macOS 设置

安装以下构建工具以配置您的开发环境。

安装 Python 和 TensorFlow 软件包依赖项

Ubuntu

sudo apt install python3-dev python3-pip

macOS

需要 Xcode 9.2 或更高版本。

使用 Homebrew 包管理器安装

brew install python

安装 TensorFlow pip 软件包依赖项(如果使用虚拟环境,请省略 --user 参数)

pip install -U --user pip

安装 Bazel

要构建 TensorFlow,您需要安装 Bazel。 Bazelisk 是一种简单的方法来安装 Bazel,它会自动下载 TensorFlow 的正确 Bazel 版本。为了方便使用,将 Bazelisk 添加为 PATH 中的 bazel 可执行文件。

如果 Bazelisk 不可用,您可以手动 安装 Bazel。请确保从 TensorFlow 的 .bazelversion 文件中安装正确的 Bazel 版本。

Clang 是一种基于 LLVM 的 C/C++/Objective-C 编译器,它用 C++ 编写。从 TensorFlow 2.13 开始,它是构建 TensorFlow 的默认编译器。当前支持的版本是 LLVM/Clang 17。

LLVM Debian/Ubuntu nightly packages 提供自动安装脚本和用于在 Linux 上手动安装的软件包。如果您手动将 llvm apt 存储库添加到您的软件包源,请确保运行以下命令

sudo apt-get update && sudo apt-get install -y llvm-17 clang-17

现在 /usr/lib/llvm-17/bin/clang 是在这种情况下 clang 的实际路径。

或者,您可以下载并解压缩预构建的 Clang + LLVM 17

以下是在 Debian/Ubuntu 操作系统上设置下载的 Clang + LLVM 17 二进制文件的步骤示例

  1. 更改到所需的目录:cd <desired directory>

  2. 加载并解压缩存档文件...(适合您的体系结构)

    wget https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.2/clang+llvm-17.0.2-x86_64-linux-gnu-ubuntu-22.04.tar.xz
    
    tar -xvf clang+llvm-17.0.2-x86_64-linux-gnu-ubuntu-22.04.tar.xz
    
    

  3. 将解压缩的内容(目录和文件)复制到 /usr(您可能需要 sudo 权限,并且正确的目录可能因发行版而异)。这实际上安装了 Clang 和 LLVM,并将其添加到路径中。您不应该替换任何东西,除非您有以前的安装,在这种情况下,您应该替换文件

    cp -r clang+llvm-17.0.2-x86_64-linux-gnu-ubuntu-22.04/* /usr
    

  4. 检查获得的 Clang + LLVM 17 二进制文件版本

    clang --version
    

  5. 现在 /usr/bin/clang 是您新 clang 的实际路径。您可以运行 ./configure 脚本或手动设置环境变量 CCBAZEL_COMPILER 到此路径。

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

macOS 没有 GPU 支持。

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

下载 TensorFlow 源代码

使用 Git 克隆 TensorFlow 存储库

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

存储库默认使用 master 开发分支。您也可以签出 发布分支 来构建

git checkout branch_name  # r2.2, r2.3, etc.

配置构建

TensorFlow 构建由存储库根目录中的 .bazelrc 文件配置。可以使用 ./configure./configure.py 脚本调整常见设置。

请从存储库的根目录运行 ./configure 脚本。此脚本将提示您输入 TensorFlow 依赖项的位置,并询问其他构建配置选项(例如编译器标志)。有关详细信息,请参阅示例会话部分。

./configure

该脚本也有一个 Python 版本,./configure.py。如果使用虚拟环境,python configure.py 会优先考虑环境中的路径,而 ./configure 会优先考虑环境外的路径。在这两种情况下,您都可以更改默认设置。

示例会话

以下是 ./configure 脚本的示例运行(您的会话可能有所不同)

配置选项

GPU 支持

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

优化

对于编译优化标志,默认值(-march=native)会针对您机器的 CPU 类型优化生成的代码。但是,如果要为不同的 CPU 类型构建 TensorFlow,请考虑使用更具体的优化标志。查看 GCC 手册 以获取示例。

预配置配置

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

  • --config=dbg — 使用调试信息构建。有关详细信息,请参阅 CONTRIBUTING.md
  • --config=mkl — 支持 Intel® MKL-DNN
  • --config=monolithic — 用于大部分静态、单片构建的配置。

构建和安装 pip 包

Bazel 构建选项

有关 构建选项,请参阅 Bazel 命令行参考

从源代码构建 TensorFlow 可能需要大量 RAM。如果您的系统内存受限,请使用以下命令限制 Bazel 的 RAM 使用量:--local_ram_resources=2048

官方 TensorFlow 包 使用符合 manylinux2014 包标准的 Clang 工具链构建。

构建包

要构建 pip 包,您需要指定 --repo_env=WHEEL_NAME 标志。根据提供的名称,将创建包,例如

要构建 tensorflow CPU 包

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_cpu

要构建 tensorflow GPU 包

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow --config=cuda

要构建 tensorflow TPU 包

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_tpu --config=tpu

要构建 nightly 包,请设置 tf_nightly 而不是 tensorflow,例如要构建 CPU nightly 包

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tf_nightly_cpu

结果,生成的 wheel 将位于

bazel-bin/tensorflow/tools/pip_package/wheel_house/

安装包

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

pip install bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl

Docker Linux 构建

TensorFlow 的 Docker 开发镜像是设置环境以从源代码构建 Linux 包的简便方法。这些镜像已经包含构建 TensorFlow 所需的源代码和依赖项。转到 TensorFlow Docker 指南 以获取安装说明和 可用镜像标签列表

仅 CPU

以下示例使用 :devel 镜像从最新的 TensorFlow 源代码构建仅 CPU 包。查看 Docker 指南 以获取可用的 TensorFlow -devel 标签。

下载最新的开发镜像并启动一个 Docker 容器,您将使用它来构建 pip

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

git pull  # within the container, download the latest source code

上面的 docker run 命令在 /tensorflow_src 目录(源代码树的根目录)中启动一个 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:devel bash

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

  1. 可选:配置构建 - 这将提示用户回答构建配置问题。
  2. 构建 pip 包。
  3. 调整文件的所有权权限,以便在容器外部使用。
./configure  # if necessary

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_cpu --config=opt
`
chown $HOST_PERMS bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl

在容器中安装并验证包

pip uninstall tensorflow  # remove current version

pip install bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl
cd /tmp  # don't import from source directory
python -c "import tensorflow as tf; print(tf.__version__)"

在您的主机上,TensorFlow pip 包位于当前目录(具有主机用户权限):./tensorflow-version-tags.whl

GPU 支持

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

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

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

然后,在容器的虚拟环境中,使用 GPU 支持构建 TensorFlow 包

./configure  # if necessary

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow --config=cuda --config=opt

chown $HOST_PERMS bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl

在容器中安装并验证包,并检查 GPU

pip uninstall tensorflow  # remove current version

pip install bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl
cd /tmp  # don't import from source directory
python -c "import tensorflow as tf; print(\"Num GPUs Available: \", len(tf.config.list_physical_devices('GPU')))"

经过测试的构建配置

Linux

CPU

版本Python 版本编译器构建工具
tensorflow-2.16.13.9-3.12Clang 17.0.6Bazel 6.5.0
tensorflow-2.15.03.9-3.11Clang 16.0.0Bazel 6.1.0
tensorflow-2.14.03.9-3.11Clang 16.0.0Bazel 6.1.0
tensorflow-2.13.03.8-3.11Clang 16.0.0Bazel 5.3.0
tensorflow-2.12.03.8-3.11GCC 9.3.1Bazel 5.3.0
tensorflow-2.11.03.7-3.10GCC 9.3.1Bazel 5.3.0
tensorflow-2.10.03.7-3.10GCC 9.3.1Bazel 5.1.1
tensorflow-2.9.03.7-3.10GCC 9.3.1Bazel 5.0.0
tensorflow-2.8.03.7-3.10GCC 7.3.1Bazel 4.2.1
tensorflow-2.7.03.7-3.9GCC 7.3.1Bazel 3.7.2
tensorflow-2.6.03.6-3.9GCC 7.3.1Bazel 3.7.2
tensorflow-2.5.03.6-3.9GCC 7.3.1Bazel 3.7.2
tensorflow-2.4.03.6-3.8GCC 7.3.1Bazel 3.1.0
tensorflow-2.3.03.5-3.8GCC 7.3.1Bazel 3.1.0
tensorflow-2.2.03.5-3.8GCC 7.3.1Bazel 2.0.0
tensorflow-2.1.02.7, 3.5-3.7GCC 7.3.1Bazel 0.27.1
tensorflow-2.0.02.7, 3.3-3.7GCC 7.3.1Bazel 0.26.1
tensorflow-1.15.02.7, 3.3-3.7GCC 7.3.1Bazel 0.26.1
tensorflow-1.14.02.7, 3.3-3.7GCC 4.8Bazel 0.24.1
tensorflow-1.13.12.7, 3.3-3.7GCC 4.8Bazel 0.19.2
tensorflow-1.12.02.7, 3.3-3.6GCC 4.8Bazel 0.15.0
tensorflow-1.11.02.7, 3.3-3.6GCC 4.8Bazel 0.15.0
tensorflow-1.10.02.7, 3.3-3.6GCC 4.8Bazel 0.15.0
tensorflow-1.9.02.7, 3.3-3.6GCC 4.8Bazel 0.11.0
tensorflow-1.8.02.7, 3.3-3.6GCC 4.8Bazel 0.10.0
tensorflow-1.7.02.7, 3.3-3.6GCC 4.8Bazel 0.10.0
tensorflow-1.6.02.7, 3.3-3.6GCC 4.8Bazel 0.9.0
tensorflow-1.5.02.7, 3.3-3.6GCC 4.8Bazel 0.8.0
tensorflow-1.4.02.7, 3.3-3.6GCC 4.8Bazel 0.5.4
tensorflow-1.3.02.7, 3.3-3.6GCC 4.8Bazel 0.4.5
tensorflow-1.2.02.7, 3.3-3.6GCC 4.8Bazel 0.4.5
tensorflow-1.1.02.7, 3.3-3.6GCC 4.8Bazel 0.4.2
tensorflow-1.0.02.7, 3.3-3.6GCC 4.8Bazel 0.4.2

GPU

版本Python 版本编译器构建工具cuDNNCUDA
tensorflow-2.16.13.9-3.12Clang 17.0.6Bazel 6.5.08.912.3
tensorflow-2.15.03.9-3.11Clang 16.0.0Bazel 6.1.08.912.2
tensorflow-2.14.03.9-3.11Clang 16.0.0Bazel 6.1.08.711.8
tensorflow-2.13.03.8-3.11Clang 16.0.0Bazel 5.3.08.611.8
tensorflow-2.12.03.8-3.11GCC 9.3.1Bazel 5.3.08.611.8
tensorflow-2.11.03.7-3.10GCC 9.3.1Bazel 5.3.08.111.2
tensorflow-2.10.03.7-3.10GCC 9.3.1Bazel 5.1.18.111.2
tensorflow-2.9.03.7-3.10GCC 9.3.1Bazel 5.0.08.111.2
tensorflow-2.8.03.7-3.10GCC 7.3.1Bazel 4.2.18.111.2
tensorflow-2.7.03.7-3.9GCC 7.3.1Bazel 3.7.28.111.2
tensorflow-2.6.03.6-3.9GCC 7.3.1Bazel 3.7.28.111.2
tensorflow-2.5.03.6-3.9GCC 7.3.1Bazel 3.7.28.111.2
tensorflow-2.4.03.6-3.8GCC 7.3.1Bazel 3.1.08.011.0
tensorflow-2.3.03.5-3.8GCC 7.3.1Bazel 3.1.07.610.1
tensorflow-2.2.03.5-3.8GCC 7.3.1Bazel 2.0.07.610.1
tensorflow-2.1.02.7, 3.5-3.7GCC 7.3.1Bazel 0.27.17.610.1
tensorflow-2.0.02.7, 3.3-3.7GCC 7.3.1Bazel 0.26.17.410.0
tensorflow_gpu-1.15.02.7, 3.3-3.7GCC 7.3.1Bazel 0.26.17.410.0
tensorflow_gpu-1.14.02.7, 3.3-3.7GCC 4.8Bazel 0.24.17.410.0
tensorflow_gpu-1.13.12.7, 3.3-3.7GCC 4.8Bazel 0.19.27.410.0
tensorflow_gpu-1.12.02.7, 3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.11.02.7, 3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.10.02.7, 3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.9.02.7, 3.3-3.6GCC 4.8Bazel 0.11.079
tensorflow_gpu-1.8.02.7, 3.3-3.6GCC 4.8Bazel 0.10.079
tensorflow_gpu-1.7.02.7, 3.3-3.6GCC 4.8Bazel 0.9.079
tensorflow_gpu-1.6.02.7, 3.3-3.6GCC 4.8Bazel 0.9.079
tensorflow_gpu-1.5.02.7, 3.3-3.6GCC 4.8Bazel 0.8.079
tensorflow_gpu-1.4.02.7, 3.3-3.6GCC 4.8Bazel 0.5.468
tensorflow_gpu-1.3.02.7, 3.3-3.6GCC 4.8Bazel 0.4.568
tensorflow_gpu-1.2.02.7, 3.3-3.6GCC 4.8Bazel 0.4.55.18
tensorflow_gpu-1.1.02.7, 3.3-3.6GCC 4.8Bazel 0.4.25.18
tensorflow_gpu-1.0.02.7, 3.3-3.6GCC 4.8Bazel 0.4.25.18

macOS

CPU

版本Python 版本编译器构建工具
tensorflow-2.16.13.9-3.12来自 xcode 13.6 的 ClangBazel 6.5.0
tensorflow-2.15.03.9-3.11来自 xcode 10.15 的 ClangBazel 6.1.0
tensorflow-2.14.03.9-3.11来自 xcode 10.15 的 ClangBazel 6.1.0
tensorflow-2.13.03.8-3.11来自 xcode 10.15 的 ClangBazel 5.3.0
tensorflow-2.12.03.8-3.11来自 xcode 10.15 的 ClangBazel 5.3.0
tensorflow-2.11.03.7-3.10来自 xcode 10.14 的 ClangBazel 5.3.0
tensorflow-2.10.03.7-3.10来自 xcode 10.14 的 ClangBazel 5.1.1
tensorflow-2.9.03.7-3.10来自 xcode 10.14 的 ClangBazel 5.0.0
tensorflow-2.8.03.7-3.10来自 xcode 10.14 的 ClangBazel 4.2.1
tensorflow-2.7.03.7-3.9来自 xcode 10.11 的 ClangBazel 3.7.2
tensorflow-2.6.03.6-3.9来自 xcode 10.11 的 ClangBazel 3.7.2
tensorflow-2.5.03.6-3.9来自 xcode 10.11 的 ClangBazel 3.7.2
tensorflow-2.4.03.6-3.8来自 xcode 10.3 的 ClangBazel 3.1.0
tensorflow-2.3.03.5-3.8来自 xcode 10.1 的 ClangBazel 3.1.0
tensorflow-2.2.03.5-3.8来自 xcode 10.1 的 ClangBazel 2.0.0
tensorflow-2.1.02.7, 3.5-3.7来自 xcode 10.1 的 ClangBazel 0.27.1
tensorflow-2.0.02.7, 3.5-3.7来自 xcode 10.1 的 ClangBazel 0.27.1
tensorflow-2.0.02.7, 3.3-3.7来自 xcode 10.1 的 ClangBazel 0.26.1
tensorflow-1.15.02.7, 3.3-3.7来自 xcode 10.1 的 ClangBazel 0.26.1
tensorflow-1.14.02.7, 3.3-3.7来自 xcode 的 ClangBazel 0.24.1
tensorflow-1.13.12.7, 3.3-3.7来自 xcode 的 ClangBazel 0.19.2
tensorflow-1.12.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.15.0
tensorflow-1.11.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.15.0
tensorflow-1.10.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.15.0
tensorflow-1.9.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.11.0
tensorflow-1.8.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.10.1
tensorflow-1.7.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.10.1
tensorflow-1.6.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.8.1
tensorflow-1.5.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.8.1
tensorflow-1.4.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.5.4
tensorflow-1.3.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.4.5
tensorflow-1.2.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.4.5
tensorflow-1.1.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.4.2
tensorflow-1.0.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.4.2

GPU

版本Python 版本编译器构建工具cuDNNCUDA
tensorflow_gpu-1.1.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.4.25.18
tensorflow_gpu-1.0.02.7, 3.3-3.6来自 xcode 的 ClangBazel 0.4.25.18