【Tensorflow】Ubuntu16.04下编译tensorflow C++ API接口并调用模型

一、前言

在深度学习项目开发过程中,通常在python环境中训练和测试模型,测试稳定后再将其转移至C++平台进行部署,之前的文章已经介绍过如何在Win10 VS2015环境下编译tensorflow C++ API,因工作原因,需要将Windows环境的项目转移至Linux下,本文记录了在Ubuntu16.04下编译tensorflow C++ API接口并调用的过程。

二、配置.版本及相关依赖

本文在Ubuntu16.04环境下编译tensorflow1.8

相关依赖包括protobuf3.5.0,Eigen3.3.4

三、安装相关依赖

1.安装protobuf,需要与tensorflow版本相对应,本文安装的是protobuf3.5.


    
    
  1. https:/ /github.com/google /protobuf/releases下载protobuf-cpp- 3.5. 0.tar.gz
  2. 解压获得一个protobuf- 3.5. 0的文件夹
  3. 根据官方教程 https:/ /github.com/protocolbuffers /protobuf/blob /master/src /README.md
  4. 安装protobuf相关依赖
  5. sudo apt-get install autoconf automake libtool curl make g++ unzip
  6. 安装protobuf
  7. cd prtobuf-3.5.0
  8. ./configure
  9. sudo make -j8
  10. make check -j8
  11. sudo make install
  12. sudo ldconfig

make check结果如下图:

2.下载并安装Eigen,这是一个C++端的矩阵运算库


    
    
  1. wget http: //bitbucket.org/eigen/eigen/get/3.3.4.tar.bz2
  2. 下载之后解压,重新命名为eigen3,放到某个路径下,安装
  3. mkdir build
  4. cd build
  5. cmake ..
  6. make
  7. sudo make install

四、编译tensorflow

1.安装Bazel 和 zlib1g


    
    
  1. 在https://github.com/bazelbuild/bazel/releases下载Bazel的安装包,
  2. 本文版本为bazel-0.10.1-installer-linux-x86_64.sh
  3. 执行安装
  4. sudo chmod 777 ./bazel-0.10.1-installer-linux-x86_64.sh
  5. ./bazel-0.10.1-installer-linux-x86_64.sh
  6. 注意:bazel版本不能过高,否则会报错

    
    
  1. 安装zlib1g
  2. sudo apt- get install zlib1g.dev

2.编译安装tensorflow


    
    
  1. # git tensorflow
  2. sudo apt install git
  3. git clone https://github.com/tensorflow/tensorflow.git
  4. cd tensorflow
  5. git checkout r1.8
  6. # 执行configure
  7. sudo ./configure


    
    
  1. 接下来需要指定python路径,和各种编译选项
  2. 具体选项的含义详见官网介绍 https:/ /tensorflow.google.cn/install /source
  3. 本文的第一个y/N选择y,后面的都是N,路径均选择默认路径


    
    
  1. # 使用bazel去编译
  2. #--config=monolithic是为了避免与opencv的冲突
  3. bazel build --config=opt --config=monolithic / /tensorflow:libtensorflow_cc.so / / 无显卡,cpu版本
  4. bazel build --config=opt --config=cuda --config=monolithic / /tensorflow:libtensorflow_cc.so / / 有显卡

编译完成后,可能因为网络问题导致一些文件下载失败,执行如下命令


    
    
  1. ./tensorflow/contrib/makefile/download_dependencies.sh
  2. #完成后会在makefile中产生一个download文件夹。
  3. ./tensorflow/contrib/makefile/build_all_linux.sh
  4. #完成后会在makefile中产生一个gen文件夹。

    
    
  1. # 把必要.h头文件以及编译出来.so的动态链接库文件复制到指定的一些路径下:
  2. sudo mkdir /usr/local/include/tf
  3. sudo cp -r bazel-genfiles/ /usr/local/include/tf/
  4. sudo cp -r tensorflow /usr/local/include/tf/
  5. sudo cp -r third_party /usr/local/include/tf/
  6. sudo cp bazel-bin/tensorflow/libtensorflow_cc.so /usr/local/lib/
  7. sudo cp bazel-bin/tensorflow/libtensorflow_framework.so /usr/local/lib

至此tensorflow 的 C++接口已编译完毕,接下来是测试部分。

五、测试tensorflow C++ API调用pb模型

下载测试项目的Git:GitHub - zhangcliff/tensorflow-c-mnist

在tensorflow-c-mnist中新建头文件include文件夹和so库文件夹lib,将编译生成的.so动态链接库和include文件夹分别copy到这两个新建的lib和include文件夹下。

新建CMakeLists.txt文件如下


    
    
  1. cmake_minimum_required (VERSION 2.8 .8)
  2. project (tf_example)
  3. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -W")
  4. link_directories(./lib)
  5. include_directories(
  6. include /tf/tensorflow
  7. include /tf/bazel-genfiles
  8. include /tf/downloads /nsync/ public
  9. include /tf/gen /protobuf/include
  10. /usr/local /include/eigen3
  11. )
  12. add_executable(tf_test tf.cpp)
  13. target_link_libraries(tf_test tensorflow_cc tensorflow_framework)

编译运行


    
    
  1. cd build
  2. cmake ..
  3. make
  4. ./tf_test digit.jpg

得到输出结果如上图,即表示编译和测试成功!

</article>

TensorFlow编译过程中遇到的问题及解决方案

TensorFlow 专栏收录该内容
4 篇文章 0 订阅

最近一直尝试使用TensorFlow源码进行编译,在编译过程中遇到一个Status 4的错误码。 github问题链接

其完整错误日志如下:

ERROR: /home/wangbing/Git/tensorflow/tensorflow/core/kernels/BUILD:297:1: C++ compilation of rule '//tensorflow/core/kernels:mirror_pad_op' failed: crosstool_wrapper_driver_is_not_gcc failed: error executing command 
  (cd /home/wangbing/.cache/bazel/_bazel_wangbing/ab8decc7da56ae5392500261af1cc855/tensorflow && \
  exec env - \
    PATH=/home/wangbing/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/wangbing/bin \
  third_party/gpus/crosstool/clang/bin/crosstool_wrapper_driver_is_not_gcc -U_FORTIFY_SOURCE '-D_FORTIFY_SOURCE=1' -fstack-protector -fPIE -Wall -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer -g0 -O2 -DNDEBUG -ffunction-sections -fdata-sections '-std=c++11' -iquote . -iquote bazel-out/local_linux-opt/genfiles -iquote external/bazel_tools -iquote bazel-out/local_linux-opt/genfiles/external/bazel_tools -iquote external/farmhash_archive -iquote bazel-out/local_linux-opt/genfiles/external/farmhash_archive -iquote external/jpeg_archive -iquote bazel-out/local_linux-opt/genfiles/external/jpeg_archive -iquote external/png_archive -iquote bazel-out/local_linux-opt/genfiles/external/png_archive -iquote external/re2 -iquote bazel-out/local_linux-opt/genfiles/external/re2 -iquote external/eigen_archive -iquote bazel-out/local_linux-opt/genfiles/external/eigen_archive -isystem google/protobuf/src -isystem bazel-out/local_linux-opt/genfiles/google/protobuf/src -isystem external/bazel_tools/tools/cpp/gcc3 -isystem external/farmhash_archive/farmhash-34c13ddfab0e35422f4c3979f360635a8c050260 -isystem bazel-out/local_linux-opt/genfiles/external/farmhash_archive/farmhash-34c13ddfab0e35422f4c3979f360635a8c050260 -isystem external/jpeg_archive/jpeg-9a -isystem bazel-out/local_linux-opt/genfiles/external/jpeg_archive/jpeg-9a -isystem external/png_archive/libpng-1.2.53 -isystem bazel-out/local_linux-opt/genfiles/external/png_archive/libpng-1.2.53 -isystem external/re2 -isystem bazel-out/local_linux-opt/genfiles/external/re2 -isystem third_party/eigen3 -isystem bazel-out/local_linux-opt/genfiles/third_party/eigen3 -isystem external/eigen_archive/eigen-eigen-a5e9085a94e8 -isystem bazel-out/local_linux-opt/genfiles/external/eigen_archive/eigen-eigen-a5e9085a94e8 -isystem third_party/gpus/cuda/include -isystem bazel-out/local_linux-opt/genfiles/third_party/gpus/cuda/include -isystem third_party/gpus/cuda -isystem bazel-out/local_linux-opt/genfiles/third_party/gpus/cuda -fno-exceptions -DEIGEN_AVOID_STL_ARRAY -DTENSORFLOW_USE_EIGEN_THREADPOOL '-DGOOGLE_CUDA=1' -pthread '-DGOOGLE_CUDA=1' -no-canonical-prefixes -Wno-builtin-macro-redefined '-D__DATE__="redacted"' '-D__TIMESTAMP__="redacted"' '-D__TIME__="redacted"' -fno-canonical-system-headers '-frandom-seed=bazel-out/local_linux-opt/bin/tensorflow/core/kernels/_objs/mirror_pad_op/tensorflow/core/kernels/mirror_pad_op.o' -MD -MF bazel-out/local_linux-opt/bin/tensorflow/core/kernels/_objs/mirror_pad_op/tensorflow/core/kernels/mirror_pad_op.d -c tensorflow/core/kernels/mirror_pad_op.cc -o bazel-out/local_linux-opt/bin/tensorflow/core/kernels/_objs/mirror_pad_op/tensorflow/core/kernels/mirror_pad_op.o): com.google.devtools.build.lib.shell.BadExitStatusException: Process exited with status 4.
gcc: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.8/README.Bugs> for instructions.
     
     
  • 看到该错误的第一眼一直以为是由exec env - 导致的终端退出,在研究exec 命令上卡了半天,后来手动执行该命令是可以成功运行的,说明命令本身没有什么问题。
    后来在GitHub上偶然发现了项目本身的成员提到status 4 是内存不足的问题,只需要增加swap空间即可。
    该问题顺利解决。
    Ubuntu下增加swap空间的命令如下:

    # 生成swap镜像文件
    sudo dd if=/dev/zero of=/mnt/512Mb.swap bs=1M count=512
    # 对该镜像文件格式化
    sudo mkswap /mnt/512Mb.swap
    # 挂载该镜像文件 
    sudo swapon /mnt/512Mb.swap
           
           
    • 至此,使用free -m 即可查看到swap空间已经增加成功。

</article>

原创链接:https://blog.csdn.net/flyconley/article/details/96110990?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2defaultCTRLISTRate-5.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultCTRLISTRate-5.pc_relevant_default&utm_relevant_index=5

https://blog.csdn.net/sydpz1987/article/details/51493844

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值