有时需要最新版的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-
启动一个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\
我的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