概述
本文旨在实现Windows环境下Tensorflow-gpu_C++版本库文件编译与使用。经测试,选取tensorflow-1.8.0版本源码进行编译[1],不同CUDA版本的开发环境可按照本教程编译tensorflow-1.8.0_C++库文件。主要参考教程:https://blog.csdn.net/yuejisuo1948/article/details/84197534。
注1:笔者编译1.8版本源码时最新版tensorflow源码为1.13版本,编译过程中共编译了1.3、1.4、1.8、1.10、1.12五个版本源码,其中1.3、1.4有无法解决的错误,1.10、1.12错误较多,因此选择1.8版本源码进行编译。
一、环境配置
Ø 操作系统 Windows 10 64位
Ø 处理器 英特尔 Core i7-7700 @ 3.60GHz 四核
Ø 显卡 Nvidia GeForce GTX 1080 Ti ( 11 GB / 技嘉 )
Ø CUDA cuda_9.0
Ø CUDNN cudnn_7.4
二、依赖安装
Ø VS2015
Ø Python-3.5
Ø Swigwin
Ø Cmake
Ø Git
VS2015与Python-3.5安装不过多赘述,下面介绍Swigwin、Cmake、Git安装方法。
2.1 Swigwin安装
① 进入官网地址:http://swig.org/download.html
② 点击下载压缩文件

③ 将可执行文件添加至环境变量
右键此电脑->属性->高级系统设置->环境变量,在下面系统变量一栏中点击Path->编辑->新建,输入可执行文件目录。(例:E:TensorFlowc++_libTensorFlowc++_libswigwin-3.0.12,swig.exe位于此目录下)
2.2 Cmake安装
① 进入官网地址:https://cmake.org/download/
② 下载安装包
③ 点击安装(选择加入环境变量选项)
2.1 Git安装
① 进入官网地址:https://git-scm.com/downloads
② 下载安装包
③ 点击安装(选择加入环境变量选项)
三、源码编译
① 下载tensorflow-1.8.0源码:https://github.com/tensorflow/tensorflow/tree/v1.8.0。
② 进入文件路径E:TensorFlowc++_libtensorflow-1.8.0tensorflowcontribcmake,新建文件夹build。
③ 以管理员身份运行,开始所有程序Visual Studio 2015Visual Studio ToolsVS2015开发人员命令提示工具,切换到build目录下。使用以下命令编译出VS工程文件:cmake .. -A x64 -DCMAKE_BUILD_TYPE=Release -DSWIG_EXECUTABLE=E:/TensorFlow/c++_lib/swigwin-3.0.12/swig.exe -DPYTHON_EXECUTABLE=E:/TensorFlow/c++_lib/python-3.5/python.exe -DPYTHON_LIBRARIES=E:/TensorFlow/c++_lib/python-3.5/libs/python35.lib -Dtensorflow_ENABLE_GPU=ON -Dtensorflow_ENABLE_GRPC_SUPPORT=OFF -Dtensorflow_BUILD_SHARED_LIB=ON
命令解析:
Ø CMAKE_BUILD_TYPE:编译库版本,此处编译的为Release
Ø SWIG_EXECUTABLE:swig.exe可执行文件路径
Ø PYTHON_EXECUTABLE:python.exe可执行文件路径
Ø PYTHON_LIBRARIES:python.lib库文件路径
Ø tensorflow_ENABLE_GPU:编译gpu版本
Ø tensorflow_ENABLE_GRPC_SUPPORT:关闭grpc支持(未知原因若开启会导致编译失败)
Ø tensorflow_BUILD_SHARED_LIB:编译静态库文件(即只需一个lib文件即可运行tensorflow_static.lib,否则需要tensorflow.lib、tensorflow.dll配合使用)
注:tensorflow_ENABLE_GPU、tensorflow_ENABLE_GRPC_SUPPORT等命令在E:TensorFlowc++_libtensorflow-1.8.0tensorflowcontribcmake路径下CMakeLists.txt文件中也可手动设置开启(ON)、关闭(OFF)
④ 进入文件路径E:TensorFlowc++_libtensorflow-1.8.0tensorflowcontribcmakebuild,打开tensorflow.sln,将以下几个项目添加库路径$(SolutionDir)$(Configuration);,否则编译过程中会出现链接错误。右键项目->属性->配置属性->链接器->常规->附加库目录,添加$(SolutionDir)$(Configuration);


⑤ 设置最多并行生成几个项目,防止编译过程中内存耗尽。菜单栏中的工具->选项->项目和解决方案->生成并运行,将其中的最大并行项目生成数,改为2。

⑥ 关闭360安全卫士(生成的exe文件会被当做木马处理),点击生成解决方案,编译时间约为两个小时。编译成功后,在E:TensorFlowc++_libtensorflow-1.8.0tensorflowcontribcmakebuildRelease路径下会生成tensorflow-gpu_C++版库文件。

四、测试用例
编写测试项目test,项目结构如下:

① 头文件main.h文件内容
#pragma once //这一句防止重复include头文件
#define COMPILER_MSVC
#define NOMINMAX //这一句防止max/min函数命名冲突
注:头文件中必须包含此句定义#define COMPILER_MSVC,否则编译失败
② 源文件main.cpp文件内容
#include "main.h"
#include "tensorflow/cc/client/client_session.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/core/framework/tensor.h"
using namespace tensorflow;
using namespace tensorflow::ops;
int main() {
Scope root = ScopE:TensorFlowc++_lib:NewRootScope();
// Matrix A = [3 2; -1 0]
auto A = Const(root, { { 3.f, 2.f },{ -1.f, 0.f } });
// Vector b = [3 5]
auto b = Const(root, { { 3.f, 5.f } });
// v = Ab^T
auto v = MatMul(root.WithOpName("v"), A, b, MatMul::TransposeB(true));
std::vector<Tensor> outputs;
ClientSession session(root);
// Run and fetch v
TF_CHECK_OK(session.Run({ v }, &outputs));
// Expect outputs[0] == [19; -3]
LOG(INFO) << outputs[0].matrix<float>();
return 0;
}
③ 添加头文件路径

④ 添加库文件路径

⑤ 编译并运行test.exe

输出19 -3表示库文件编译成功。
五、问题汇总
Ø warning C4003: “max”宏的实参不足
error C2589: “(” : “::”右边的非法标记
修改:
将std::numeric_limits::max()改为(std::numeric_limits::max)()