安装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