安装软件及硬件
1. 安装vs2015 update3,CUDA 9.0和cuDNN 7.6,独立显卡GTX 1650,算力6.1,win10 x64系统
2. 安装msys2
3. 安装bazel及相关库
4. 下载tensorflow1.12.0源码 5. 通过anaconda安装python3.6
6. 使用powershell进行配置与编译
7. 整理生成的文件dll,lib,include
安装vs2015 update3,CUDA 9.0和cuDNN 7.6
1.vs2015 update3安装
Anaconda3+python3.6,CUDA9.0和cuDNN7.6在英伟达官网下载软件安装
2.安装msys2
进入msys2官网或者msys2 github,选择msys2-x86_64安装包下载,可以选择默认安装。
安装完成后,运行msys2,
1).执行命令
pacman -Syu
询问是否进行安装,输入y,回车,等待执行完成
2).输入命令
pacman -S git
询问是否安装,输入 y,回车,等待执行完成
3).输入命令
pacman -S patch unzip grep
询问是否安装,输入 y,回车,等待执行完成
msys2软件装好后,需要配置系统环境变量
将以下路径添加到系统变量 path 中:
C:\msys64
C:\msys64\usr\bin
3.安装bazel及相关库
进入github,选择bazel-0.20.0-windows-x86_64或其他更新版本进行下载
将下载的bazel-0.20.0....exe 文件复制到 C:\msys64 下(根据bazel安装路径),更名为 bazel.exe
然后配置bazel系统环境变量
新建三个系统变量:BAZEL_SH,BAZEL_VC,BAZEL_VS,路径如下表格所示:
变量 值
BAZEL_SH C:\msys64\usr\bin\bash.exe
BAZEL_VC C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
BAZEL_VS C:\Program Files (x86)\Microsoft Visual Studio 14.0
到此,bazel环境配置完成
4. 下载tensorflow1.12.0源码
在tensorflow-v1.12.1源码的github地址 下载tensorflow源码
进入tensorflow-windows-build-script-master的github页面下载
以上两个 .zip 文件下载完成后,在C盘新建一个文件夹,命名为 tensorflow-1.12.0
将下载好的 tensorflow-1.12.0.zip 解压到C:\\tensorflow-1.12.0 文件夹下,重新命名为 source;
将 tensorflow-windows-build-script-master.zip 中的 patches 和 build.ps1 文件,复制到C:\\tensorflow-1.12.0目录下,如下图所示:
将 patches 下的 eigen_half.patch 复制到 C:\\tensorflow-1.12.0\source\third_party 下
将 patches 下的 tf_exported_symbols_msvc.lds 复制到 C:\\tensorflow-1.13.1\source\tensorflow 下
用文本编辑器打开 build.ps1 文件,修改以下语句:
Copy-Item …\patches\tf_exported_symbols_msvc.lds tensorflow\
==>
#Copy-Item …\patches\tf_exported_symbols_msvc.lds tensorflow\
防止编译时出现Copy-Item命令的问题
py -3 -m venv venv
==>
python -m venv venv
py configure.py
==>
python configure.py
5. 通过anaconda安装python3.6
选择对应python3.6版的anaconda进行安装
如果很熟练,可以选择最新的anaconda,然后增加python3.6环境即可
6. 使用powershell进行配置与编译
在 powershell 窗口中输入以下命令
查看powershell 的执行策略是否受限,输入以下命令查看当前执行策略
Get-ExecutionPolicy
显示Restricted(受限的),就需要输入以下语句来取消限制
Set-ExecutionPolicy Unrestricted
询问是否改变执行策略,输入 y,回车即可,再次查看:
Get-ExecutionPolicy
转到 C:\\tensorflow-1.12.0 目录下
cd C:\tensorflow-1.12.0
输入bazel编译的选项
$parameterString = "--config=opt --config=cuda --define=no_tensorflow_py_deps=true --copt=-nvcc_options=disable-warnings //tensorflow:libtensorflow_cc.so --verbose_failures"
然后执行 build.ps1 脚本文件
.\build.ps1 -BazelBuildParameters $parameterString -BuildCppAPI -ReserveSource
注意 :当问到GPU的计算能力(compute capability),即出现 [Default is: 3.5, 7.0]: 时,先不要急着按回车,先找到跟自己显卡对应的计算能力,再进行填写,可在英伟达官网查看显卡的计算能力
进入NVDIA官网的CUDA GPUs页面,点击 CUDA-Enabled GeForce and TITAN Products,找到自己的显卡型号对应的数值,将其填入 [Default is: 3.5, 7.0]: 后面,回车继续配置。
都配置完成后,编译正式开始。注意保持网络通畅,因为编译之前需要下载各种依赖库,网络异常会导致下载失败停止编译,编译时间很长。如果下载失败,那需要使用翻墙软件,直到所有相关软件/库下载成功为止。
全部编译完成即可。
注意:打开编译生成的动态库 libtensorflow_cc.so 所在位置,
7.整理生成的文件dll,lib,include
新建一个文件夹,创建三个目录dll,lib,include
将 libtensorflow_cc.so 更名为 tensorflow_cc.dll,放到 dll 中;将 liblibtensorflow_cc.so.ifso 更名为 tensorflow_cc.lib,放到 lib 中;
include需要拷贝几个路径中的文件
到此,tensorflow1.12.0 gpu版的c++ dll已全部准备完成
可以自行下载demo测试,
注意:
解决方案设置:选择 Release 和 x64
编译测试工程时:提示max错误
则在 logging.h 和 tensor_shape.h中,修改如下
longging.h
if (TF_PREDICT_FALSE(v2 >= std::numeric_limits<int>::max())) { \
==>
if (TF_PREDICT_FALSE(v2 >= (std::numeric_limits<int>::max)())) { \
tensor_shape.h
static const int64 kMaxRep16 = std::numeric_limits<uint16>::max() - 1;
static const int64 kMaxRep32 = std::numeric_limits<uint32>::max() - 1;
static const uint16 kUnknownRep16 = std::numeric_limits<uint16>::max();
static const uint32 kUnknownRep32 = std::numeric_limits<uint32>::max();
==>
static const int64 kMaxRep16 = (std::numeric_limits<uint16>::max)() - 1;
static const int64 kMaxRep32 = (std::numeric_limits<uint32>::max)() - 1;
static const uint16 kUnknownRep16 = (std::numeric_limits<uint16>::max)();
static const uint32 kUnknownRep32 = (std::numeric_limits<uint32>::max)();
如果还有提示std::max或std::min重载定义调用不明确,
则在头文件下使用
#undef max
#undef min
测试工程即可编译成功