From: 박종현/On-Device Lab(SR)/Staff Engineer/삼성전자 Date: Mon, 18 Mar 2019 04:55:22 +0000 (+0900) Subject: Introduce TensorFlow Lite package (#4766) X-Git-Tag: submit/tizen/20190325.013700~43 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=899071005753470be1798c5569b1f3ff88083df3;p=platform%2Fcore%2Fml%2Fnnfw.git Introduce TensorFlow Lite package (#4766) This commit extracts TensorFlow Lite build script from "external/CMakeLists.txt", and makes is as a separate TensorFlow Lite package. Signed-off-by: Jonghyun Park --- diff --git a/cmake/packages/TensorFlowLite/CMakeLists.txt b/cmake/packages/TensorFlowLite/CMakeLists.txt new file mode 100644 index 0000000..c1fee3b --- /dev/null +++ b/cmake/packages/TensorFlowLite/CMakeLists.txt @@ -0,0 +1,64 @@ +set(TENSORFLOW_LITE_BASE ${TensorFlowSource_DIR}/tensorflow/contrib/lite) + +# +# Tensorflow Lite library +# +file(GLOB TFLITE_CORE_SRCS "${TENSORFLOW_LITE_BASE}/*.c" "${TENSORFLOW_LITE_BASE}/*.cc") +file(GLOB TFLITE_CORE_TESTS "${TENSORFLOW_LITE_BASE}/*test*.cc") +list(REMOVE_ITEM TFLITE_CORE_SRCS ${TFLITE_CORE_TESTS}) + +file(GLOB_RECURSE TFLITE_KERNEL_SRCS "${TENSORFLOW_LITE_BASE}/kernels/*.cc") +file(GLOB_RECURSE TFLITE_KERNEL_TESTS "${TENSORFLOW_LITE_BASE}/kernels/*test*.cc") +list(REMOVE_ITEM TFLITE_KERNEL_SRCS ${TFLITE_KERNEL_TESTS}) + +file(GLOB TFLITE_LIB_SRCS "${TENSORFLOW_LITE_BASE}/c/*.c" "${TENSORFLOW_LITE_BASE}/c/*.cc") +file(GLOB TFLITE_LIB_TESTS "${TENSORFLOW_LITE_BASE}/c/*test*.cc") +list(REMOVE_ITEM TFLITE_LIB_SRCS ${TFLITE_LIB_TESTS}) + +file(GLOB TFLITE_API_SRCS "${TENSORFLOW_LITE_BASE}/core/api/*.c" "${TENSORFLOW_LITE_BASE}/core/api/*.cc") +file(GLOB TFLITE_API_TESTS "${TENSORFLOW_LITE_BASE}/core/api/*test*.cc") +list(REMOVE_ITEM TFLITE_API_SRCS ${TFLITE_API_TESTS}) + +file(GLOB TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/*.cc") +file(GLOB TFLITE_PROFILING_TESTS "${TENSORFLOW_LITE_BASE}/profiling/*test*.cc") +list(REMOVE_ITEM TFLITE_PROFILING_SRCS ${TFLITE_PROFILING_TESTS}) + +# We will use our own BuiltinOpResolver +list(REMOVE_ITEM TFLITE_KERNEL_SRCS "${TENSORFLOW_LITE_BASE}/kernels/register.cc") +# We will use our own summarizer +list(REMOVE_ITEM TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/profile_summarizer.cc") +list(APPEND TFLITE_SRCS ${TFLITE_CORE_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_KERNEL_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_LIB_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_API_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_PROFILING_SRCS}) + +list(APPEND TFLITE_SRCS "${FarmhashSource_DIR}/src/farmhash.cc") + +list(APPEND TFLITE_INCLUDES "${TensorFlowSource_DIR}") +list(APPEND TFLITE_INCLUDES "${AbslSource_DIR}") +list(APPEND TFLITE_INCLUDES "${GEMMLowpSource_DIR}") +list(APPEND TFLITE_INCLUDES "${FarmhashSource_DIR}/src") +list(APPEND TFLITE_INCLUDES "${FlatBuffersSource_DIR}/include") + +if(NEON2SSESource_FOUND) + list(APPEND TFLITE_INCLUDES "${NEON2SSESource_DIR}") +endif(NEON2SSESource_FOUND) + +# This kernels are not used on nnfw +## spectrogram +list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/audio_spectrogram.cc") +list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/audio_spectrogram_test.cc") +list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/spectrogram.cc") +## mfcc +list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/mfcc.cc") +list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/mfcc_dct.cc") +list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/mfcc_mel_filterbank.cc") +list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/mfcc.cc") +list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/mfcc_test.cc") + +add_library(tensorflow-lite STATIC ${TFLITE_SRCS}) +target_include_directories(tensorflow-lite SYSTEM PUBLIC ${TFLITE_INCLUDES}) +target_compile_definitions(tensorflow-lite PUBLIC "GEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK") +target_compile_options(tensorflow-lite PRIVATE -fPIC) +target_link_libraries(tensorflow-lite eigen ${LIB_PTHREAD} dl) diff --git a/cmake/packages/TensorFlowLiteConfig.cmake b/cmake/packages/TensorFlowLiteConfig.cmake new file mode 100644 index 0000000..1a318a4 --- /dev/null +++ b/cmake/packages/TensorFlowLiteConfig.cmake @@ -0,0 +1,33 @@ +if(BUILD_TENSORFLOW_LITE) + macro(return_unless VAR) + if(NOT ${VAR}) + set(TensorFlowLite_FOUND PARENT_SCOPE) + return() + endif(NOT ${VAR}) + endmacro(return_unless) + + # Required packages + nnfw_find_package(AbslSource QUIET) + return_unless(AbslSource_FOUND) + nnfw_find_package(Eigen QUIET) + return_unless(Eigen_FOUND) + nnfw_find_package(FarmhashSource QUIET) + return_unless(FarmhashSource_FOUND) + nnfw_find_package(FlatBuffersSource QUIET) + return_unless(FlatBuffersSource_FOUND) + nnfw_find_package(GEMMLowpSource QUIET) + return_unless(GEMMLowpSource_FOUND) + nnfw_find_package(TensorFlowSource QUIET) + return_unless(TensorFlowSource_FOUND) + + # Optional packages + nnfw_find_package(NEON2SSESource QUIET) + + add_extdirectory("${CMAKE_CURRENT_LIST_DIR}/TensorFlowLite" tflite) + + set(TensorFlowLite_FOUND TRUE) + return() +endif(BUILD_TENSORFLOW_LITE) + +# TODO Allow users to import pre-built TensorFlow Lite! +set(TensorFlowLite_FOUND FALSE) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index ce6d3cb..b0ac9de 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -1,76 +1,12 @@ -# TODO Rewrite below build script as CMake package -if(NOT BUILD_TENSORFLOW_LITE) - return() -endif(NOT BUILD_TENSORFLOW_LITE) - -# Required source & package -nnfw_find_package(AbslSource REQUIRED) -nnfw_find_package(Eigen REQUIRED) -nnfw_find_package(FarmhashSource REQUIRED) -nnfw_find_package(FlatBuffersSource REQUIRED) -nnfw_find_package(GEMMLowpSource REQUIRED) -nnfw_find_package(TensorFlowSource REQUIRED) - -set(TENSORFLOW_LITE_BASE ${TensorFlowSource_DIR}/tensorflow/contrib/lite) - -# -# Tensorflow Lite library -# -file(GLOB TFLITE_CORE_SRCS "${TENSORFLOW_LITE_BASE}/*.c" "${TENSORFLOW_LITE_BASE}/*.cc") -file(GLOB TFLITE_CORE_TESTS "${TENSORFLOW_LITE_BASE}/*test*.cc") -list(REMOVE_ITEM TFLITE_CORE_SRCS ${TFLITE_CORE_TESTS}) - -file(GLOB_RECURSE TFLITE_KERNEL_SRCS "${TENSORFLOW_LITE_BASE}/kernels/*.cc") -file(GLOB_RECURSE TFLITE_KERNEL_TESTS "${TENSORFLOW_LITE_BASE}/kernels/*test*.cc") -list(REMOVE_ITEM TFLITE_KERNEL_SRCS ${TFLITE_KERNEL_TESTS}) - -file(GLOB TFLITE_LIB_SRCS "${TENSORFLOW_LITE_BASE}/c/*.c" "${TENSORFLOW_LITE_BASE}/c/*.cc") -file(GLOB TFLITE_LIB_TESTS "${TENSORFLOW_LITE_BASE}/c/*test*.cc") -list(REMOVE_ITEM TFLITE_LIB_SRCS ${TFLITE_LIB_TESTS}) - -file(GLOB TFLITE_API_SRCS "${TENSORFLOW_LITE_BASE}/core/api/*.c" "${TENSORFLOW_LITE_BASE}/core/api/*.cc") -file(GLOB TFLITE_API_TESTS "${TENSORFLOW_LITE_BASE}/core/api/*test*.cc") -list(REMOVE_ITEM TFLITE_API_SRCS ${TFLITE_API_TESTS}) - -file(GLOB TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/*.cc") -file(GLOB TFLITE_PROFILING_TESTS "${TENSORFLOW_LITE_BASE}/profiling/*test*.cc") -list(REMOVE_ITEM TFLITE_PROFILING_SRCS ${TFLITE_PROFILING_TESTS}) - -# We will use our own BuiltinOpResolver -list(REMOVE_ITEM TFLITE_KERNEL_SRCS "${TENSORFLOW_LITE_BASE}/kernels/register.cc") -# We will use our own summarizer -list(REMOVE_ITEM TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/profile_summarizer.cc") -list(APPEND TFLITE_SRCS ${TFLITE_CORE_SRCS}) -list(APPEND TFLITE_SRCS ${TFLITE_KERNEL_SRCS}) -list(APPEND TFLITE_SRCS ${TFLITE_LIB_SRCS}) -list(APPEND TFLITE_SRCS ${TFLITE_API_SRCS}) -list(APPEND TFLITE_SRCS ${TFLITE_PROFILING_SRCS}) - -list(APPEND TFLITE_SRCS "${FarmhashSource_DIR}/src/farmhash.cc") +nnfw_find_package(TensorFlowLite QUIET) -list(APPEND TFLITE_INCLUDES "${TensorFlowSource_DIR}") -list(APPEND TFLITE_INCLUDES "${AbslSource_DIR}") -list(APPEND TFLITE_INCLUDES "${GEMMLowpSource_DIR}") -list(APPEND TFLITE_INCLUDES "${FarmhashSource_DIR}/src") -list(APPEND TFLITE_INCLUDES "${FlatBuffersSource_DIR}/include") - -nnfw_find_package(NEON2SSESource QUIET) - -if(NEON2SSESource_FOUND) - list(APPEND TFLITE_INCLUDES "${NEON2SSESource_DIR}") -endif(NEON2SSESource_FOUND) +if(NOT TensorFlowLite_FOUND) + return() +endif(NOT TensorFlowLite_FOUND) -# This kernels are not used on nnfw -## spectrogram -list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/audio_spectrogram.cc") -list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/audio_spectrogram_test.cc") -list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/spectrogram.cc") -## mfcc -list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/mfcc.cc") -list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/mfcc_dct.cc") -list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/mfcc_mel_filterbank.cc") -list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/mfcc.cc") -list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/mfcc_test.cc") +if(BUILD_TFLITE_BENCHMARK_MODEL) + target_compile_definitions(tensorflow-lite PUBLIC "TFLITE_PROFILING_ENABLED") +endif() if("${TARGET_OS}" STREQUAL "android") if(NOT DEFINED NDK_DIR) @@ -85,17 +21,8 @@ if("${TARGET_OS}" STREQUAL "android") message(FATAL_ERROR "NDK_DIR should be specified via environment variable") endif() message(STATUS "Found NDK: ${NDK_DIR}") - list(APPEND TFLITE_INCLUDES "${NDK_DIR}") -endif() - -add_library(tensorflow-lite STATIC ${TFLITE_SRCS}) -target_include_directories(tensorflow-lite SYSTEM PUBLIC ${TFLITE_INCLUDES}) -target_compile_definitions(tensorflow-lite PUBLIC "GEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK") -target_compile_options(tensorflow-lite PRIVATE -fPIC) -if(BUILD_TFLITE_BENCHMARK_MODEL) - target_compile_definitions(tensorflow-lite PUBLIC "TFLITE_PROFILING_ENABLED") + target_include_directories(tensorflow-lite SYSTEM PUBLIC "${NDK_DIR}") endif() -target_link_libraries(tensorflow-lite eigen ${LIB_PTHREAD} dl) if("${TARGET_OS}" STREQUAL "android") target_link_libraries(tensorflow-lite log)