项目部署上需要,需要编译Tensorflow的C++接口。参考了很多文章,折腾了好几天,最后记录一下我的编译过程。
1.编译工具准备
第一个重要的点:确保版本匹配。
一定要让 Tensorflow,python,VS,Bazel,CUDA,cuDNN 版本匹配,大部分编译出问题都是版本不匹配。官方的推荐版本映射关系,参考下表。
最后我采用的环境:
- Visual Studio 2015 with update3
- Anacoda3(Python3.6.5)
- CUDA 10.0
- cuDNN 7.6.5
- Tensorflow-1.13.1
- bazel-0.20.0-windows-x86_64.exe
- msys2-x86_64-20210419.exe
**注意:**这里需要说明一下,cuDNN对应版本应该采用7.4,但我机子已经安装了7.6,懒得换了就直接用的,暂时没发现问题。其他模块我都保持和它要求一致的。
第二个重要的点:请准备一个番羽强工具
安装过程中有很多需要下载的模块,如果不能连外面,大概率会失败。
2.安装CUDA
安装VS2015这个就可以略过了,正常安装就行了。
安装cuda也很简单,默认安装就可以了。
cuDNN解压后直接拷贝到cuda目录就可以了
注意:安装完成后要重启系统
验证安装后是否正常
打开 cmd 命令行
输入
nvcc -V
可以查看当前cuda版本
3.安装Anaconda
我安装的是Anaconda3-5.2.0-Windows-x86_64.exe
对应的是python3.6.5,当然你也可以不安装Anaconda,直接安装python,也是可以的。
注意:要勾选 Add Anaconda to my PATH environment variable
安装完成后要重启系统
重启后在命令行输入python查看当前是否成功
4.安装msys2
进入msys2官网
http://www.msys2.org/
下载最新的版本就可以了
推荐安装到默认路径
c:\msys64
安装完成后后自动执行弹出一个类似cmd命令行的窗口,
输入
pacman -Syu
提示要下载什么,直接 y 就可以了
执行完成后继续输入命令
pacman -S git
又会下载一堆东西,继续 y
执行完成后,输入
pacman -S patch unzip grep
继续 y
注意:如果不能下载失败,就检测下你的fq工具是否开着。
添加环境变量
将以下路径添加到环境变量的path中:
c:\msys64
c:\msys64\usr\bin
设置完成后,重启系统,环境变量才会生效。
5.安装bazel
从官网下载程序:
bazel-0.20.0-windows-x86_64.exe
地址:
https://github.com/bazelbuild/bazel/releases/download/0.20.0/bazel-0.20.0-windows-x86_64.exe
将下载好的 .exe 文件复制到 c:\msys64 下,更名为 bazel.exe。
接下来配置bazel环境变量。
新建三个系统变量:
BAZEL_SH,BAZEL_VC,BAZEL_VS
设置对应的VC和Msys64路径
6.配置Tensorflow
(1)下载代码和编译脚本
Tensorflow源码:
https://github.com/tensorflow/tensorflow/archive/v1.13.1.zip
Tensorflow编译脚本:
https://github.com/guikarist/tensorflow-windows-build-script/archive/master.zip
下载后把源码目录改为source,并和脚本放到一个目录里:
(2)配置文件
将 patches 下的 eigen_half.patch 复制到 tensorflow-1.13.1\source\third_party 下:
将 patches 下的 tf_exported_symbols_msvc.lds 复制到
tensorflow-1.13.1\source\tensorflow 下:
(3)修改编译文件
用文本编辑器打开编译文件‘
build.ps1
将以下语句注释掉,因为上面我们已经拷贝过了。
#Copy-Item …\patches\tf_exported_symbols_msvc.lds tensorflow
将python版本和路径改成自己的版本路径:
将里面py命令改成python
7.用powershell进行配置编译
(1)在 C:\Windows\SysWOW64\WindowsPowerShell\v1.0
目录下,右键以管理员身份运行
powershell.exe
切换到Tensorflow目录。
(2)先打开一下执行权限
set-ExecutionPolicy RemoteSigned
输入y
(3)配置编译选项
输入配置命令:
$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
继续选择配置
注意:如果是1060的选6.1,2070显卡选7.5,3070的就是8.6
编译中途报错,提示下载的模块校验不对。
根据提示打开tensorflow-1.13.1\source\third_party\icu目录下的脚本文件
workspace.bzl
直接替换成
86b85fbf1b251d7a658de86ce5a0c8f34151027cc60b01e1b76f167379acf181
然后回到上一步,重新执行编译。
大约二十分钟,顺利编译完成
8.整理库文件
新建一个文件夹,在文件夹中创建以下三个目录:
dll,lib,include
首先根据编译结束时显示的动态库所在位置,找到生成的库
libtensorflow_cc.so 和 liblibtensorflow_cc.so.ifso
将 libtensorflow_cc.so 更名为 tensorflow_cc.dll,放到刚才创建的 dll 目录下;
将 liblibtensorflow_cc.so.ifso 更名为 tensorflow_cc.lib,放到刚才创建的 lib 目录下
接下来要做的是填满 include 目录
1)复制_bin
在include目录中新建名为 _bin 的文件夹
将当前机器上的目录
C:\Users\admin_bazel_admin\install\d5b1be53d8db6a1e2d160364df2e7ef6_embedded_binaries
里面的内容(如下图框出)
全部复制到刚才新建的目录
include/_bin
2)复制bazel-out
C:\Users\admin_bazel_admin\lozrchqc\execroot\org_tensorflow
下的bazel-out
3)拷贝protobuf_archive
将目录
C:\Users\admin_bazel_admin\lozrchqc\execroot\org_tensorflow\external
下的protobuf_archive拷贝到上一步的bazel-out\目录的子目录下
..\include\bazel-out\x64_windows-opt\genfiles\external
4)拷贝tensorflow
将 tensorflow-1.13.1\source 下的
tensorflow 和 third_party
复制到 include 目录下
5)拷贝external
将C:\Users\admin_bazel_admin\lozrchqc 目录下的external 文件夹
6)拷贝bazel_tools
将目录
C:\Users\admin_bazel_admin\install\d5b1be53d8db6a1e2d160364df2e7ef6_embedded_binaries\embedded_tools
下所有文件拷贝到
include/external/bazel_tools
目录下
7)拷贝tensorflow头文件
将source/tensorflow
拷贝到
include\external\org_tensorflow目录下
这样,这个include目录就整理好了,如下图
以上,所有C++需要的头文件和库就编译好了,下面就可以直接使用。