1. 基本环境
Anaconda3: python3.6.5
CUDA :10.0
cuDNN: 7.5
TensorFlow: 1.13.1
VS: 2015
2. 安装VS2015
VS下载地址: Visual Studio
VS2017没测试,基本差不多
3. 安装MSYS2、Bazel
MSYS2下载地址: MSYS2 installer
Bazel下载地址: Bazel
将下载的bazel名字改为bazel.exe ,并将该bazel.exe添加到msys64\usr\bin中(根据自己安装目录,例如我的安装目录是:E:\SoftEnv\Msys2\usr\bin);
将msys2和bazel加入环境变量path中,例如我的:
接下来使用 cmd.exe 运行以下命令:pacman -S git patch unzip
(需要梯子)
最后通过命令命令:bazel version
验证bazel安装是否成功
4. 让PowerShell可执行.pl1文件
方法参考: PowerShell让系统可以执行.ps1文件
5. 下载编译脚本和tensorflow源码
编译脚本下载以及tensorflow源码(v1.13.1):
git clone --recursive https://github.com/gulingfengze/tensorflow-windows-build-script.git
下载完成后解压source.zip压缩包,该文件夹中为TF的1.13.1版本。
注:如果想编译其它版本,则需要删除source下的所有文件,然后下载tensorflow源码, 并切换到对应版本即可,tensorflow源码下载:
git clone --recursive https://github.com/tensorflow/tensorflow.git
6. 修改 build.ps1文件并编译
修改两个地方,如下所示:
if (!(CheckInstalled pacman)) {
$version = askForVersion “20180531.0.0”
choco install msys2 --version $version --params “/NoUpdate /InstallDir:E:\SoftEnv\Msys2” # 改成自己的安装路径
}
$ENV:Path += “;E:\SoftEnv\Msys2\usr\bin” # 改成自己的路径
$ENV:BAZEL_SH = “E:\SoftEnv\Msys2\usr\bin\bash.exe” # 改成自己的路径
if (!(CheckInstalled python “3.6.5”)) { # 改为自己的版本号
$version = askForVersion “3.6.5”
choco install python --version $version --params “‘TARGETDIR:C:/Python36’”
}
在tensorflow-windows-build-script下执行命令:python -m venv venv
创建一个虚拟环境;以管理员方式打开Windows PowerShell,进行编译:
$parameterString = "--config=opt --config=cuda --define=no_tensorflow_py_deps=true --copt=-nvcc_options=disable-warnings //tensorflow:libtensorflow_cc.so --verbose_failures"
.\build.ps1 `
-BazelBuildParameters $parameterString `
-BuildCppAPI -ReserveSource -ReserveVenv
回车,选择一个tensorflow版本,默认为 v1.13.1
编译过程中会检查配置信息,另外还有需要选择配置的设置,示例配置如下:
Do you wish to build TensorFlow with XLA JIT support? 选择n
Do you wish to build TensorFlow with ROCm support? 选择n
Please input the desired Python library path to use。。。 直接回车就行(自动检测到本地的site-packages路径)
Do you wish to build TensorFlow with CUDA support? 选择y
Please specify the CUDA SDK version you want to use。。。 直接回车就行(自动检测到本地的CUDA SDK版本)
Please specify the location where CUDA 10.0 toolkit is installed。。。 直接回车就行(自动检测到本地的CUDA toolkit)
Please specify the cuDNN version you want to use。。。 输入7.5(和本地cuDNN版本号一致)
Please specify the location where cuDNN 7 library is installed。。。 直接回车就行(自动检测到本地的cuDNN安装路径)
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] 7.5 (因我的是2070)
Please specity optimization flags to use during compilation when bazel option “–config=opt” is specified [Default is /arch:AVX]: /arch:AVX2
其它的选项基本就是回车就行(看情况定),正常情况到这一步不会报错
接下来就是等待了,时间可能比较长.
运气不差的话,在tensorflow-windows-build-script\source\bazel-bin\tensorflow下应该就生成了如下文件:
liblibtensorflow_cc.so.exp
liblibtensorflow_cc.so.ifso
libtensorflow_cc.so
libtensorflow_cc.so.runfiles_manifest
libtensorflow_cc.so-2.params
实际上 libtensorflow_cc.so 、liblibtensorflow_cc.so.ifso 就是我们所需要的编译文件; libtensorflow_cc.so对应dll文件, liblibtensorflow_cc.so.ifso对应lib文件,我们只需要分别将libtensorflow_cc.so改为tensorflow_cc.dll ,liblibtensorflow_cc.so.ifso改为 tensorflow_cc.lib即可。下面就是整理dll、include和lib文件,具体参考博客:win10 + bazel-0.20.0 + tensorflow-1.13.1 编译tensorflow GPU版本的C++库 ,这里非常感谢该博主的详细介绍。
demo示例参考上述博客即可,另外在强调一点:编译时出现符号链接错误,将符号链接复制到source\tensorflow下的tf_exported_symbols_msvc.lds 文件中,然后重新执行编译动态库操作(重复上述6的操作即可)
另外,如果需要 framework.dll和 framework.lib 文件,则进入source文件夹路径下,执行以下命令,生成的文件(C:\Users\xx_bazel_xx\47nc6e7r\execroot\org_tensorflow\bazel-out\x64_windows-opt\bin\tensorflow下)参照上面进行修改后缀,然后将修改名字后的framework.dll放到lib文件夹下, framework.lib放到lib文件夹下。
bazel build --config=opt --config=cuda --define=no_tensorflow_py_deps=true --copt=-nvcc_options=disable-warnings //tensorflow:libtensorflow_framework.so --verbose_failures
这篇博客早先写了部分,后面发现不少更为详细的博客,这里也顺便推荐给各位朋友: