Ubuntu16.04编译tensorflow的C++接口
原文:https://www.bearoom.xyz/2018/09/27/ubuntu1604buildtf4cpp/
之前有一篇介绍到在windows下利用VS2015编译tensorflow的C++接口,接下来这篇就介绍下在Ubuntu下编译tensorflow的C++接口。
先说一下我的电脑配置,首先是Ubuntu16.04,anaconda用的是3.4.2,CUDA用的是9.0的,cudnn用的是7.0.5的。因为已经在anaconda3上安装好了tensorflow1.7的,但是这次要编译C++的接口,所以我还是选择编译tensorflow1.7的源码。最近重新编译的时候改用了tensorflow1.12。
一、准备编译环境
编译这里要用到bazel来编译,所以要安装它,Ubuntu下安装的指令如下:
echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
然后输入以下指令:
curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
更新:
sudo apt-get update
安装bazel:
sudo apt-get install bazel
这里不要这么做了,因为这么做会把bazel更新到最新的版本,但是编译tensorflow的时候,不同tensorflow要与bazel的版本是对应的,如果这么做的话,后面的操作就会出错,而且也不知道怎么解决。正确的做法应该是下载对应的版本来安装bazel,tensorflow与bazel的版本应该在tensorflow的官网查找:https://tensorflow.google.cn/install/source
linux下tensorflow与python、GCC、Bazel的版本关系,GCC倒是没有问题,应该支持C++11就可以,但bazel就真的还是要对应好版本,不然一大堆问题,折腾。
Version |
Python version |
Compiler |
Build tools |
tensorflow-1.14.0 |
2.7, 3.3-3.7 |
GCC 4.8 |
Bazel 0.24.1 |
tensorflow-1.13.1 |
2.7, 3.3-3.7 |
GCC 4.8 |
Bazel 0.19.2 |
tensorflow-1.12.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.15.0 |
tensorflow-1.11.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.15.0 |
tensorflow-1.10.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.15.0 |
tensorflow-1.9.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.11.0 |
tensorflow-1.8.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.10.0 |
tensorflow-1.7.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.10.0 |
tensorflow-1.6.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.9.0 |
tensorflow-1.5.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.8.0 |
tensorflow-1.4.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.5.4 |
tensorflow-1.3.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.4.5 |
tensorflow-1.2.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.4.5 |
tensorflow-1.1.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.4.2 |
tensorflow-1.0.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.4.2 |
Version |
Python version |
Compiler |
Build tools |
cuDNN |
CUDA |
tensorflow_gpu-1.14.0 |
2.7, 3.3-3.7 |
GCC 4.8 |
Bazel 0.24.1 |
7.4 |
10.0 |
tensorflow_gpu-1.13.1 |
2.7, 3.3-3.7 |
GCC 4.8 |
Bazel 0.19.2 |
7.4 |
10.0 |
tensorflow_gpu-1.12.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.15.0 |
7 |
9 |
tensorflow_gpu-1.11.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.15.0 |
7 |
9 |
tensorflow_gpu-1.10.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.15.0 |
7 |
9 |
tensorflow_gpu-1.9.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.11.0 |
7 |
9 |
tensorflow_gpu-1.8.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.10.0 |
7 |
9 |
tensorflow_gpu-1.7.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.9.0 |
7 |
9 |
tensorflow_gpu-1.6.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.9.0 |
7 |
9 |
tensorflow_gpu-1.5.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.8.0 |
7 |
9 |
tensorflow_gpu-1.4.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.5.4 |
6 |
8 |
tensorflow_gpu-1.3.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.4.5 |
6 |
8 |
tensorflow_gpu-1.2.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.4.5 |
5.1 |
8 |
tensorflow_gpu-1.1.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.4.2 |
5.1 |
8 |
tensorflow_gpu-1.0.0 |
2.7, 3.3-3.6 |
GCC 4.8 |
Bazel 0.4.2 |
5.1 |
8 |
其他的应该就没啥,就是这个bazel把我给折腾的啊。
这里tensorflow1.12对应的bazel版本是0.15.0,所以去github搜bazel下载http://bazel-0.15.0-installer-linux-x86_64.sh,然后安装。
二、下载tensorflow源码
tensorflow的源码是在github上就可以下载的,目前已经更新到1.11,但是我还是下载了1.7的版本,都已经2.0了,不过我还是下载了1.12,下载之后解压出来。
三、配置编译环境
解压源码之后,进入根目录,输入指令:
./configure
接下来就是配置清单:
这里要说明的是如果有CUDA,那么Do you wish to build Tensorflow with CUDA?一定要选Y,然后其它的我基本都是N
配置好之后就进行编译:
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so
这里如果不用cuda的话(前面配置的时候就不要在CUDA那一项那里输入Y),就输入:
bazel build --config=opt //tensorflow:libtensorflow_cc.so
然后是等待,这个过程大概会花费30分钟左右,而且CPU的占用量是达到100%的,所以这个时候最好就不要坐别的事情了。
编译之后我这里会有一个问题(这个问题我在编译tensorflow1.12的时候没有遇到,所以看不同版本吧):
这个错误并不是因为文件没有而是因为找不到,实际上,这个文件就在tensorflow-r1.7/tensorflow文件夹下,但是需要修改/tensorflow-r1.7/tensorflow/BUILD这个文件才行,打开这个文件之后修改大概在812行,注释掉后,另起一行设置正确的路径:
修改之后重新输入编译的指令编译一次就可以了。编译好之后在文件夹tensorflow-r1.7/bazel-bin/tensorflow下面,会有两个so文件:libtensorflow_cc.so和libtensorflow_framework.so,这两个就是我们需要的。
四、一些错误
下面这几个错误都是在使用的时候发现的,主要是在编译的时候有些依赖文件没有下载到,所以需要自己去下载。
(1)、nsync_cv.h文件缺失:
这个文件一般是会在tensorflow/contrib/makefile/downloads/nsync/public这个文件夹下的,但是我这边是编译tensorflow的时候有些依赖文件没有下载到导致它缺失,解决方法是存在/tensorflow/contrib/makefile/download_dependencies.sh这个文件,执行它来下载相关的文件,相关文件会放在/home/zcx/tensorflow-r1.7/tensorflow/contrib/makefile/downloads这个文件夹下;
(2)、(2)提示Eigen相关的问题
这个问题跟前面的类似,如果下载了相关的依赖文件之后,在/tensorflow-r1.7/tensorflow/contrib/makefile/downloads文件夹下找到eigen文件夹,进入之后执行以下指令进行eigen的编译:
mkdir build
cd build
cmake ..
make
sudo make install
(3)、提示关于protobuf版本的问题
问题如下:
这个主要是protobuf版本的问题,所以要查看bazel-genfiles/tensorflow/core/framework/types.pb.h这个文件夹中关于protobuf的版本要求,然后下载相应的版本来更新即可,这里tensorflow1.12要求是protobuf要大于等于3.6:
所以就去github上下载对应的protobuf版本。要下载源码,然后编译安装即可。
暂时我就遇到这几个问题,之后如果还有遇到其它问题,我会继续更新的。
五、参考
1、https://blog.csdn.net/zwx1995zwx/article/details/79064064
阳光
在天上一闪
又被乌云埋掩
暴雨冲洗着
我灵魂的底片-- 顾城
Ubuntu16.04编译tensorflow的C++接口的更多相关文章
- Ubuntu16.04编译安装php
#Ubuntu16.04编译安装php Ubuntu16.04上面搭建基于Nginx的php服务.Nginx使用apt直接安装的. sudo apt install nginx php的安装部署步骤主 ...
- Ubuntu16.04安装TensorFlow及Mnist训练
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com TensorFlow是Google开发的开源的深度学习框架,也是当前使用最广泛的深度学习框架. 一.安 ...
- Ubuntu16.04编译安装tensorflow,2018最新血泪踩坑之后的全面总结!绝对成功!【转】
本文转载自:https://blog.csdn.net/pzh11001/article/details/79683133 大家好,我是 (深度学习硬件DIY总群)(719577294)群主: ...
- Ubuntu16.04编译Android6.0/cm13.0教程及相关错误解决办法
一.必备工作 1.安装依赖库 sudo apt--dev libesd0-dev git-core gnupg flex bison gperf build-essential zip curl zl ...
- ubuntu16.04编译安装mysql-boost-5.7.21并编译成php扩展测试与使用
我之前的文章已经改造了自定义MVC框架中的工具类(验证码,图片上传,图像处理,分类)4个类,接下来,就要改造模型类,模型类肯定要连接数据库,由于我的Ubuntu Linux是裸装的php(目前只编译了 ...
- Ubuntu16.04安装tensorflow+安装opencv+安装openslide+安装搜狗输入法
Ubuntu16.04在cuda以及cudnn安装好之后,安装tensorflow,tensorflow以及opencv可以到网上下载对应的安装包并且直接在安装包所在的路径下直接通过pip与conda ...
- ubuntu16.04编译QT5.6所依赖的库
首先在QT的根目录下,阅读README文件! 里面介绍了ubuntu环境下,编译该版本的QT需要安装的包 New dependencies in Qt 5 ------------------- ...
- Ubuntu16.04编译libjpeg-turbo库
一.环境依赖 CMake v2.8.12或以后 NASM or YASM (if building x86 or x86-64 SIMD extensions),如果使用NASM, 依赖2.10之后版 ...
- Ubuntu16.04编译Openjdk8,笔者亲测编译成功
现在很多语言都不开发运行环境了,都选择在JRE上运行,足以证明JVM的优越.你精通了JVM,未来的路才可能走得轻松.这篇文章是你走近jvm的第一篇,编译Openjdk8源码 编译环境 操作系统:Ubu ...
随机推荐
- HDU - 6152 Friend-Graph(暴力)
题意:给定n个人的关系,若存在三个及以上的人两两友好或两两不友好,则"Bad Team!",否则"Great Team!". 分析:3000*3000内存100 ...
- HihoCoder第十周:后序遍历
也就在大二学数据结构的时候知道了树的前序遍历.后序遍历.中序遍历.之后就忘了,在之后就是大四研究生老师考我,我当时还不知道,真够丢人的.自此之后,知道了如何通过其中两个得到第三个,但是也没有编程实现过 ...
- 配置tomcat、nginx实现反向代理(需操作)
配置tomcat.nginx实现反向代理现在我想通过nginx访问tomcat 这就要我们去修改nginx的核心配置文件,在其目录下的conf文件夹下的nginx.conf文件,那么首先我们就要了解该 ...
- read和write函数的使用
https://blog.csdn.net/qq_33883085/article/details/88667003
- ES6 之 Proxy
概述 Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改. Proxy 可以理解在目标对象架设一个“拦截”层外界对该对象的访问都必须先通过这层拦截,因此提供了一种机制可以对外界的访问进行 ...
- HDU 4819 二维线段树
13年长春现场赛的G题,赤裸裸的二维线段树,单点更新,区间查询 不过我是第一次写二维的,一开始写T了,原因是我没有好好利用行段,说白一点,还是相当于枚举行,然后对列进行线段树,那要你写二维线段树干嘛 ...
- 实验吧-杂项-MD5之守株待兔(时间戳&python时间戳函数time.time())
其实也有点蒙圈,因为从没做过和时间戳有关的题. 打开网站,将系统密钥解密得到一串值,而自己的密钥解密是空的,既然说是要和系统匹配,就把解密得到的值以get方式送出去. 但是发现还是在自己的密钥也发生了 ...
- Linux运维命令笔记一
1.Centos 无netstat 命令 yum -y install net-toolnetstat -tunp 2.Centos防火墙 systemctl stop firewalld.ser ...
- ROS2学习日志:QoS学习日志
QoS学习日志 参考:ROS2API 及 https://index.ros.org/doc/ros2/Concepts/About-Quality-of-Service-Settings 1.概述 ...
- 洛谷 P1043 数字游戏
题目传送门 解题思路: 跟石子合并差不多,区间DP(环形),用f[i][j][s]表示从i到j分成s段所能获得的最大答案,枚举断点k,则f[i][j][s] = min(f[i][j][s],f[i] ...