从源代码构建TensorFlow流程记录
字数 2432 2025-08-11 08:35:36

从源代码构建TensorFlow详细指南

为什么需要从源代码构建TensorFlow

通常情况下,直接安装预构建的.whl包即可使用TensorFlow。但在以下情况下需要从源代码构建:

  1. 需要特殊配置选项
  2. 想了解TensorFlow构建过程
  3. 需要修改TensorFlow源代码
  4. 为特定平台优化性能

准备工作

系统要求

  • 操作系统:Ubuntu 18.04(本文示例)
  • Python版本:根据TensorFlow版本选择(参考文末版本对照表)
  • 编译器:GCC(版本根据TensorFlow版本选择)

安装Bazel

TensorFlow使用Google的开源构建工具Bazel构建,版本必须与TensorFlow版本严格匹配。

  1. 根据计划构建的TensorFlow版本,查阅文末的版本对照表确定Bazel版本
  2. 下载对应版本的Bazel安装包(以0.26.1为例):
wget https://github.com/bazelbuild/bazel/releases/download/0.26.1/bazel-0.26.1-installer-linux-x86_64.sh
chmod +x bazel-0.26.1-installer-linux-x86_64.sh
./bazel-0.26.1-installer-linux-x86_64.sh --user
  1. 将Bazel添加到PATH环境变量

获取TensorFlow源代码

  1. 克隆TensorFlow仓库:
git clone https://github.com/tensorflow/tensorflow
cd tensorflow
  1. 切换到特定版本(以v1.14.0为例):
git checkout v1.14.0

可选调整

使用C++17标准构建

如果依赖库需要C++17,需要进行以下修改:

  1. 修改.bazelrc文件中的C++17配置:
# 修改前
- build:c++17 --cxxopt=-std=c++1z
- build:c++17 --cxxopt=-stdlib=libc++

# 修改后
+ build:c++17 --cxxopt=-std=c++17
  1. tensorflow/core/lib/gif/gif_io.cc中添加:
#include <cstring>
  1. tensorflow/stream_executor/stream_executor_pimpl.h中添加:
#include "absl/memory/memory.h"

解决网络问题

如果服务器无法从GitHub拉取依赖:

  1. 在网络良好的机器上下载所需依赖库的release包
  2. 将下载的包放到服务器本地目录
  3. 修改WORKSPACE文件,添加本地路径:
http_archive(
    name = "build_bazel_rules_apple",
    sha256 = "a045a436b642c70fb0c10ca84ff0fd2dcbd59cc89100d597a61e8374afafb366",
    urls = [
        "https://github.com/bazelbuild/rules_apple/releases/download/0.18.0/rules_apple.0.18.0.tar.gz",
        "file:///opt/tensorflow_build_deps/rules_apple.0.18.0.tar.gz"
    ],
)

配置构建选项

运行配置脚本:

./configure

示例配置(构建CPU版本):

WARNING: --batch mode is deprecated. Please instead explicitly shut down your Bazel server using the command "bazel shutdown".
You have bazel 0.26.1 installed.

Please specify the location of python. [Default is /usr/local/bin/python]: 
Found possible Python library paths:
  /usr/local/lib/python3.6/dist-packages
  /usr/lib/python3/dist-packages
Please input the desired Python library path to use. Default is [/usr/local/lib/python3.6/dist-packages] 

Do you wish to build TensorFlow with XLA JIT support? [Y/n]: n
No XLA JIT support will be enabled for TensorFlow.

Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: n
No OpenCL SYCL support will be enabled for TensorFlow.

Do you wish to build TensorFlow with ROCm support? [y/N]: n
No ROCm support will be enabled for TensorFlow.

Do you wish to build TensorFlow with CUDA support? [y/N]: n
No CUDA support will be enabled for TensorFlow.

Do you wish to download a fresh release of clang? (Experimental) [y/N]: n
Clang will not be downloaded.

Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native -Wno-sign-compare]: 

Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]: n
Not configuring the WORKSPACE for Android builds.

构建pip包

  1. 使用Bazel构建pip包:
bazel build --config=c++17 --jobs=6 //tensorflow/tools/pip_package:build_pip_package

参数说明:

  • --config=c++17:使用C++17标准构建
  • --jobs=6:并行任务数(根据机器配置调整)
  1. 生成.whl安装包:
./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

如需构建nightly版本:

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

安装TensorFlow

安装生成的whl包:

pip install /tmp/tensorflow_pkg/tensorflow-[version]-[tags].whl

版本对照表

Linux CPU版本

TensorFlow版本 Python版本 编译器 构建工具
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

Linux GPU版本

TensorFlow版本 Python版本 编译器 构建工具 cuDNN CUDA
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_gpu-1.14.0 2.7、3.3-3.7 GCC 4.8 Bazel 0.24.1 7.4 10.0

macOS CPU版本

TensorFlow版本 Python版本 编译器 构建工具
tensorflow-2.6.0 3.6-3.9 Xcode 10.11中的Clang Bazel 3.7.2
tensorflow-1.14.0 2.7、3.3-3.7 Xcode中的Clang Bazel 0.24.1

注意事项

  1. 构建过程耗时较长,建议在性能较好的机器上进行
  2. Bazel构建会消耗大量内存,谨慎设置--jobs参数
  3. 确保各组件版本严格匹配,特别是Bazel版本
  4. 网络问题可能导致依赖下载失败,可提前下载依赖包
  5. 构建GPU版本需要提前安装匹配版本的CUDA和cuDNN

通过以上步骤,您可以成功从源代码构建自定义的TensorFlow版本,满足特定需求或进行深度定制。

从源代码构建TensorFlow详细指南 为什么需要从源代码构建TensorFlow 通常情况下,直接安装预构建的 .whl 包即可使用TensorFlow。但在以下情况下需要从源代码构建: 需要特殊配置选项 想了解TensorFlow构建过程 需要修改TensorFlow源代码 为特定平台优化性能 准备工作 系统要求 操作系统 :Ubuntu 18.04(本文示例) Python版本 :根据TensorFlow版本选择(参考文末版本对照表) 编译器 :GCC(版本根据TensorFlow版本选择) 安装Bazel TensorFlow使用Google的开源构建工具Bazel构建,版本必须与TensorFlow版本严格匹配。 根据计划构建的TensorFlow版本,查阅文末的版本对照表确定Bazel版本 下载对应版本的Bazel安装包(以0.26.1为例): 将Bazel添加到PATH环境变量 获取TensorFlow源代码 克隆TensorFlow仓库: 切换到特定版本(以v1.14.0为例): 可选调整 使用C++17标准构建 如果依赖库需要C++17,需要进行以下修改: 修改 .bazelrc 文件中的C++17配置: 在 tensorflow/core/lib/gif/gif_io.cc 中添加: 在 tensorflow/stream_executor/stream_executor_pimpl.h 中添加: 解决网络问题 如果服务器无法从GitHub拉取依赖: 在网络良好的机器上下载所需依赖库的release包 将下载的包放到服务器本地目录 修改 WORKSPACE 文件,添加本地路径: 配置构建选项 运行配置脚本: 示例配置(构建CPU版本): 构建pip包 使用Bazel构建pip包: 参数说明: --config=c++17 :使用C++17标准构建 --jobs=6 :并行任务数(根据机器配置调整) 生成 .whl 安装包: 如需构建nightly版本: 安装TensorFlow 安装生成的whl包: 版本对照表 Linux CPU版本 | TensorFlow版本 | Python版本 | 编译器 | 构建工具 | |----------------|-----------|--------|----------| | 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 | Linux GPU版本 | TensorFlow版本 | Python版本 | 编译器 | 构建工具 | cuDNN | CUDA | |----------------|-----------|--------|----------|-------|------| | 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_ gpu-1.14.0 | 2.7、3.3-3.7 | GCC 4.8 | Bazel 0.24.1 | 7.4 | 10.0 | macOS CPU版本 | TensorFlow版本 | Python版本 | 编译器 | 构建工具 | |----------------|-----------|--------|----------| | tensorflow-2.6.0 | 3.6-3.9 | Xcode 10.11中的Clang | Bazel 3.7.2 | | tensorflow-1.14.0 | 2.7、3.3-3.7 | Xcode中的Clang | Bazel 0.24.1 | 注意事项 构建过程耗时较长,建议在性能较好的机器上进行 Bazel构建会消耗大量内存,谨慎设置 --jobs 参数 确保各组件版本严格匹配,特别是Bazel版本 网络问题可能导致依赖下载失败,可提前下载依赖包 构建GPU版本需要提前安装匹配版本的CUDA和cuDNN 通过以上步骤,您可以成功从源代码构建自定义的TensorFlow版本,满足特定需求或进行深度定制。