从源代码构建TensorFlow流程记录
字数 2432 2025-08-11 08:35:36
从源代码构建TensorFlow详细指南
为什么需要从源代码构建TensorFlow
通常情况下,直接安装预构建的.whl包即可使用TensorFlow。但在以下情况下需要从源代码构建:
- 需要特殊配置选项
- 想了解TensorFlow构建过程
- 需要修改TensorFlow源代码
- 为特定平台优化性能
准备工作
系统要求
- 操作系统:Ubuntu 18.04(本文示例)
- Python版本:根据TensorFlow版本选择(参考文末版本对照表)
- 编译器:GCC(版本根据TensorFlow版本选择)
安装Bazel
TensorFlow使用Google的开源构建工具Bazel构建,版本必须与TensorFlow版本严格匹配。
- 根据计划构建的TensorFlow版本,查阅文末的版本对照表确定Bazel版本
- 下载对应版本的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
- 将Bazel添加到PATH环境变量
获取TensorFlow源代码
- 克隆TensorFlow仓库:
git clone https://github.com/tensorflow/tensorflow
cd tensorflow
- 切换到特定版本(以v1.14.0为例):
git checkout v1.14.0
可选调整
使用C++17标准构建
如果依赖库需要C++17,需要进行以下修改:
- 修改
.bazelrc文件中的C++17配置:
# 修改前
- build:c++17 --cxxopt=-std=c++1z
- build:c++17 --cxxopt=-stdlib=libc++
# 修改后
+ build:c++17 --cxxopt=-std=c++17
- 在
tensorflow/core/lib/gif/gif_io.cc中添加:
#include <cstring>
- 在
tensorflow/stream_executor/stream_executor_pimpl.h中添加:
#include "absl/memory/memory.h"
解决网络问题
如果服务器无法从GitHub拉取依赖:
- 在网络良好的机器上下载所需依赖库的release包
- 将下载的包放到服务器本地目录
- 修改
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包
- 使用Bazel构建pip包:
bazel build --config=c++17 --jobs=6 //tensorflow/tools/pip_package:build_pip_package
参数说明:
--config=c++17:使用C++17标准构建--jobs=6:并行任务数(根据机器配置调整)
- 生成
.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 |
注意事项
- 构建过程耗时较长,建议在性能较好的机器上进行
- Bazel构建会消耗大量内存,谨慎设置
--jobs参数 - 确保各组件版本严格匹配,特别是Bazel版本
- 网络问题可能导致依赖下载失败,可提前下载依赖包
- 构建GPU版本需要提前安装匹配版本的CUDA和cuDNN
通过以上步骤,您可以成功从源代码构建自定义的TensorFlow版本,满足特定需求或进行深度定制。