linux下深度學習框架tensorflow2.0的編譯和C++接口使用

谷歌發佈了tensorflow2.0後帶來全新的使用體驗和深度學習實踐模式,這裏基於新版本進行編譯,並使用其C++接口編寫示例。

環境

本文只針對linux系統(windows下嘗試過多次後未成功,放棄)

  • ubuntu14.04
  • gcc4.8.5
  • cmake3.10.2

編譯

目的是編譯出tensorflow的動態鏈接庫以及準備好tensorflow第三方依賴庫

安裝bazel

tensorflow是谷歌官方項目,用的是自家的bazel構建的
官網下載bazel安裝:https://bazel.build
推薦使用sh腳本一鍵安裝

編譯tensorflow動態庫

下載源碼,切換到r2.0分支,編譯

git clone https://github.com/tensorflow/tensorflow
cd tensorflow
git checkout -b r2.0 remotes/origin/r2.0
./configure

configure步驟會有很多配置項
其中,python的路徑設置成python3的目錄,其他全部默認值即可

然後通過bazel編譯
如果不需要cuda版,則輸入

bazel build --config=opt //tensorflow:libtensorflow_cc.so

如果需要cuda版,則輸入

bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so

這個過程需要全程保持聯網(科學上網),會在編譯的過程中聯網下載很多依賴,時間較長,耐心等待

成功後,會在tensorflow根目錄的bazel-bin/tensorflow文件夾下會出現libtensorflow_cc.so以及libtensorflow_framework.so等文件(有些是軟鏈接),建議將其拷貝出來到根目錄的新建的lib目錄,比如
tensorflow/lib
├── libtensorflow_cc.so
├── libtensorflow_cc.so.1
├── libtensorflow_framework.so
└── libtensorflow_framework.so.1
確保這個四個文件一定要有

準備第三方依賴庫

tensorflow需要用到第三方庫文件比如Protobuf以及矩陣庫Eigen等,應該使用官方依賴的對應版本,可以避免tensorflow和第三方庫版本不對應而產生的問題,用tensorflow項目自帶的腳本下載和編譯這些依賴庫

cd tensorflow
cd tensorflow/contrib/makefile
./build_all_linux.sh

同樣的,這個過程需要全程保持聯網(科學上網)
執行成功後,在tensorflow/tensorflow/contrib/makefile會產生兩個文件夾

  • downloads存放第三方依賴的一些頭文件和靜態庫,比如nsync、Eigen等
  • gen存放tensorflow生成必要的pb頭文件

至此,tensorflow編譯完成,可以使用C++接口編寫程序了

使用

構建C++程序,調用tensorflow庫

工程結構
.
├── CMakeLists.txt
└── src
└── main.cpp

其中
CMakeLists.txt

project(tensorflow_cpp_test)
cmake_minimum_required(VERSION 3.0)

add_definitions(-std=c++11)

set(TENSORFLOW_ROOT_DIR /home/tashaxing/codetest/tensorflow)

# if other headers are needed, add to this include list
include_directories(
    ${TENSORFLOW_ROOT_DIR}
    ${TENSORFLOW_ROOT_DIR}/tensorflow/contrib/makefile/gen/proto
    ${TENSORFLOW_ROOT_DIR}/tensorflow/contrib/makefile/gen/protobuf/include
    ${TENSORFLOW_ROOT_DIR}/tensorflow/contrib/makefile/downloads/eigen
    ${TENSORFLOW_ROOT_DIR}/tensorflow/contrib/makefile/downloads/absl
)

aux_source_directory(./src DIR_SRCS)

link_directories(/home/tashaxing/codetest/tensorflow/lib)

add_executable(tensorflow_cpp_test ${DIR_SRCS})
target_link_libraries(tensorflow_cpp_test
    tensorflow_cc
    tensorflow_framework
)

main.cpp

#include <iostream>
#include "tensorflow/core/public/session.h"

using namespace tensorflow;

int main()
{
    Session* session;
    Status status = NewSession(SessionOptions(), &session);
    if (!status.ok())
    {
        std::cout << status.ToString() << "\n";
        return 1;
    }
    std::cout << "Session successfully created.\n";

    Tensor a(DT_FLOAT, TensorShape()); // input a
    a.scalar<float>()() = 3.0;
    Tensor b(DT_FLOAT, TensorShape()); // input b
    b.scalar<float>()() = 2.0;

    return 0;
}

實際上,tensorflow的後端都是C++寫的,那麼用C++的接口直接進行模型訓練和加載預測,在性能上是非常可觀的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章