From dab0331be83822d99fc3d9739662e7e46e191ea7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=82=A8=EA=B6=81=EC=84=9D/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Engineer/=EC=82=BC=EC=84=B1=EC=A0=84?= =?utf8?q?=EC=9E=90?= Date: Fri, 2 Nov 2018 09:06:22 +0900 Subject: [PATCH] [enco] Introduce enco test framework for tflite (#2079) * [enco] Introduce enco test framework for tflite Until now, enco test framework for tflite was not supported This commit will enable enco test for tflite using empty recipe file Signed-off-by: Seok NamKoong * Modify Target Check --- contrib/enco/test/tflite/CMakeLists.txt | 112 +++++++++++++++++++++++++++++ contrib/enco/test/tflite/empty/INFERENCE | 0 contrib/enco/test/tflite/empty/test.recipe | 0 contrib/enco/test/tflite/runall | 64 +++++++++++++++++ 4 files changed, 176 insertions(+) create mode 100644 contrib/enco/test/tflite/CMakeLists.txt create mode 100644 contrib/enco/test/tflite/empty/INFERENCE create mode 100644 contrib/enco/test/tflite/empty/test.recipe create mode 100755 contrib/enco/test/tflite/runall diff --git a/contrib/enco/test/tflite/CMakeLists.txt b/contrib/enco/test/tflite/CMakeLists.txt new file mode 100644 index 0000000..887188f --- /dev/null +++ b/contrib/enco/test/tflite/CMakeLists.txt @@ -0,0 +1,112 @@ +option(ENCO_TFLITE_TEST "Enable enco test for TFLite" ON) + +if(NOT ENCO_TFLITE_TEST) + return() +endif(NOT ENCO_TFLITE_TEST) + +### +### Common function(s) +### +function(get_test_configuration PREFIX) + set(RECIPE_FILE "${PREFIX}.recipe" PARENT_SCOPE) + set(RECIPE_TARGET enco_tflite_test_${PREFIX}_recipe PARENT_SCOPE) + set(TFLITEMODEL_FILE "${PREFIX}.tflite" PARENT_SCOPE) + set(TFLITEMODEL_TARGET enco_tflite_test_${PREFIX}_tflitemodel PARENT_SCOPE) + set(SOURCE_FILE ${PREFIX}.cpp PARENT_SCOPE) + set(ASM_FILE ${PREFIX}.embed.S PARENT_SCOPE) + set(BIN_FILE ${PREFIX}.bin PARENT_SCOPE) + set(SOURCE_TARGET enco_tflite_test_${PREFIX}_generated PARENT_SCOPE) +endfunction(get_test_configuration) + +### +### Prepare test(s) +### +if(NOT TARGET tflchef-file) + return() +endif(NOT TARGET tflchef-file) + +if(NOT TARGET enco_tflite_frontend) + return() +endif(NOT TARGET enco_tflite_frontend) + +file(GLOB MODELS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/test.recipe") + +foreach(MODEL IN ITEMS ${MODELS}) + get_filename_component(PREFIX ${MODEL} DIRECTORY) + get_test_configuration(${PREFIX}) + + set(MODEL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${MODEL}) + + # Copy recipe + add_custom_target(${RECIPE_TARGET} + ALL ${CMAKE_COMMAND} -E copy "${MODEL_FILE}" + "${CMAKE_CURRENT_BINARY_DIR}/${RECIPE_FILE}" + COMMENT "Copying ${RECIPE_FILE}") + + # Generate tflitemodel + add_custom_target(${TFLITEMODEL_TARGET} + ALL $ ${RECIPE_FILE} ${TFLITEMODEL_FILE} + DEPENDS tflchef ${RECIPE_TARGET} + COMMENT "Generating ${TFLITEMODEL_FILE}") + + # Generate C++ code + add_custom_target(${SOURCE_TARGET} + ALL $ + --frontend $ + --frontend-arg ${TFLITEMODEL_FILE} + --backend-arg ${PREFIX} + DEPENDS enco-cli enco_tflite_frontend ${TFLITEMODEL_TARGET} + COMMENT "Generating ${SOURCE_FILE}") + set_source_files_properties(${SOURCE_FILE} PROPERTIES GENERATED TRUE) + set_source_files_properties(${ASM_FILE} PROPERTIES GENERATED TRUE LANGUAGE C) + set_source_files_properties(${BIN_FILE} PROPERTIES GENERATED TRUE) + + list(APPEND CANDIDATES ${PREFIX}) +endforeach(MODEL) + +### +### Inference test +### +if(NOT TARGET ann_ref_static) + return() +endif(NOT TARGET ann_ref_static) + +find_program(H5DIFF h5diff) + +if (NOT H5DIFF) + return() +endif(NOT H5DIFF) + +message(STATUS "Enable enco(tflite) inference test") + +foreach(PREFIX IN ITEMS ${CANDIDATES}) + if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PREFIX}/INFERENCE") + continue() + endif() + + get_test_configuration(${PREFIX}) + + set(BINDER_TARGET enco_tflite_test_${PREFIX}_binder) + + # Compile nnkit binder (from generated C++ code) + add_library(${BINDER_TARGET} SHARED ${CMAKE_CURRENT_SOURCE_DIR}/../binder.cpp ${SOURCE_FILE} ${ASM_FILE}) + target_include_directories(${BINDER_TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(${BINDER_TARGET} nnkit_intf_backend) + target_link_libraries(${BINDER_TARGET} ann_api) + target_link_libraries(${BINDER_TARGET} ann_ref_static) + set_target_properties(${BINDER_TARGET} PROPERTIES OUTPUT_NAME ${PREFIX}) + add_dependencies(${BINDER_TARGET} ${SOURCE_TARGET}) + + list(APPEND TESTS ${PREFIX}) +endforeach(PREFIX) + +# Run tests +add_test(NAME enco_test_tflite + COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/runall" + $ + $ + $ + $ + $ + "${CMAKE_CURRENT_BINARY_DIR}" + ${TESTS}) diff --git a/contrib/enco/test/tflite/empty/INFERENCE b/contrib/enco/test/tflite/empty/INFERENCE new file mode 100644 index 0000000..e69de29 diff --git a/contrib/enco/test/tflite/empty/test.recipe b/contrib/enco/test/tflite/empty/test.recipe new file mode 100644 index 0000000..e69de29 diff --git a/contrib/enco/test/tflite/runall b/contrib/enco/test/tflite/runall new file mode 100755 index 0000000..063b53e --- /dev/null +++ b/contrib/enco/test/tflite/runall @@ -0,0 +1,64 @@ +#!/bin/bash + +if [[ $# -le 6 ]]; then + echo "USAGE: $0 [nni path] [reference backend path] [randomize action path] [HDF5 export action path] [HDF5 import action path] [WORKDIR] [Prefix1] [Prefix2] ..." + exit 255 +fi + +NNI_PATH="$1"; shift +REFERENCE_BACKEND_PATH="$1"; shift +RANDOMIZE_ACTION_PATH="$1"; shift +HDF5_EXPORT_ACTION_PATH="$1"; shift +HDF5_IMPORT_ACTION_PATH="$1"; shift +WORKDIR="$1"; shift + +echo "-- Found nni: ${NNI_PATH}" +echo "-- Found reference backend: ${REFERENCE_BACKEND_PATH}" +echo "-- Found randomize action: ${RANDOMIZE_ACTION_PATH}" +echo "-- Found HDF5 export action: ${HDF5_EXPORT_ACTION_PATH}" +echo "-- Found HDF5 import action: ${HDF5_IMPORT_ACTION_PATH}" +echo "-- Found workdir: ${WORKDIR}" + +TESTED=() +PASSED=() + +pushd "${WORKDIR}" +while [[ $# -ne 0 ]]; do + PREFIX="$1"; shift + + TESTED+=("${PREFIX}") + + echo "-- Found tflite: ${PREFIX}.tflite" + echo "-- Found backend: lib${PREFIX}.so" + + "${NNI_PATH}" \ + --backend "${REFERENCE_BACKEND_PATH}" \ + --backend-arg "${WORKDIR}/${PREFIX}.tflite" \ + --pre "${RANDOMIZE_ACTION_PATH}" \ + --pre "${HDF5_EXPORT_ACTION_PATH}" \ + --pre-arg "${PREFIX}.input.h5" \ + --post "${HDF5_EXPORT_ACTION_PATH}" \ + --post-arg "${PREFIX}.expected.h5" + + "${NNI_PATH}" \ + --backend "./lib${PREFIX}.so" \ + --pre "${HDF5_IMPORT_ACTION_PATH}" \ + --pre-arg "${PREFIX}.input.h5" \ + --post "${HDF5_EXPORT_ACTION_PATH}" \ + --post-arg "${PREFIX}.obtained.h5" + + h5diff -d 0.001 "${PREFIX}.expected.h5" "${PREFIX}.obtained.h5" + + if [[ $? -eq 0 ]]; then + PASSED+=("$PREFIX") + fi +done +popd + +if [[ ${#TESTED[@]} -ne ${#PASSED[@]} ]]; then + echo "FAILED" + exit 255 +fi + +echo "PASSED" +exit 0 -- 2.7.4