一、前言
在深度学习项目开发过程中,通常在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.
-
从
https:/
/github.com/google
/protobuf/releases下载protobuf-cpp-
3.5.
0.tar.gz
-
解压获得一个protobuf-
3.5.
0的文件夹
-
-
根据官方教程
https:/
/github.com/protocolbuffers
/protobuf/blob
/master/src
/README.md
-
安装protobuf相关依赖
-
sudo apt-get install autoconf automake libtool curl make g++ unzip
-
-
安装protobuf
-
cd prtobuf-3.5.0
-
./configure
-
sudo make -j8
-
make check -j8
-
sudo make install
-
sudo ldconfig
make check结果如下图:
2.下载并安装Eigen,这是一个C++端的矩阵运算库
-
wget http:
//bitbucket.org/eigen/eigen/get/3.3.4.tar.bz2
-
下载之后解压,重新命名为eigen3,放到某个路径下,安装
-
-
mkdir build
-
cd build
-
cmake ..
-
make
-
sudo
make install
四、编译tensorflow
1.安装Bazel 和 zlib1g
-
在https://github.com/bazelbuild/bazel/releases下载Bazel的安装包,
-
本文版本为bazel-0.10.1-installer-linux-x86_64.sh
-
-
执行安装
-
sudo
chmod 777 ./bazel-0.10.1-installer-linux-x86_64.sh
-
-
./bazel-0.10.1-installer-linux-x86_64.sh
-
-
注意:bazel版本不能过高,否则会报错
-
安装zlib1g
-
-
sudo apt-
get install zlib1g.dev
2.编译安装tensorflow
-
# git tensorflow
-
-
sudo apt install git
-
git
clone https://github.com/tensorflow/tensorflow.git
-
-
cd tensorflow
-
-
git checkout r1.8
-
-
# 执行configure
-
sudo ./configure
-
接下来需要指定python路径,和各种编译选项
-
-
具体选项的含义详见官网介绍
https:/
/tensorflow.google.cn/install
/source
-
-
本文的第一个y/N选择y,后面的都是N,路径均选择默认路径
-
# 使用bazel去编译
-
#--config=monolithic是为了避免与opencv的冲突
-
bazel build --config=opt --config=monolithic /
/tensorflow:libtensorflow_cc.so /
/ 无显卡,cpu版本
-
bazel build --config=opt --config=cuda --config=monolithic /
/tensorflow:libtensorflow_cc.so /
/ 有显卡
-
编译完成后,可能因为网络问题导致一些文件下载失败,执行如下命令
-
./tensorflow/contrib/makefile/download_dependencies.sh
-
#完成后会在makefile中产生一个download文件夹。
-
./tensorflow/contrib/makefile/build_all_linux.sh
-
#完成后会在makefile中产生一个gen文件夹。
-
# 把必要.h头文件以及编译出来.so的动态链接库文件复制到指定的一些路径下:
-
sudo
mkdir /usr/local/include/tf
-
sudo
cp -r bazel-genfiles/ /usr/local/include/tf/
-
sudo
cp -r tensorflow /usr/local/include/tf/
-
sudo
cp -r third_party /usr/local/include/tf/
-
sudo
cp bazel-bin/tensorflow/libtensorflow_cc.so /usr/local/lib/
-
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文件如下
-
cmake_minimum_required (VERSION
2.8
.8)
-
project (tf_example)
-
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -g -std=c++11 -W")
-
link_directories(./lib)
-
include_directories(
-
include
/tf/tensorflow
-
include
/tf/bazel-genfiles
-
include
/tf/downloads
/nsync/
public
-
include
/tf/gen
/protobuf/include
-
/usr/local
/include/eigen3
-
)
-
add_executable(tf_test tf.cpp)
-
target_link_libraries(tf_test tensorflow_cc tensorflow_framework)
编译运行
-
cd build
-
cmake ..
-
make
-
./tf_test digit.jpg
得到输出结果如上图,即表示编译和测试成功!
</article>
TensorFlow编译过程中遇到的问题及解决方案
最近一直尝试使用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