从源代码构建 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(推荐,仅限 Linux)
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 二进制文件的步骤示例
更改到所需的目录:
cd <desired directory>
加载并解压缩存档文件...(适合您的体系结构)
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
将解压缩的内容(目录和文件)复制到
/usr
(您可能需要 sudo 权限,并且正确的目录可能因发行版而异)。这实际上安装了 Clang 和 LLVM,并将其添加到路径中。您不应该替换任何东西,除非您有以前的安装,在这种情况下,您应该替换文件cp -r clang+llvm-17.0.2-x86_64-linux-gnu-ubuntu-22.04/* /usr
检查获得的 Clang + LLVM 17 二进制文件版本
clang --version
现在
/usr/bin/clang
是您新 clang 的实际路径。您可以运行./configure
脚本或手动设置环境变量CC
和BAZEL_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 构建选项
从源代码构建 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 包
- 可选:配置构建 - 这将提示用户回答构建配置问题。
- 构建 pip 包。
- 调整文件的所有权权限,以便在容器外部使用。
./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.1 | 3.9-3.12 | Clang 17.0.6 | Bazel 6.5.0 |
tensorflow-2.15.0 | 3.9-3.11 | Clang 16.0.0 | Bazel 6.1.0 |
tensorflow-2.14.0 | 3.9-3.11 | Clang 16.0.0 | Bazel 6.1.0 |
tensorflow-2.13.0 | 3.8-3.11 | Clang 16.0.0 | Bazel 5.3.0 |
tensorflow-2.12.0 | 3.8-3.11 | GCC 9.3.1 | Bazel 5.3.0 |
tensorflow-2.11.0 | 3.7-3.10 | GCC 9.3.1 | Bazel 5.3.0 |
tensorflow-2.10.0 | 3.7-3.10 | GCC 9.3.1 | Bazel 5.1.1 |
tensorflow-2.9.0 | 3.7-3.10 | GCC 9.3.1 | Bazel 5.0.0 |
tensorflow-2.8.0 | 3.7-3.10 | GCC 7.3.1 | Bazel 4.2.1 |
tensorflow-2.7.0 | 3.7-3.9 | GCC 7.3.1 | Bazel 3.7.2 |
tensorflow-2.6.0 | 3.6-3.9 | GCC 7.3.1 | Bazel 3.7.2 |
tensorflow-2.5.0 | 3.6-3.9 | GCC 7.3.1 | Bazel 3.7.2 |
tensorflow-2.4.0 | 3.6-3.8 | GCC 7.3.1 | Bazel 3.1.0 |
tensorflow-2.3.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 3.1.0 |
tensorflow-2.2.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 2.0.0 |
tensorflow-2.1.0 | 2.7, 3.5-3.7 | GCC 7.3.1 | Bazel 0.27.1 |
tensorflow-2.0.0 | 2.7, 3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 |
tensorflow-1.15.0 | 2.7, 3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 |
tensorflow-1.14.0 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.24.1 |
tensorflow-1.13.1 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.19.2 |
tensorflow-1.12.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.11.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.10.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.9.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.11.0 |
tensorflow-1.8.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
tensorflow-1.7.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
tensorflow-1.6.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 |
tensorflow-1.5.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.8.0 |
tensorflow-1.4.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.5.4 |
tensorflow-1.3.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
tensorflow-1.2.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
tensorflow-1.1.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |
tensorflow-1.0.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |
GPU
版本 | Python 版本 | 编译器 | 构建工具 | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow-2.16.1 | 3.9-3.12 | Clang 17.0.6 | Bazel 6.5.0 | 8.9 | 12.3 |
tensorflow-2.15.0 | 3.9-3.11 | Clang 16.0.0 | Bazel 6.1.0 | 8.9 | 12.2 |
tensorflow-2.14.0 | 3.9-3.11 | Clang 16.0.0 | Bazel 6.1.0 | 8.7 | 11.8 |
tensorflow-2.13.0 | 3.8-3.11 | Clang 16.0.0 | Bazel 5.3.0 | 8.6 | 11.8 |
tensorflow-2.12.0 | 3.8-3.11 | GCC 9.3.1 | Bazel 5.3.0 | 8.6 | 11.8 |
tensorflow-2.11.0 | 3.7-3.10 | GCC 9.3.1 | Bazel 5.3.0 | 8.1 | 11.2 |
tensorflow-2.10.0 | 3.7-3.10 | GCC 9.3.1 | Bazel 5.1.1 | 8.1 | 11.2 |
tensorflow-2.9.0 | 3.7-3.10 | GCC 9.3.1 | Bazel 5.0.0 | 8.1 | 11.2 |
tensorflow-2.8.0 | 3.7-3.10 | GCC 7.3.1 | Bazel 4.2.1 | 8.1 | 11.2 |
tensorflow-2.7.0 | 3.7-3.9 | GCC 7.3.1 | Bazel 3.7.2 | 8.1 | 11.2 |
tensorflow-2.6.0 | 3.6-3.9 | GCC 7.3.1 | Bazel 3.7.2 | 8.1 | 11.2 |
tensorflow-2.5.0 | 3.6-3.9 | GCC 7.3.1 | Bazel 3.7.2 | 8.1 | 11.2 |
tensorflow-2.4.0 | 3.6-3.8 | GCC 7.3.1 | Bazel 3.1.0 | 8.0 | 11.0 |
tensorflow-2.3.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 3.1.0 | 7.6 | 10.1 |
tensorflow-2.2.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 2.0.0 | 7.6 | 10.1 |
tensorflow-2.1.0 | 2.7, 3.5-3.7 | GCC 7.3.1 | Bazel 0.27.1 | 7.6 | 10.1 |
tensorflow-2.0.0 | 2.7, 3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 | 7.4 | 10.0 |
tensorflow_gpu-1.15.0 | 2.7, 3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 | 7.4 | 10.0 |
tensorflow_gpu-1.14.0 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.24.1 | 7.4 | 10.0 |
tensorflow_gpu-1.13.1 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.19.2 | 7.4 | 10.0 |
tensorflow_gpu-1.12.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.11.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.10.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.9.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.11.0 | 7 | 9 |
tensorflow_gpu-1.8.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 | 7 | 9 |
tensorflow_gpu-1.7.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.6.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.5.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.8.0 | 7 | 9 |
tensorflow_gpu-1.4.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.5.4 | 6 | 8 |
tensorflow_gpu-1.3.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 6 | 8 |
tensorflow_gpu-1.2.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 5.1 | 8 |
tensorflow_gpu-1.1.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
macOS
CPU
版本 | Python 版本 | 编译器 | 构建工具 |
---|---|---|---|
tensorflow-2.16.1 | 3.9-3.12 | 来自 xcode 13.6 的 Clang | Bazel 6.5.0 |
tensorflow-2.15.0 | 3.9-3.11 | 来自 xcode 10.15 的 Clang | Bazel 6.1.0 |
tensorflow-2.14.0 | 3.9-3.11 | 来自 xcode 10.15 的 Clang | Bazel 6.1.0 |
tensorflow-2.13.0 | 3.8-3.11 | 来自 xcode 10.15 的 Clang | Bazel 5.3.0 |
tensorflow-2.12.0 | 3.8-3.11 | 来自 xcode 10.15 的 Clang | Bazel 5.3.0 |
tensorflow-2.11.0 | 3.7-3.10 | 来自 xcode 10.14 的 Clang | Bazel 5.3.0 |
tensorflow-2.10.0 | 3.7-3.10 | 来自 xcode 10.14 的 Clang | Bazel 5.1.1 |
tensorflow-2.9.0 | 3.7-3.10 | 来自 xcode 10.14 的 Clang | Bazel 5.0.0 |
tensorflow-2.8.0 | 3.7-3.10 | 来自 xcode 10.14 的 Clang | Bazel 4.2.1 |
tensorflow-2.7.0 | 3.7-3.9 | 来自 xcode 10.11 的 Clang | Bazel 3.7.2 |
tensorflow-2.6.0 | 3.6-3.9 | 来自 xcode 10.11 的 Clang | Bazel 3.7.2 |
tensorflow-2.5.0 | 3.6-3.9 | 来自 xcode 10.11 的 Clang | Bazel 3.7.2 |
tensorflow-2.4.0 | 3.6-3.8 | 来自 xcode 10.3 的 Clang | Bazel 3.1.0 |
tensorflow-2.3.0 | 3.5-3.8 | 来自 xcode 10.1 的 Clang | Bazel 3.1.0 |
tensorflow-2.2.0 | 3.5-3.8 | 来自 xcode 10.1 的 Clang | Bazel 2.0.0 |
tensorflow-2.1.0 | 2.7, 3.5-3.7 | 来自 xcode 10.1 的 Clang | Bazel 0.27.1 |
tensorflow-2.0.0 | 2.7, 3.5-3.7 | 来自 xcode 10.1 的 Clang | Bazel 0.27.1 |
tensorflow-2.0.0 | 2.7, 3.3-3.7 | 来自 xcode 10.1 的 Clang | Bazel 0.26.1 |
tensorflow-1.15.0 | 2.7, 3.3-3.7 | 来自 xcode 10.1 的 Clang | Bazel 0.26.1 |
tensorflow-1.14.0 | 2.7, 3.3-3.7 | 来自 xcode 的 Clang | Bazel 0.24.1 |
tensorflow-1.13.1 | 2.7, 3.3-3.7 | 来自 xcode 的 Clang | Bazel 0.19.2 |
tensorflow-1.12.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.15.0 |
tensorflow-1.11.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.15.0 |
tensorflow-1.10.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.15.0 |
tensorflow-1.9.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.11.0 |
tensorflow-1.8.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.10.1 |
tensorflow-1.7.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.10.1 |
tensorflow-1.6.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.8.1 |
tensorflow-1.5.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.8.1 |
tensorflow-1.4.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.5.4 |
tensorflow-1.3.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.4.5 |
tensorflow-1.2.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.4.5 |
tensorflow-1.1.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.4.2 |
tensorflow-1.0.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.4.2 |
GPU
版本 | Python 版本 | 编译器 | 构建工具 | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow_gpu-1.1.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.4.2 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 2.7, 3.3-3.6 | 来自 xcode 的 Clang | Bazel 0.4.2 | 5.1 | 8 |