Проблемы при компиляции пользовательского оператора TensorFlow (TF 2.0.0) - PullRequest
0 голосов
/ 30 сентября 2019

Обновление: Я думаю, что вопрос требует знаний о CMake, а не TensorFlow, поэтому я добавил тег CMake.

TL; DR:

  • MyПользовательский оператор TF работал в TF 1.14.
  • При компиляции с TF 2.0.0: он работает, только если я создаю символическую ссылку libtensorflow_framework.so, которая указывает на libtensorflow_framework.so.2.
  • Я пыталсяиспользование tf.sysconfig.get_link_flags() и tf.sysconfig.get_compile_flags() для получения пути к библиотеке: сборка успешна, но при запуске undefined symbol: _ZTIN10tensorflow8OpKernelE.

Я столкнулся с проблемой при использовании пользовательского оператора TF в TF 2.0.0. CMakeLists.txt выглядит следующим образом:

cmake_minimum_required(VERSION 3.9)

project(myproject LANGUAGES CXX CUDA)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD 11)
set(CUDA_SEPARABLE_COMPILATION ON)

if(UNIX AND NOT APPLE)
    set(LINUX TRUE)
endif()

include_directories(${CUDA_INCLUDE})
execute_process(COMMAND python -c "import tensorflow as tf; print(tf.sysconfig.get_include())" OUTPUT_VARIABLE TF_INC)
execute_process(COMMAND python -c "import tensorflow as tf; print(tf.sysconfig.get_lib())" OUTPUT_VARIABLE TF_LIB)
string(REGEX REPLACE "\n$" "" TF_INC "${TF_INC}")
string(REGEX REPLACE "\n$" "" TF_LIB "${TF_LIB}")
include_directories(${TF_INC} ${TF_INC}/external/nsync/public)
link_directories(${TF_LIB})

add_library(my_operator SHARED src/*.cpp src/*.cu src/*.h)
target_compile_features(my_operator PUBLIC cxx_std_11)
target_link_libraries(my_operator PUBLIC tensorflow_framework)
set_target_properties(my_operator PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
set_target_properties(my_operator PROPERTIES PREFIX "")
target_compile_options(my_operator PUBLIC "-D GOOGLE_CUDA=1" "-D GLIBCXX_USE_CXX11_ABI=0")
# Workaround (TensorFlow bug)
target_compile_options(my_operator PUBLIC "-DNDEBUG")

if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5.0)
    target_compile_options(my_operator PUBLIC "-D_GLIBCXX_USE_CXX11_ABI=0")
endif()

В TF 1.14 все работало нормально. После обновления до TF 2.0.0 я получил ошибку ltensorflow_framework not found, потому что он не может найти libtensorflow_framework.so в моем virtualenv ~/.env/python3/lib/python3.5/site-packages/tensorflow_core/. Чтобы это работало, мне нужно было создать символическую ссылку libtensorflow_framework.so, указывающую на файл libtensorflow_framework.so.2, который находится в той же папке. Лучшим решением было бы использовать что-то вроде этого, чтобы получить путь к библиотеке:

execute_process(COMMAND python -c "import tensorflow as tf; print(' '.join(tf.sysconfig.get_compile_flags()), end='')" OUTPUT_VARIABLE TF_CFLAGS)
execute_process(COMMAND python -c "import tensorflow as tf; print(' '.join(tf.sysconfig.get_link_flags()), end='')" OUTPUT_VARIABLE TF_CFLAGS)
# C++11 required for tensorflow
set(CMAKE_CXX_FLAGS "-std=c++11 ${TF_CFLAGS} ${CMAKE_CXX_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-as-needed ${TF_LFLAGS} ${CMAKE_SHARED_LINKER_FLAGS}") 

Я добавил это сразу после строки link_directories(${TF_LIB}), но это не сработало. Я попытался заменить target_link_libraries(lattice_filter PUBLIC tensorflow_framework) на target_link_libraries(lattice_filter PUBLIC ${TF_LFLAGS}), но это тоже не сработало. Сборка прошла успешно (без ссылок или других ошибок), но при запуске кода я получил undefined symbol: _ZTIN10tensorflow8OpKernelE.

Не могли бы вы помочь? Заранее большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...