win10+vs2015+tensorflow+bazel编译gpu c++ dll

安装软件及硬件
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

新建一个文件夹,创建三个目录dlllibinclude

将 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

测试工程即可编译成功 

                             

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xin-yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值