Обновление: Я думаю, что вопрос требует знаний о 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
.
Не могли бы вы помочь? Заранее большое спасибо!