TensorFlow 1.13 在 windows 上的构建

一.使用CMake + VS2015 IDE编译(失败,结果导向的看后面用 Bazel编译)

准备工作

  1. 安装 cmake 3.12+ (3.9+应该也可以)
  2. 下载 swigwin-3.0.12,从 http://prdownloads.sourceforge.net/swig/swigwin-3.0.12.zip 选个镜像下载,因为这个版本内有编译好的swig.exe,用来生成 python binding
  3. 下载源码 https://github.com/tensorflow/tensorflow.git 到目录 d:\lib,并切换到分支 r1.13
  4. 安装 python3.6(3.5应该也可以),用来生成 python binding

修改 cmake 相关文件

  • tensorflow\contrib\cmake\CMakeLists.txt 在此文件的 # Suppress warnings to reduce build log size 后面加上一行:add_compile_options(/wd4624 /wd4819),用来消减编译时的大量无效警告

  • tensorflow\contrib\cmake\external\abseil_cpp.cmake 这个google新推出的基本库在 r1.13分支内的使用有这些问题:静态库名称改名(部分库名称中间增加了 internal_),使用新的头文件 absl/container/flat_hash_set.h,某些用到的新函数未链接。解决方法,修改 Visual Studio 编译器对应的静态库块如下:

  • set(abseil_cpp_URL https://github.com/abseil/abseil-cpp/archive/20181200.tar.gz)
    set(abseil_cpp_HASH SHA256=e2b53bfb685f5d4130b84c4f3050c81bf48c497614dc85d91dbd3ed9129bce6d)
    set(abseil_cpp_BUILD ${CMAKE_BINARY_DIR}/abseil_cpp/src/abseil_cpp-build)
    
    if(WIN32)
      if(${CMAKE_GENERATOR} MATCHES "Visual Studio.*")
        set(abseil_cpp_STATIC_LIBRARIES
          ${abseil_cpp_BUILD}/absl/base/Release/absl_base.lib
          ${abseil_cpp_BUILD}/absl/base/Release/absl_internal_spinlock_wait.lib
          ${abseil_cpp_BUILD}/absl/base/Release/absl_dynamic_annotations.lib
          ${abseil_cpp_BUILD}/absl/base/Release/absl_internal_malloc_internal.lib
          ${abseil_cpp_BUILD}/absl/base/Release/absl_internal_throw_delegate.lib
          ${abseil_cpp_BUILD}/absl/hash/Release/absl_hash.lib
          ${abseil_cpp_BUILD}/absl/hash/Release/absl_internal_city.lib
          ${abseil_cpp_BUILD}/absl/numeric/Release/absl_int128.lib
          ${abseil_cpp_BUILD}/absl/strings/Release/absl_strings.lib
          ${abseil_cpp_BUILD}/absl/strings/Release/str_format_internal.lib
          ${abseil_cpp_BUILD}/absl/types/Release/absl_bad_optional_access.lib)
    

    abseil_cpp_URL 改为了20181200版本,SHA256 计算使用命令行

  • certutil -hashfile abseil-cpp-20181200.tar.gz SHA256

    absl_internal_throw_delegate.lib 这行解决:无法解析的外部符号 absl::base_internal::ThrowStdOutOfRange

  • absl_internal_city.lib 这行解决:无法解析的外部符号 absl::lts_2018_12_18::hash_internal::CityHash64

  • absl_hash.lib 这行解决:无法解析的外部符号 absl::lts_2018_12_18::hash_internal::CityHashState::kSeed

使用 cmake GUI 生成 solution

  • tensorflow 的 cmake 目录位置是 tensorflow/contrib/cmake,填好后点击Configure,选 Visual Studio 14 2015 win64TensorFlow 1.13 在 windows 上的构建_第1张图片

TensorFlow 1.13 在 windows 上的构建_第2张图片

  • 填好 swig.exe 路径
  • 选择tensorflow支持项:python_binding 和 grpc_support 可以不选,减少些编译时间;若需要 tensorflow.dll,可选 BUILD_SHARED_LIB
  • 点击Generate生成 solution,Open Project 打开TensorFlow 1.13 在 windows 上的构建_第3张图片

使用VS2015 IDE 构建Tensorflow

1.abseil_cpp

  • VS 内构建 abseil_cpp 项目,提示错误,大意是:absl_leak_check 包含了空文件。
  • 解决方法:将 bd1_13\abseil_cpp\src\abseil_cpp\absl\debugging\CMakeLists.txt 第 180 行开始的 absl_cc_library/leak_check 块删除,然后使用 cmake 生成 absl_cpp 的 solution 后构建即可TensorFlow 1.13 在 windows 上的构建_第4张图片
  • 使用新版本 absl_cpp 可以解决:
  1. absl/container/flat_hash_set.h: No such file or directory
  2. 无法打开输入文件 abseil_cpp\src\abseil_cpp-build\absl\base\Release\absl_internal_malloc_internal.lib
  3. 无法解析的外部符号 absl::base_internal::ThrowStdOutOfRange

2.proto_text

  • 此库用来由 text protobuf 文件生成 .pb_text.h /.cc 文件,如果有其它地方提示无法包含这类头文件,就是因为 proto_text.exe 未正确生成
  • 若 proto_text 又出现链接时无法找到 string_view::rfind() 之类错误,那是因为它使用了其它项目生成的 obj 文件,所以需要清理 solution,重新构建

3.tf_core_kernels

  • 这个工程编译时间超长,而且有几个地方会出错,需要启用最小重新生成功能,防止多次编译耗时过多:TensorFlow 1.13 在 windows 上的构建_第5张图片TensorFlow 1.13 在 windows 上的构建_第6张图片这两项设置好就可以了
  • 在包含 Eigen 相关头文件编译时,蹦出tensorflow\bd1_13\external\eigen_archive\eigen\src\plugins\IndexedViewMethods.h(112): fatal error C1060: 编译器的堆空间不足,是因为VS2015的 cl.exe 是并行编译多个源文件的,每个分配了单独线程,所以需要减少并行数来减少内存占用,在编译此项目时,需要把蓝色处改为 1TensorFlow 1.13 在 windows 上的构建_第7张图片
  • 在 maxtrix_square_root_ops.cc 卡住了,这个文件用 VS2015 直接编译,占用内存突破4G,然后就会报错:fatal error C1001: 编译器中发生内部错误;单独编一个文件也会报错;增加额外命令行参数 -Zm2000 依然报错,2000已经最大了(1.5G),VS IDE编译彻底走不通

二.使用 Bazel 编译Tensorflow1.13

准备工作

  • 安装MSYS2,地址 https://www.msys2.org/,选 msys2-x86_64-xxxx.exe,按网页下方说明安装到 C:\msys64
  • 为 MSYS2 安装 patch.exe, unzip.exe, grep.exe
    pacman -S patch, unzip, grep

    否则后面会出现 patch, unzip, grep 执行失败的提示

  • 安装Anaconda3 64bit,地址 https://www.anaconda.com/download/#windows,Anaconda 的Python 如果使用的是 3.7,需要新建一个Python3.6的虚拟环境,Tensorflow 还不支持Python3.7
    conda create -n py36 python=3.6
    #注意选 Y 来确认下载默认组件包
    
  • 安装Bazel 0.21.0,地址 https://github.com/bazelbuild/bazel/releases/download/0.21.0/bazel-0.21.0-windows-x86_64.exe,下载后将此 exe 改名为 bazel.exe 并放入 MSYS2 根目录 C:\msys64;设置两个环境变量 BAZEL_SH,BAZEL_VCTensorFlow 1.13 在 windows 上的构建_第8张图片
  • 启动 VS2015 x64 命令行,激活Anaconda环境,在命令行内执行
    cmd.exe "/K" C:\Users\Intel\Anaconda3\Scripts\activate.bat

    命令行提示符变为若使用了Python3.6,别忘了切换

    conda activate py36

     

  • 使用 anaconda 安装 numpy, cython,keras
    conda install numpy cython keras

    否则在后面构建时会遇到错误:ModuleNotFoundError: No module named 'keras_preprocessing'

  • 将安装好的 C:\Users\Intel\Anaconda3\Library\bin\patch.exe 和 patch.exe.manifest 拷贝到可执行目录 C:\msys64下,此程序用来给 png 库打补丁,不然后面会出现错误:Non-zero return code(127) when executing 'c:\msys64\usr\bin\bash.exe -l -c "patch" "-p1" "-d" "C:/users/intel/_bazel_intel/l5prppc7/external/png_archive" "-i" "D:/lib/tensorflow/third_party/png_fix_rpi.patch"'

下载并编译 tensorflow

  • (仍在上面的命令行下):下载 tensorflow到 d:/lib,并切换当前目录到 d:/lib/tensorflow
  • 编辑 D:\lib\tensorflow\third_party\icu\workspace.bzl,将其中的两个 url 交换下位置,因为第一个 https://mirror.bazel.build/github.com/unicode-org/icu/archive/release-62-1.tar.gz 无效
  • 选择tensorflow 配置,执行命令
    python configure.py

    一项项确定或修改

  • 分支1:构建 libtensorflow.so,执行
    bazel build --config opt //tensorflow/tools/lib_package:libtensorflow

    最后生成 D:\lib\tensorflow\bazel-bin\tensorflow\libtensorflow.so.if.lib && libtensorflow.so(CPU版大概75MB)

  • 头文件位置看最后的输出 libtensorflow.tar.gz,内有 include\tensorflow\c\c_api.hTensorFlow 1.13 在 windows 上的构建_第9张图片

  • 分支2:构建 pip 安装包,执行
    bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
    
    bazel-bin\tensorflow\tools\pip_package\build_pip_package tmp/tensorflow_pkg

     

  •  
  1. 执行脚本生成可用于安装 tensorflow1.13的 whl 文件
  2. 可能会出现错误:unzip: command not found。需要在 MSYS2 64bit 命令行内执行 pacman -S unzip 安装它
  3. 升级自己生成的 tensorflow 1.13rc0:pip install -U tmp/tensorflow_pkg/tensorflow-1.13.0rc0-cp36-cp36m-win_amd64.whl
  • 参考链接:https://medium.com/@amsokol.com/how-to-build-and-install-tensorflow-gpu-cpu-for-windows-from-source-code-using-bazel-d047d9342b44
    

你可能感兴趣的:(Tensorflow,Windows,C++)