Использование нового tenorflow op в библиотеке c ++, которая уже использует тензор потока в качестве третьей стороны - PullRequest
0 голосов
/ 28 июня 2018

Я впервые задаю вопрос в stackoverflow. Я сделаю все возможное, чтобы правильно сформулировать свой вопрос.

Я хочу использовать пользовательскую функцию tenorflow в библиотеке c ++, которая уже использует тензор потока в качестве третьей стороны. Но я просто не знаю, как использовать мою пользовательскую операцию в коде c ++. Я пытаюсь узнать это с помощью простого примера ZeroOut из учебника Tensroflow c ++. Я зарегистрировал опцию ZeroOut для процессора как https://github.com/MatteoRagni/tf.ZeroOut.gpu:, компилируя с make работал, и я получил .so файл в папке usr-ops, где также был файл cc. Затем я попытался добавить файл ZeroOut.so в мою библиотеку как разделяемую библиотеку, но он не скомпилировался. Однако до того, как я добавил свою пользовательскую операцию, зарегистрировался в bazel, как описано в новом руководстве по tenorflow, таким же образом и моя библиотека скомпилирована. Возможно, потому что .so файл был создан в ../bazel-bin/tensorflow/core/user_ops/. Но в этом случае я не могу использовать операцию, как я должен. И включение ZeroOut.cpp или файлов .cpp моей операции в мои файлы c ++ до сих пор не имело никакого значения.

Вот мой CMakeList.txt, который также создает всю библиотеку, с которой я работаю:

cmake_minimum_required(VERSION 2.8)
project(Project1)

set(CMAKE_BUILD_TYPE "Release") # Debug Release
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -std=c++14 -O3 -Wall                 -fopenmp")
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

#-------------path of 3rd party libraries-------------
# special libs.
find_package(Boost COMPONENTS filesystem iostreams regex)
find_package(FFTW)
find_package(NLopt)
find_package(HDF5 COMPONENTS CXX)

set(EXTERN_LIB_ROOT ${PROJECT_SOURCE_DIR}/3rd-party)

set(TENSORFLOW_ROOT /.../tensorflow)
set(TF_INCLUDE_DIRS "${TENSORFLOW_ROOT}" "${TENSORFLOW_ROOT}/bazel-  genfiles" "${TENSORFLOW_ROOT}/bazel-tensorflow/external/protobuf_archive/src")

# lib dirs.
set(LUA_LIBRARIES "${EXTERN_LIB_ROOT}/lua/liblua53.so") #5.3.4
set(LINENOISE_LIBRARIES "${EXTERN_LIB_ROOT}/linenoise-ng/build/liblinenoise.so")
set(YACAS_LIBRARIES "${EXTERN_LIB_ROOT}/yacas/cyacas/libyacas/build/libyacas.so")


set(TF_LIBRARIES ${TENSORFLOW_ROOT}/bazel-bin/tensorflow/libtensorflow_cc.so
    ${TENSORFLOW_ROOT}/tensorflow/core/user_ops/tf.ZeroOut.gpu-master/zero_out.so 
${TENSORFLOW_ROOT}/bazel-bin/tensorflow/core/user_ops/MyNewOp.so) 
#-------------ssl headers-------------
include_directories(${PROJECT_SOURCE_DIR}/src
    ${EXTERN_LIB_ROOT}/eigen
    ${EXTERN_LIB_ROOT}/gnuplot-iostream
    ${EXTERN_LIB_ROOT}/
    ${EXTERN_LIB_ROOT}/linenoise-ng/include
    ${EXTERN_LIB_ROOT}/yacas/cyacas/libyacas/include
    ${EXTERN_LIB_ROOT}/lua/src
    ${NLOPT_INCLUDE_DIRS}
    ${FFTW_INCLUDES}
    ${TF_INCLUDE_DIRS}
    ${Boost_INCLUDE_DIRS}
    ${HDF5_INCLUDE_DIRS}
    ${TENSORFLOW_ROOT}) 

option(BUILD_SHARED_LIBS "build shared library" ON)
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

#-------------ssl kernel lib-------------
file(GLOB_RECURSE _src_list
    LIST_DIRECTORIES false
    RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${PROJECT_SOURCE_DIR}/src/*.h" "${PROJECT_SOURCE_DIR}/src/*.cpp" "")

add_library(ssl SHARED ${_src_list})

set(SSL_LIBRARIES ${TF_LIBRARIES} ${LUA_LIBRARIES} ${Boost_LIBRARIES}     ${NLOPT_LIBRARIES} ${FFTW_LIBRARIES} ${LINENOISE_LIBRARIES} ${YACAS_LIBRARIES} ${HDF5_CXX_LIBRARIES}) #${TF_LIBRARIES}

target_link_libraries(ssl ${SSL_LIBRARIES} dl)

add_executable(Project1 main.cpp)
target_link_libraries(Project1 ssl)

Есть связанный вопрос, но нет четкого ответа. Как запустить собственный тензор потока GPU :: op из кода C ++?

Что я делаю не так? У меня нет опыта работы с общей библиотекой, но, может быть, есть и другие лучшие способы сделать то, что я пытаюсь сделать ...? Может кто-нибудь помочь мне, может быть, привести пример необходимого CMakeList.txt?

Об ошибках, которые я получил во время выполнения: это было очень тривиально, просто функция в моем файле .so не могла быть найдена, если вызывалась с правильным количеством параметров, если вызывалась с неправильным, она просто не выполнялась. Тем временем я нашел лучший обходной путь. Поскольку я могу использовать свою собственную операционную систему в python, я буду встраивать python в мою библиотеку c ++, вызывать функцию python для создания графа, который будет вызывать мою собственную операционную систему для построения графа. Но я еще не закончил.

1 Ответ

0 голосов
/ 18 декабря 2018

Используя pkg_config становится очень просто:

cmake_minimum_required(VERSION 3.10)
project(tf-inference)

find_package(PkgConfig)
pkg_check_modules(TensorFlow REQUIRED tensorflow)

link_directories(${TensorFlow_LIBRARY_DIRS})
include_directories(${TensorFlow_INCLUDE_DIRS})
add_compile_definitions(${TensorFlow_CFLAGS_OTHER})

add_executable(tf-inference inference.cpp)
target_link_libraries(tf-inference ${TensorFlow_LIBRARIES})

Однако для этого требуется, чтобы ваша установка TensorFlow содержала файл tensorflow.pc. На MacOS: brew install libtensorflow будет включать этот файл, и выше работает автоматически.

...