Advertisement

Ubuntu18安装tensorflow2 (c++版本)

阅读量:

安装tensorflow (c++版本)

环境:Ubuntu 18.04 LTS、g++ 7.5.0、CUDA 10.1、cuDNN 7.6.4

安装位置:新建文件夹 HOME/TF,命名为 TENSORFLOW,位置、命名可随意更改。

安装bazelisk

复制代码
    $ sudo curl -Lo /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/download/vx.x.x/bazelisk-linux-amd64

    $ sudo chmod +x /usr/local/bin/bazel

​ 具体版本号 vx.x.x 到该网址上查看,最新即可: https://github.com/bazelbuild/bazelisk/releases

下载tensorflow

复制代码
    $ cd $TENSORFLOW

    $ git clone https://github.com/tensorflow/tensorflow

查看所需bazel版本并下载bazel

复制代码
    $ cd tensorflow

    $ grep -r _TF_MAX_BAZEL_VERSION .
    ./config.py:_TF_MAX_BAZEL_VERSION = 'x.x.x'
    $ echo "x.x.x" > .bazelversion
    $ bazel version

配置tensorflow并开始编译

复制代码
    $ ./configure

    # 按照安装需求写y/n和路径,CUDA项可填y,其他不懂的填n,默认路径不对的重新填,否则回车过。
    $ bazel build --config=opt --config=cuda --config=monolithic \ //tensorflow:libtensorflow_cc.so //tensorflow:libtensorflow_framework.so

经过很长一段时间结束编译,一般bazel版本正确不会有问题,可能会有网络下载问题。编译结束后在 $TENSORFLOW/tensorflow 下生成4个bazel开头的文件夹。

下载安装eigen,版本貌似选最新即可

复制代码
    $ cd $TENSORFLOW

    $ git clone https://gitlab.com/libeigen/eigen.git
    # 貌似gitlab上的是最新,github上的有错。
    $ cd eigen
    $ mkdir build && cd build
    $ cmake ..
    $ sudo make install

安装成功后在 /usr/local/include 下生成 eigen3 文件夹,为eigen相关头文件。

下载安装protobuf,版本查看方法如下:

(1)打开 $TENSORFLOW/tensorflow/tensorflow/workspace.bzl;

(2)搜索 ‘protobuf’;

(3)从 strip_prefix = “protobuf-x.x.x”, 得知protobuf版本号。

从网址中找到对应版本:https://github.com/protocolbuffers/protobuf/releases

点击 Source code(tar.gz) 下载,解压到 $TENSORFLOW 下。

复制代码
    $ cd $TENSORFLOW/protobuf

    $ ./autogen.sh
    $ ./configure --prefix=/usr/protobuf
    $ sudo make
    $ sudo make install
    $ sudo ln -s /usr/protobuf/bin/protoc /usr/local/bin/protoc

测试

复制代码
    $ protoc --version

    libprotoc x.x.x

写个demo测试效果 test.cpp

复制代码
    #include <iostream>

    #include "tensorflow/cc/client/client_session.h"
    #include "tensorflow/cc/ops/standard_ops.h"
    #include "tensorflow/core/framework/tensor.h"
    
    using namespace tensorflow;
    using namespace tensorflow::ops;
    
    int main()
    {
      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));
      std::cout << "tensorflow session run ok" << std::endl;
      // Expect outputs[0] == [19; -3]
      std::cout << outputs[0].matrix<float>() << std::endl;
    
      return 0;
    }

把动态库复制到 $LD_LIBRARY_PATH 能访问到的地方

复制代码
    $ sudo mkdir /usr/local/lib/tensorflow

    $ sudo cp $TENSORFLOW/tensorflow/bazel-bin/tensorflow/*.so* /usr/local/lib/tensorflow/
    $ sudo gedit ~/.bashrc

在最后添加两行:

复制代码
    #tensorflow

    export LD_LIBRARY_PATH=/usr/local/lib/tensorflow:$LD_LIBRARY_PATH

更新变量:

复制代码
    $ source ~/.bashrc

新建 run.sh

复制代码
    #!/bin/bash

    g++ test.cpp -o test -l tensorflow_cc -l tensorflow_framework \
    -L /usr/local/lib/tensorflow \
    -I $TENSORFLOW/tensorflow \
    -I $TENSORFLOW/tensorflow/bazel-bin \
    -I $TENSORFLOW/tensorflow/bazel-bin/tensorflow/include \
    -I $TENSORFLOW/protobuf/src \
    -I $TENSORFLOW/eigen3 \

编译和运行demo:

复制代码
    $ ./run.sh

    $ ./test

全部评论 (0)

还没有任何评论哟~