在 Windows 10 中编译 TensorFlow

原创文章,版权所有。转载请注明出处!

预告:从 TensorFlow 1.11 开始,仅支持 bazel 编译,官方不再支持 cmake 编译。

此文章为长期更新文章,最新更新日期为2018年8月11日。

因为官方提供的 TensorFlow 不支持 AVX2/FMA 指令,故我们需要自己编译。如果既不需要 AVX2 指令,也不需要显卡支持,则并无自行编译的必要。

编译环境

  • Python2.7、Python 3.6 (相关书籍)和 numpy相关书籍)、mock、protobuf、absl-py (推荐使用 Anaconda)
  • Visual Studio 2017 (需要 VC++ 2017 版本 15.7 v14.14 最新 v141 工具)
  • swigwin、cmake (生成解决方案和项目)
  • Git for Windows (检出源代码)

准备工作

  1. 安装 Python 2.7 和 Python 3.6 (推荐使用 Anaconda,方便切换环境),安装完成后再安装 numpy、mock、protobuf、absl-py 模块,安装这些模块的同时也会一并安装这些模块的依赖模块;如果使用 Python 2.7,则还要安装 enum34 模块;
  2. 安装 Visual Studio 2017 (目前是 15.7.3),并至少勾选
    1. 用于 CMake 的 Visual C++ 工具
    2. MSBuild
    3. VC++ 2017 版本 15.7 v14.14 最新 v141 工具
  3. 下载 swigwin,解压后将解压路径加到系统变量 PATH 中,以便生成解决方案和项目时调用;
  4. 下载 cmake 并安装,以供生成解决方案和项目;
  5. 下载 Git for Windows 并安装。

下载源代码

打开 CMD,选定一个位置存放 tensorflow 项目库,例如默认位置是 C:\Users\<用户名>。

打开 CMD 后选定当前目录存放 tensorflow 项目库

执行命令检出项目库:

检出后需要切换到最新分支。目前(2018年5月20日)的最新分支是 r1.8:

切换到 r1.8 分支

编译适用于 Python 2.7 的 TensorFlow

准备工作

相比 Python 3.6 环境,Python 2.7 环境需要额外安装 enum 模块。其他步骤与 Python 2.7 相同。

生成编译解决方案

在 Anaconda 中新建一个 Python 2.7 的环境,可以命名为 build_tensorflow_python27,安装好 numpy、mock、protobuf、enum34(Python3不需要)和 absl-py 后,运行该终端。

为了方便编译,我们将 tensorflow 文件夹映射为一个新的盘符,比如 S:。这么做的目的是为了避免编译器调用某个文件时遇到路径过长无法打开的错误。

使用 Python 2.7 环境并将 tensorflow 文件夹映射为新的盘符

注意:这并非生成了一个新的虚拟磁盘,而是仅将路径中的 C:\Users\i\tensorflow 替换为 S: 而已。生效期间,在 Windows 资源管理器中也能看到该盘符。编译结束后可以使用 /D 选项删除该盘符:

切换到 S:\tensorflow\contrib\cmake 文件夹下,新建一个文件夹 build。接下来要生成的编译解决方案所有文件都将存放在该文件夹下:

生成命令为:

注意:将编译选项 SWIG_EXECUTABLE、PYTHON_EXECUTABLE、PYTHON_LIBRARIES 指定为对应目录。最后一个编译选项的作用是启用 AVX2 指令。具体支持 AVX2 指令的 CPU 可以查阅 wikipedia。此编译命令未启用 cuda 和 cudnn。由于条件所限,本人尚无法编译启用 cuda 和 cudnn 的 TensorFlow。如果有行业先驱愿意分享,可以在文章下方留言。

这个命令比较长,推荐将该命令写入批处理文件,并命名为 configure.bat。

运行命令后,看到“Build files have been written to: S:/tensorflow/contrib/cmake/build”提示,即代表编译解决方案生成成功:

编译解决方案生成成功

此时能在该 build 文件夹下看到 tensorflow.sln 文件。你可以使用 Visual Studio 2017 打开后编译,不过我们推荐直接使用命令行,避免 VS2017 本身占用内存。

编译 TensorFlow

如果你选择命令行方式编译,需要先设置环境变量。

打开 Cortana ,输入 x64:

右键单击第一个项目,并选择“打开文件位置”。找到对应的快捷方式后查看其目标位置:

复制“目标”,粘贴到命令行中并运行。

看到如下提示便可以开始编译了:

执行以下命令,开始编译:

由于我们只需要 pip 包,所以并不需要编译 ALL_BUILD 项目,只需要编译 tf_python_build_pip_package 项目即可。

注意:

  • 此命令耗时相当长,尤其是编译 conv_grad_ops_3d.cc 和 matmul_op.cc 文件时,可能停留大半个小时没有前进。建议 CPU 核心数尽量多,内存(包括虚拟内存)尽量大,尽量使用固态硬盘;如果有条件,可以将上述涉及到的文件、程序、临时文件夹全部放在内存虚拟磁盘中。
  • 编译过程中需要下载 grpc 项目并编译,编译成功后才能继续。该项目还依赖十余个项目,除了 libFuzzer 托管在谷歌自己的仓库(chromium.googlesource.com)中外,其它均托管在 github.com 或 bazel.build 网站。所有项目下载完毕后大约消耗 450MB 左右的空间。chromium.googlesource.com 目前在中国大陆无法访问。
    下载失败后,脚本会稍后重试一次。如果再失败,则停止编译。
    该项目编译成功后大约占 750MB 左右的空间。
  • 编译过程中可能会遭遇多次失败,不过除了标记为 AlwaysCreate 的项目外,其它已编译好的目标文件可以重用,再次编译会节省时间。比如 grpc 就是可重用已编译的项目。为了操作方便,建议将编译命令写入批处理文件,并命名为 build.bat。
  • 编译结束后,tensorflow 文件夹大约占用接近 6GB 的空间。

如果在编译过程中还遇到其它问题,可以在此留言,我会尽力解决。

关于 “在 Windows 10 中编译 TensorFlow” 的 1 个意见

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据