美文网首页
Ubuntu16.04编译tensorflow的C++接口

Ubuntu16.04编译tensorflow的C++接口

作者: 熊叫大雄 | 来源:发表于2019-08-26 21:19 被阅读0次

    之前有一篇介绍到在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的版本,我下载的是版本1.12的。下载之后解压出来。

    三、配置编译环境

    解压源码之后,进入根目录,输入指令:

    ./configure
    

    接下来就是配置清单:


    image.png
    image.png

    这里要说明的是如果有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的时候没有遇到,所以看不同版本吧):

    image.png

    这个错误并不是因为文件没有而是因为找不到,实际上,这个文件就在tensorflow-r1.7/tensorflow文件夹下,但是需要修改/tensorflow-r1.7/tensorflow/BUILD这个文件才行,打开这个文件之后修改大概在812行,注释掉后,另起一行设置正确的路径:


    image.png

    修改之后重新输入编译的指令编译一次就可以了。编译好之后在文件夹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这个文件,执行它来下载相关的文件,相关文件会放在/tensorflow根目录/tensorflow/contrib/makefile/downloads这个文件夹下;
    (2)、提示Eigen相关的问题
    这个问题跟前面的类似,如果下载了相关的依赖文件之后,在/tensorflow-r1.7/tensorflow/contrib/makefile/downloads文件夹下找到eigen文件夹,进入之后执行以下指令进行eigen的编译:

    mkdir build
    cd build
    cmake ..
    make
    sudo make install
    

    (3)、提示关于protobuf版本的问题
    问题如下:

    image
    这个主要是protobuf版本的问题,所以要查看bazel-genfiles/tensorflow/core/framework/types.pb.h这个文件夹中关于protobuf的版本要求,然后下载相应的版本来更新即可,这里tensorflow1.12要求是protobuf要大于等于3.6
    image
    所以就去github上下载对应的protobuf版本。要下载源码,然后编译安装即可。
    暂时我就遇到这几个问题,之后如果还有遇到其它问题,我会继续更新的。

    五、参考

    1、https://blog.csdn.net/zwx1995zwx/article/details/79064064


    阳光
    在天上一闪
    又被乌云埋掩
    暴雨冲洗着
    我灵魂的底片

    -- 顾城

    相关文章

      网友评论

          本文标题:Ubuntu16.04编译tensorflow的C++接口

          本文链接:https://www.haomeiwen.com/subject/ekcjectx.html