最近在工作中要做tensorflow模型进行8Bit量化,上网搜了一下需要对tensorflow源码进行编译,然后不知不觉进入了深坑,网上博客各种看,看得那叫个眼睛疼,然后一步步实现,到最后都编译失败,那真心叫个酸爽,业界良心呐!看到这篇博客的你是不是正打算入坑呢?抑或是在坑里还没爬出来呢?来吧!开始搬砖……
先放上成功编译的结果,信心是不是爆棚了呢
(1)安装VisualStudio2015_R3版本,下载地址:
https://my.visualstudio.com/Downloads?q=visual%20studio%202015&wt.mc_id=o~msft~vscom~older-downloads
安装目录:C:\Program Files (x86)\Microsoft Visual Studio 14.0
特别注意:确定安装的是VisualStudio2015_R3版本,其他版本很有可能tensorflow_gpu源码编译不通过。
(2)安装CUDA与cudnn,下载网址:
https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10
我安装的CUDA版本是9.0.176,cudnn的版本是7.1
安装目录:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0
特别注意:安装完CUDA后,将cudnn中的cudnn64_7.dll放入CUDA安装目录下对应的bin文件夹,将cudnn中的cudnn.lib放入CUDA安装目录下对应的lib文件夹,将cudnn中的cudnn.h放入CUDA安装目录下对应的include文件夹。
(3)安装Anaconda3下载网址:https://www.anaconda.com/distribution/
安装目录:C:\Anaconda3
安装完毕后,打开桌面开始,寻找到Anaconda3(64-bit),打开anaconda Navigator,点击create,创造工作环境,命名为tensorflow_XX,选择python3.6,创建完毕后,open terminal,
安装依赖包:
pip3 install six numpy wheel
pip3 install keras_applications==1.0.6 --no-deps
pip3 install keras_preprocessing==1.0.5 --no-deps
(4)安装MSYS2x64,下载网址:https://www.msys2.org/
安装目录:C:\Bin
特别注意:安装完毕后,打开桌面开始,寻找到MSYS2 64bit,用管理员身份打开MSYS2 MinGW 64-bit,输入pacman –Syu,需要安装最新的依赖包(这个地方网速决定能否更新成功),输入pacman –Su,输入pacman –S patch unzip
直到前两个命令返回“今日无事可做”的时候,才意味着更新成功,否则就不断更新,必要时翻墙吧,安装完毕后记得将C:\Bin\usr\bin加入电脑环境path中
(5)安装bazel,下载网址:https://github.com/bazelbuild/bazel/releases
特别注意:bazel的版本选择直接决定tensorflow能否被成功编译,我选择的是0.19.0版本。
解压后出现bazel.exe文件,我将其放入C:\Bin目录下,然后加入电脑环境path中,
新建系统变量,变量名BAZEL_VC,
变量值浏览目录C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
新建系统变量,变量名BAZEL_SH,变量值浏览文件C:\Bin\usr\bin\bash.exe
(6)安装tensorflow_gpu,下载网址:https://github.com/tensorflow/tensorflow/releases
特别注意:tensorflow版本的选择直接决定bazel能否成功编译,我选择的是1.10.0版本
我解压后放入C:\Users\Administrator\tensorflow-1.10.0
(7)打开桌面开始,寻找到Anaconda3(64-bit),打开anaconda Navigator,点击tensorflow_XX/ open terminal,输入cd C:\Users\Administrator\tensorflow-1.10.0
进入tensorflow-1.10.0文件夹后,输入python configure.py
输出:
...
You have bazel 0.19.0 installed.Please specify the location of python.
[Default is C:\Anaconda3\envs\tensorflow110\python.exe]:
***
一路回车
***
Do you wish to build TensorFlow with CUDA support? [y/N]:
输入y回车
。。。
Please specify the CUDA SDK version you want to use. [Leave empty to default to CUDA 9.0]:
。。。
因为我安装的是9.0.167版本,
故而输入9.0 回车
。。。
Please specify the location where CUDA 9.0 toolkit is installed. Refer to README.md for more details. [Default is C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0]:
。。。
输入回车
。。。
Please specify the cuDNN version you want to use. [Leave empty to default to cuDNN 7.0]:
。。。
因为我安装的是7.0版本,
故而输入7.0 回车
。。。
Please specify the location where cuDNN 7 library is installed. Refer to README.md for more details. [Default is C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0]:
。。。
回车
。。。
Please specify a list of comma-separated Cuda compute capabilities you want to build with.You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus.Please note that each additional compute capability significantly increases your build time and binary size. [Default is: 3.5,7.0]:
。。。
因为我的GPU是1060故而,输入6.1回车
可通过网址https://developer.nvidia.com/cuda-gpus. 查询自己GPU所对应的数值
。。。
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is /arch:AVX]:
。。。
这个地方因为我的CPU是四核的,所以直接回车了,如果是6核或者以上输入“/arch:AVX2”回车
此时表明configure完毕了,这个地方有两个贼大的坑,需要特别注意,如果直接进行:
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package,你会发现编译不通过,一堆错误,掉入坑中压根爬不上来呀,这种感觉真的很酸爽。
(8)解决第一个坑:
configure完毕后,打开C:\Users\Administrator\tensorflow-1.10.0,你会发现文件夹下有个.bazelrc文件,没错打开它,输入
import C:/Users/Administrator/tensorflow-1.10.0/tools/bazel.rc
import C:/Users/Administrator/tensorflow-1.10.0/.tf_configure.bazelrc
保存关闭
解决第二个坑:
打开
C:\Users\Administrator\_bazel_Administrator\skod5klt\execroot\org_tensorflow\external\eigen_archive\Eigen\src\Core\arch\CUDA\Half.h
行211-217之间的这个EIGEN_STRONG_INLINE __device__ half operator + (const half& a, const half& b)函数,修改为:
EIGEN_STRONG_INLINE __device__ half operator + (const half& a, const half& b)
{
#if defined(EIGEN_CUDACC_VER) && EIGEN_CUDACC_VER >= 90000
return __hadd(::__half(a), ::__half(b));
#else
return __hadd(a, b);
#endif
}
行224-232之间的这个EIGEN_STRONG_INLINE __device__ half operator / (const half& a, const half& b) 修改为:
EIGEN_STRONG_INLINE __device__ half operator / (const half& a, const half& b) {
#if defined(EIGEN_CUDACC_VER) && EIGEN_CUDACC_VER >= 90000
return __hdiv(a, b);
#else
float num = __half2float(a);
float denom = __half2float(b);
return __float2half(num / denom);
#endif
}
修改完后,运行bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package,
进入了漫长的等待期。。。。。。突然爆出Time out 那叫一个酸爽,说明网络忒差了,下载依赖包超时了,怎么办呢?继续运行
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
终于依赖包下载完了,然后再次进入漫长的等待期。。。。。。我等了差不多一天时间,搞定……