我的AI之路(23)--在Windows下编译Bazel和使用Bazel编译tensorflow

    有时需要最新版的tensorflow安装文件国内镜像网站又还没提供,或者需要一个针对你自己的机器环境的版本,这时知道怎么自己从源码编译出tensorflow的whl安装文件就必须的了,要自己编译首先就得了解下Bazel这工具,谷歌废弃使用CMake改用并力推自己的Bazel看来这是大势所趋,花了几天时间琢磨了下Bazel的编译和使用Bazel编译tensorflow,一般人工作都没同时配有几台机器,Windows日常工作又得时时开着,至于自己花钱攒机器的就不要说了,为了使用Linux环境弄个VM在硬件不牛时性能可不好,所以还是琢磨Windows下怎么搞定这事吧,不过一般的编译在Linux下没毛病在Windows下支持都不好,所以动手前对于可能遇到困难是有心里准备的。

    除非你使用的机器的OS和硬件比较特殊,没有现成的可用,编译Tensorflow可以使用https://github.com/bazelbuild/bazel/releases这里提供的现成的已编译好的bazel可执行文件,所以一般的工作环境下编译bazel并非编译tensorflow的必须步骤。

   编译Bazel和Tensorflow过程中都会去下载多个外部支持包,所以需要有较好的网络,网速慢了可能会经常失败。

  编译Bazel比较好弄,你得安装了Visual Studio2015或者VC2015(community版即可)和python或anaconda,然后到这里https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载安装Java 8 JDK windows x64版(根据你机器和window情况定,我的是64位的),到http://www.msys2.org下载并安装msys2-x86_64-20180531.exe,然后打开一个MSYS2 MinGW 64-bit终端执行:

  • pacman -Syu zip unzip
    

确保zip和unzip安装了。

     再到https://github.com/bazelbuild/bazel/releases下载你需要的bazel源码包,注意这里不要下载source code那些.zip或.tar.gz包,而是要下载bazel--dist.zip包,因为source code那些包里是没有包含protobuf和grpc的源码的,使用source code.zip展开的源码编译时会报错: ERROR: Must specify PROTOC和ERROR: Must specify GRPC_JAVA_PLUGIN之类的错误,除非你自己下载或编译出了protoc和grpc,那可以设置环境变量PROTOC和GRPC_JAVA_PLUGIN指向他们,否则还是下载distribute包省事。

     启动一个MSYS2 MinGW 64-bit终端,设置环境变量:

       export BAZEL_VS="D:/Program Files (x86)/Microsoft Visual Studio 14.0"
       export BAZEL_SH="$(cygpath -m $(realpath $(which bash)))"
       export PATH="d:/anaconda3:$PATH"
       export JAVA_HOME="D:/Java/jdk1.8.0_181"

    然后进入到解压的源码包目录下执行

        ./compile.sh

   即可。编译完后bazel.exe生成在output目录下,有了一次编译成功的基础后,后面bazel源码有新版的想做更新编译时只需执行

        bazel build //src:bazel

   即可,无需整个编译。

编译出了bazel.exe,把它所在路径加入到PATH中去。

 

     编译Tensorflow和编译Bazel所需要的环境支持大致是一样的,需要先安装好VS/VC,Java8,Msys2和Python或Anaconda,然后是需要把bazel.exe所在路径加入PATH中(我的bazel.exe放在D:\AI下),另外还需要安装git并把路径加入到PATH中。

     到https://github.com/tensorflow/tensorflow下载最新版的tensorflow源码zip包解压开(我的解压到D:\AI\tensorflow-master),然后要修改两个脚本文件,一个是环境设置文件,一个是要执行的主脚本文件(我要编译一个gpu版的):

D:\AI\tensorflow-master\tensorflow\tools\ci_build\windows\bazel\common_env.sh:

# Use a temporary directory with a short name.
export TMPDIR=${TMPDIR:-"C:/tmp"}
export TMPDIR=$(cygpath -m "$TMPDIR")
mkdir -p "$TMPDIR"
export workspace="D:/AI/tensorflow-master"
# Set bash path
export BAZEL_SH=${BAZEL_SH:-"C:/msys64/usr/bin/bash"}

export PYTHON_BASE_PATH="${PYTHON_DIRECTORY:-"D:/Anaconda3"}"
export BAZEL_VS="D:/Program Files (x86)/Microsoft Visual Studio 14.0"
# Set the path to find bazel.
export PATH="/d/AI/:$PATH"

# Set Python path for ./configure
export PYTHON_BIN_PATH="${PYTHON_BASE_PATH}/python.exe"
export PYTHON_LIB_PATH="${PYTHON_BASE_PATH}/lib/site-packages"

# Add python into PATH, it's needed because gen_git_source.py uses
# '/usr/bin/env python' as a shebang
export PATH="${PYTHON_BASE_PATH}:$PATH"
# Add git into PATH needed for gen_git_source.py
export PATH="/d/Program Files/Git/cmd:$PATH"

# Make sure we have pip in PATH
export PATH="${PYTHON_BASE_PATH}/Scripts:$PATH"

# Setting default values to CUDA related environment variables
export TF_CUDA_VERSION=${TF_CUDA_VERSION:-9.0}
export TF_CUDNN_VERSION=${TF_CUDNN_VERSION:-7}
export TF_CUDA_COMPUTE_CAPABILITIES=${TF_CUDA_COMPUTE_CAPABILITIES:-5.0}
export CUDA_TOOLKIT_PATH=${CUDA_TOOLKIT_PATH:-"C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v${TF_CUDA_VERSION}"}
export CUDNN_INSTALL_PATH=${CUDNN_INSTALL_PATH:-"C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v${TF_CUDA_VERSION}"}

# Add Cuda and Cudnn dll directories into PATH
export PATH="$(cygpath -u "${CUDA_TOOLKIT_PATH}")/bin:$PATH"
export PATH="$(cygpath -u "${CUDA_TOOLKIT_PATH}")/extras/CUPTI/libx64:$PATH"
# export PATH="$(cygpath -u "${CUDNN_INSTALL_PATH}")/bin:$PATH"

上面我的Cudnn的三个文件全拷贝到了CUDA对应的目录下,因此CUDNN_INSTALL_PATH和CUDA_TOOKIT_PATH设置一样的路径。

执行的主脚本文件有一个错误需要修改,至少在我的Mysys2下得不到正确的值,

D:\AI\tensorflow-master\tensorflow\tools\ci_build\windows\gpu\pip\build_tf_windows.sh:

#script_dir=$(dirname $0)
#cd ${script_dir%%tensorflow/tools/ci_build/windows/gpu/pip}.

script_dir="D:/AI/tensorflow-master"

cd $script_dir 

然后为了方便在D:\AI\tensorflow-master下创建一个run.bat文件,内容如下:

   bash  D:/AI/tensorflow-master/tensorflow/tools/ci_build/windows/gpu/pip/build_tf_windows.sh %*


然后使用pip安装keras-preprocessing和keras-applications到你的anaconda环境下去:

   pip install keras-preprocessing --no-deps
   pip install keras-applications --no-deps
   pip install h5py

不然后面的编译Tensorflow过程中会报错而退出:

   ModuleNotFoundError: No module named 'keras-preprocessing'

   ModuleNotFoundError: No module named 'keras_applications'

然后在Msys2终端下执行

cd /d/AI/tensorflow-master

./run.bat

即可以开始几个小时的编译,编译中途无错误发生的话,生成的类似tensorflow_gpu-1.11.0rc1-cp36-cp36m-win_amd64.whl文件会放在D:\AI\tensorflow-master\py_test_dir\下面。

 

编译中可能发生的错误及解决办法:

(1)

Unzipping simple_console_for_windows.zip to create runfiles tree...
[./bazel-bin/tensorflow/tools/pip_package/simple_console_for_windows.zip]
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of ./bazel-bin/tensorflow/tools/pip_package/simple_console_for_windows.zip or
        ./bazel-bin/tensorflow/tools/pip_package/simple_console_for_windows.zip.zip, and cannot find ./bazel-bin/tensorflow/tools/pip_package/simple_console_for_windows.zip.ZIP, period.

这个问题最坑人了,每次编译到最后快完时就报这个错误,开始我以为是bazel版本不对,试了几个版本都报这个错,试着去读bazel的源码也没找到线索,后来在tensorflow的issues里搜索到了,这个原因是你使用的源码是半个月以前的tensorflow源码,这个问题在最近解决了,是tensorflow本身代码问题,具体参见https://github.com/tensorflow/tensorflow/issues/22382,所以得下载最新的源码来编译。

(2)

c:\tmp\6vmqdjhl\execroot\org_tensorflow\bazel-out\x64_windows-opt\genfiles\external\local_config_cuda\cuda\cuda\include\crt/host_config.h(133): fatal error C1189: #error:  -- unsupported Microsoft Visual Studioversion! Only the versions 2012, 2013, 2015 and 2017 are supported!

这个问题的原因是cuda9.0只支持到Visual Studio 2017 version 15.3,如果你安装高版本的VS肯定报错(我开始安装的最新的Visual Studio 2017 version 15.8),我试过,就算在cuda的host_config.h里

#if _MSC_VER < 1600 || _MSC_VER > 1911

#error -- unsupported Microsoft Visual Studio version! Only the versions 2012, 2013, 2015 and 2017 are supported!

即使改掉这里的判断让这里能过,后面编译时还是会出现一堆错误。

MSC_VER和VS版本对应关系如下:
MSVC++ 4.0   _MSC_VER == 1000 (Developer Studio 4.0)
MSVC++ 4.2   _MSC_VER == 1020 (Developer Studio 4.2)
MSVC++ 5.0   _MSC_VER == 1100 (Visual Studio 97 version 5.0)
MSVC++ 6.0   _MSC_VER == 1200 (Visual Studio 6.0 version 6.0)
MSVC++ 7.0   _MSC_VER == 1300 (Visual Studio .NET 2002 version 7.0)
MSVC++ 7.1   _MSC_VER == 1310 (Visual Studio .NET 2003 version 7.1)
MSVC++ 8.0   _MSC_VER == 1400 (Visual Studio 2005 version 8.0)
MSVC++ 9.0   _MSC_VER == 1500 (Visual Studio 2008 version 9.0)
MSVC++ 10.0  _MSC_VER == 1600 (Visual Studio 2010 version 10.0)
MSVC++ 11.0  _MSC_VER == 1700 (Visual Studio 2012 version 11.0)
MSVC++ 12.0  _MSC_VER == 1800 (Visual Studio 2013 version 12.0)
MSVC++ 14.0  _MSC_VER == 1900 (Visual Studio 2015 version 14.0)
MSVC++ 14.1  _MSC_VER == 1910 (Visual Studio 2017 version 15.0)
MSVC++ 14.11 _MSC_VER == 1911 (Visual Studio 2017 version 15.3)
MSVC++ 14.12 _MSC_VER == 1912 (Visual Studio 2017 version 15.5)
MSVC++ 14.13 _MSC_VER == 1913 (Visual Studio 2017 version 15.6)
MSVC++ 14.14 _MSC_VER == 1914 (Visual Studio 2017 version 15.7)
MSVC++ 14.15 _MSC_VER == 1915 (Visual Studio 2017 version 15.8)

    安装一个CUDA9.0支持的VS/VC版本这个问题浪费了我大把时间,MS网站上找不到1911对应的Visual Studio 2017 version 15.3,倒是找到了1910对应的Visual Studio 2017 version 15.0,安装上后编译到cuda时还是报一堆错,没法只好安装了个Visual Studio 2015 version Update3并修改BAZEL_VS的值,然后这种错误就过了,每次安装和卸载VS需要大把时间还需要你的网络好,真是折腾人,最搞笑的是tensorflow的开发大佬们说Visual Studio 2017完全没问题,我就信了,上来就安装2017版结果被坑了,就我实验的结果来看,cuda9.0还就只能使用VS2015版的,虽然CUDA10都出来了,现在最新的Tensorflow也还停留在使用CUDA9.0上,所以使用VS2015来编译在短时间内是无须改动的。

(3)

ERROR: D:/ai/tensorflow-master/tensorflow/contrib/lite/toco/python/BUILD:23:1: no such package '@com_google_absl//absl/strings': java.io.IOException: thread interrupted and referenced by '//tensorflow/contrib/lte/toco/python:tensorflow_wrap_toco_py_wrap'
ERROR: Analysis of target '//tensorflow/tools/pip_package:build_pip_package' failed; build aborted: no such package '@com_google_absl//absl/strings': java.io.IOException: thread interrupted

这是因为编译过程中需要下载一些包到临时目录下,C:\tmp\6vmqdjhl\external\com_google_absl\下载的*.tar.gz包不完整解压不了,删掉com_google_absl目录然后重新启动编译,再次下载成功了会自动解压这个包,编译就可以往下走了。C:\tmp\6vmqdjhl\external\下其他很多包也是需要在编译是下载的,出了类似错误时,删掉这个目录重启启动编译,再次下载成功就可以往下走了。

     编译完后就可以把这三个临时目录全干掉了:c:\tmp, c:\users\\_bazel_, D:\AT\tensorflow-master,不然占用了太多空间。

我的AI之路(1)--前言

我的AI之路(2)--安装Fedora 28

我的AI之路(3)--安装Anaconda3 和Caffe

我的AI之路(4)--在Anaconda3 下安装Tensorflow 1.8

我的AI之路(5)--如何选择和正确安装跟Tensorflow版本对应的CUDA和cuDNN版本

我的AI之路(6)--在Anaconda3 下安装PyTorch

我的AI之路(7)--安装OpenCV3_Python 3.4.1 + Contrib以及PyCharm

我的AI之路(8)--体验用OpenCV 3的ANN进行手写数字识别及解决遇到的问题

我的AI之路(9)--使用scikit-learn

我的AI之路(10)--如何在Linux下安装CUDA和CUDNN

我的AI之路(11)--如何解决在Linux下编译OpenCV3时出现的多个错误

我的AI之路(12)--如何配置Caffe使用GPU计算并解决编译中出现的若干错误

我的AI之路(13)--解决编译gcc/g++源码过程中出现的错误

我的AI之路(14)--Caffe example:使用MNIST数据集训练和测试LeNet-5模型

我的AI之路(15)--Linux下编译OpenCV3的最新版OpenCV3.4.1及错误解决

我的AI之路(16)--云服务器上安装和调试基于Tensorflow 1.10.1的训练环境

我的AI之路(17)--Tensorflow和Caffe的API及Guide

我的AI之路(18)--Tensorflow的模型安装之object_detection

我的AI之路(19)--如何在Windows下安装pycocotools PythonAPI

我的AI之路(20)--用Tensorflow object_detection跑raccoon数据集

我的AI之路(21)--用Tensorflow object_detection跑PASCAL VOC 2012数据集

我的AI之路(22)--使用Object_Detection_Tensorflow_API

我的AI之路(23)--在Windows下编译Bazel和使用Bazel编译tensorflow

 

 

 

你可能感兴趣的:(AI,Tensorflow,Bazel)