在 Windows 上编译源码
利用源码在 Windows 上构建 TensorFlow pip 包。
注意:我们已经为 Windows 系统提供了经过完善测试和预编译的 TensorFlow 包。
Windows 设置
安装下列编译工具来配置你的 Windows 开发环境。
安装 Python 和 TensorFlow 的依赖包
安装 Python 3.5.x 或者 Python 3.6.x 64-bit Windows 发行版。勾选 pip 安装选项并把它添加到 %PATH%
环境变量。
安装 TensorFlow pip 依赖包:
pip3 install six numpy wheel
pip3 install keras_applications==1.0.5 --no-deps
pip3 install keras_preprocessing==1.0.3 --no-deps
依赖项在 REQUIRED_PACKAGES
下的 setup.py
文件中列出。
安装 Bazel
安装 Bazel,TensorFlow 的编译工具。
将 Bazel 可执行文件的位置添加到 %PATH%
环境变量。
安装 MSYS2
安装 MSYS2,里面包含了编译 TensorFlow 需要用到的工具。如果 MSYS2 安装在 C:\msys64
路径,将 C:\msys64\usr\bin
添加到 %PATH%
环境变量。然后运行 cmd.exe
:
pacman -S git patch unzip
安装 Visual C++ Build Tools 2015
安装 Visual C++ build tools 2015。这个安装包属于 Visual Studio 2015,但可以被独立安装:
- 进入 Visual Studio 下载页面,
- 选择重发行包和编译工具,
- 下载 Microsoft Build Tools 2015 Update 3,
- 运行安装包。
注意:TensorFlow 在 Visual Studio 2015 Update 3 经过测试,但它也可能在一些更新版本的 Visual C++ 编译工具上工作。
安装 GPU 支持(可选)
参看 Windows 下的 GPU 支持指南,安装驱动和需要的附加软件来在 GPU 上运行 TensorFlow。
下载 TensorFlow 源码
用 Git 克隆 TensorFlow 仓库(git
在 MSYS2 中附带):
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 源码根目录下运行以下命令来配置系统编译:
python ./configure.py
这个脚本会提示你 TensorFlow 依赖的路径并请求附加的编译配置项(比如编译器标识)。下面展示了运行 python ./configure.py
的示例(你的会话可能会有所不同):
可选配置
如果要开启 GPU 支持,指定 CUDA 和 cuDNN 的版本。如果你的系统安装了多个版本的 CUDA 或者 cuDNN,明确指定版本号,而不要依赖默认配置。./configure.py
将会对你的系统的 CUDA 库创建符号连接 —— 所以如果你更新了你的 CUDA 库路径,需要在编译前重新执行这一步。
注意:自 TensorFlow 1.6 起,二进制文件使用 AVX 指令集,这会导致旧的 CPU 不被兼容。
编译 pip 包
Bazel 编译
CPU-only
使用 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 很占内存。如果你的系统内存有限,通过 --local_resources 2048,.5,1.0
选项来限制 Bazel 的内存占用。
如果开启了 GPU 支持,添加 --copt=-nvcc_options=disable-warnings
来忽略 nvcc 警告信息。
包编译
bazel build
命令创建了一个叫做 build_pip_package
的可执行文件 —— 这是用来构建 pip
包的程序。举个例子,下面的命令在 C:/tmp/tensorflow_pkg
目录下构建了一个 .whl
包:
bazel-bin\tensorflow\tools\pip_package\build_pip_package C:/tmp/tensorflow_pkg
尽管在同一个源代码根目录下同时构建 CUDA 和非 CUDA 配置是可行的,但我们推荐在两种配置间切换时运行 bazel clean
。
包安装
生成的 .whl
文件名取决于 TensorFlow 的版本和你的平台。使用 pip3 install
来安装包,示例如下:
pip3 install C:/tmp/tensorflow_pkg/tensorflow-version-cp36-cp36m-win_amd64.whl
成功:TensorFlow 已被安装。
使用 MSYS shell 编译
TensorFlow 可以使用 MSYS shell 编译。只要作下列更改,然后照着上文的步骤使用 Windows 的原生命令行(cmd.exe
)。
关闭 MSYS 路径转换
MSYS 会自动将 Unix 路径转换成 Windows 路径,这会导致 bazel
无法正常工作(//foo/bar:bin
被视作 Unix 绝对路径因为它以斜杠开始。)
export MSYS_NO_PATHCONV=1
export MSYS2_ARG_CONV_EXCL="*"
设置 PATH
将 Bazel 和 Python 安装文件夹添加到 $PATH
环境变量。假设 Bazel 安装在 C:\tools\bazel.exe
,Python 安装在 C:\Python36\python.exe
,将 PATH
设置成:
# Use Unix-style with ':' as separatorexport PATH="/c/tools:$PATH"
export PATH="/c/Python36:$PATH"
对于 GPU 支持版本,将 CUDA 和 cuDNN 的 bin 目录添加到 $PATH
:
export PATH="/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0/bin:$PATH"
export PATH="/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0/extras/CUPTI/libx64:$PATH"
export PATH="/c/tools/cuda/bin:$PATH"
可用编译配置
Version | CPU/GPU | Python version | Compiler | Build tools | cuDNN | CUDA |
---|---|---|---|---|---|---|
tensorflow-1.10.0 | CPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | N/A | N/A |
tensorflow_gpu-1.10.0 | GPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow-1.9.0 | CPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | N/A | N/A |
tensorflow_gpu-1.9.0 | GPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow-1.8.0 | CPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | N/A | N/A |
tensorflow_gpu-1.8.0 | GPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow-1.7.0 | CPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | N/A | N/A |
tensorflow_gpu-1.7.0 | GPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow-1.6.0 | CPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | N/A | N/A |
tensorflow_gpu-1.6.0 | GPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow-1.5.0 | CPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | N/A | N/A |
tensorflow_gpu-1.5.0 | GPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow-1.4.0 | CPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | N/A | N/A |
tensorflow_gpu-1.4.0 | GPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 6 | 8 |
tensorflow-1.3.0 | CPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | N/A | N/A |
tensorflow_gpu-1.3.0 | GPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 6 | 8 |
tensorflow-1.2.0 | CPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | N/A | N/A |
tensorflow_gpu-1.2.0 | GPU | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 5.1 | 8 |
tensorflow-1.1.0 | CPU | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 | N/A | N/A |
tensorflow_gpu-1.1.0 | GPU | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 | 5.1 | 8 |
tensorflow-1.0.0 | CPU | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 | N/A | N/A |
tensorflow_gpu-1.0.0 | GPU | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 | 5.1 | 8 |