因为要做工程化,所以最近用了一些时间来研究c++版本的tensorflow 当然官网没有提供现成的库包,只能自己根据原码编译。网上翻了一遍,发现资料很多 但都相对较为零散,这边记录一下自己编译库包(Release和Debug版本)的流程以及自己踩的坑。
个人尝试了很多个版本,但相对只有1.8版本通过编译,1.10版本总有rpc相关错误(设置了OFF,任报错),在往上的高版本,cmake生成vs工程都困难重重,就没有继续研究下去 。
win10
vs2017
cmake3.8.2(3以上版本都可)
Swigwin-3.0.12
tensorflow-r1.8
python3.6(Anaconda)
编译时候会从git和一些国外网站在线下载一些依赖库包,所以提取要准备好自己的网络(各位应该都懂。。),否则一直处于time out状态.
在tensorflow-r1.8\tensorflow\contrib\cmake下面新建一个build文件夹,作为vs工程的生成目录.
修改cmakeList文件:
1、招到if (tensorflow_OPTIMIZE_FOR_NATIVE_ARCH)那一段代码,用下面的替换:
if (tensorflow_OPTIMIZE_FOR_NATIVE_ARCH) include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_OPT_ARCH_NATIVE_SUPPORTED) if (COMPILER_OPT_ARCH_NATIVE_SUPPORTED) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native") else() CHECK_CXX_COMPILER_FLAG("/arch:AVX" COMPILER_OPT_ARCH_AVX_SUPPORTED) if(COMPILER_OPT_ARCH_AVX_SUPPORTED) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX") endif() endif() endif()2、设置option(tensorflow_ENABLE_GRPC_SUPPORT "Enable gRPC support" OFF) 设置为off
cmake构建命令:
打开vs2017的x64命令工具(管理员身份), 开启powershell(方便命令操作), 切换到build文件夹,输入如下cmake命令:
release版本:
cmake .. -A x64 -DCMAKE_BUILD_TYPE=Release -DSWIG_EXECUTABLE=G:/TFCode/Tool/swigwin-3.0.12/swig.exe -DPYTHON_EXECUTABLE=C:/ProgramData/Anaconda3/envs/py36/python.exe -DPYTHON_LIBRARIES=C:/ProgramData/Anaconda3/envs/py36/libs/python36.lib -Dtensorflow_ENABLE_GPU=OFF -Dtensorflow_ENABLE_GRPC_SUPPORT=OFF -Dtensorflow_BUILD_SHARED_LIB=ONDebug版本:
cmake .. -A x64 -DCMAKE_BUILD_TYPE=Debug -DSWIG_EXECUTABLE=G:/TFCode/Tool/swigwin-3.0.12/swig.exe -DPYTHON_EXECUTABLE=C:/ProgramData/Anaconda3/envs/py36/python.exe -DPYTHON_LIBRARIES=C:/ProgramData/Anaconda3/envs/py36/libs/python36_d.lib -Dtensorflow_ENABLE_GPU=OFF -Dtensorflow_ENABLE_GRPC_SUPPORT=OFF -Dtensorflow_BUILD_SHARED_LIB=ON两句命令差别在于DCMAKE_BUILD_TYPE参数 和 DPYTHON_LIBRARIES参数
构建好vs工程后还是执行vs编译命令(build目录下):如下:
set PreferredToolArchitecture=x64防止第二遍中编译器的堆空间不足的错误
release:
MSBuild /p:Configuration=Release ALL_BUILD.vcxprojdebug
MSBuild /p:Configuration=Debug ALL_BUILD.vcxproj编译时长根据电脑性能决定 一般在3小时左右 基本不存在一次通过的可能 。
编译完成之后,最后的一步是从十几个G的编译结果中提取安装包(install).在build文件夹下执行如下命令:
release: cmake.exe -DBUILD_TYPE=Release -P cmake_install.cmake debug: cmake.exe -DBUILD_TYPE=Debug-P cmake_install.cmake生成如下安装文件:
1
编译debug版本报错,错误原因就是DPYTHON_LIBRARIES参数没有设置为python_d.lib。 conda命令安装的python一般没有pythonde debug版本。可以直接去官网下载安装包,在安装的时候直接勾选上generate debug library的选项,就有了python_d.lib文件了.
2
错误和第二遍编译器的对空间不足基本一样,如果设置了set PreferredToolArchitecture=x64应该不会在报错,如果报了错误也不慌,等当前编译结束后,继续执行一遍编译命令.
3 re2 testing导致编译失败
re2包提供了正则表达式的功能,文件夹testing中是测试文件,在TensorFlow运行过程中其实不需要这些测试功能,所以可以通过禁止编译re2的测试部分来移除这些错误
修改tensorflow\contrib\cmake\build\re2\src\re2\CMakeLists.txt配置项为OFF,然后在重新执行编译命令
option(RE2_BUILD_TESTING “enable testing for RE2” OFF)注意:
实际调用tensorflow库包时候,需要加两个预处理命令否者编译会报错。
COMPILER_MSVC NOMINMAX #include<iostream> #include "tensorflow/cc/client/client_session.h" #include "tensorflow/cc/ops/standard_ops.h" #include "tensorflow/core/framework/tensor.h" int main() { using namespace tensorflow; using namespace tensorflow::ops; Scope root = Scope::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; }