blob: 5c4dff012a46f3df847c2bfb779158938e2ec900 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
if(NOT TARGET nnkit-run)
return()
endif(NOT TARGET nnkit-run)
if(NOT TARGET nnkit_tflite_backend)
return()
endif(NOT TARGET nnkit_tflite_backend)
nncc_find_resource(TensorFlowLiteRecipes)
set(TENSORFLOWLITERECIPES_DIR "${TensorFlowLiteRecipes_DIR}")
file(GLOB RECIPES RELATIVE ${TENSORFLOWLITERECIPES_DIR} "${TENSORFLOWLITERECIPES_DIR}/*/test.recipe")
foreach(RECIPE IN ITEMS ${RECIPES})
get_filename_component(RECIPE_PREFIX ${RECIPE} DIRECTORY)
set(RECIPE_SOURCE_FILE "${RECIPE_PREFIX}.recipe")
set(RECIPE_OUTPUT_FILE "${RECIPE_PREFIX}.tflite")
# Copy .recipe
add_custom_command(OUTPUT ${RECIPE_SOURCE_FILE}
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${TENSORFLOWLITERECIPES_DIR}/${RECIPE}" ${RECIPE_SOURCE_FILE}
DEPENDS "${TENSORFLOWLITERECIPES_DIR}/${RECIPE}"
COMMENT "Generating ${RECIPE_SOURCE_FILE}")
# Generate .tflite
add_custom_command(OUTPUT ${RECIPE_OUTPUT_FILE}
COMMAND tflchef-file ${RECIPE_SOURCE_FILE} ${RECIPE_OUTPUT_FILE}
DEPENDS tflchef-file ${RECIPE_SOURCE_FILE}
COMMENT "Generating ${RECIPE_OUTPUT_FILE}")
list(APPEND TESTS ${RECIPE_PREFIX})
list(APPEND TESTFILES ${RECIPE_OUTPUT_FILE})
endforeach(RECIPE)
# Add local files
file(GLOB RECIPES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/test.recipe")
foreach(RECIPE IN ITEMS ${RECIPES})
get_filename_component(RECIPE_PREFIX ${RECIPE} DIRECTORY)
set(RECIPE_SOURCE_FILE "${RECIPE_PREFIX}.recipe")
set(RECIPE_OUTPUT_FILE "${RECIPE_PREFIX}.tflite")
# Copy .recipe
add_custom_command(OUTPUT ${RECIPE_SOURCE_FILE}
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${CMAKE_CURRENT_SOURCE_DIR}/${RECIPE}" ${RECIPE_SOURCE_FILE}
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${RECIPE}"
COMMENT "Generating ${RECIPE_SOURCE_FILE}")
# Generate .tflite
add_custom_command(OUTPUT ${RECIPE_OUTPUT_FILE}
COMMAND tflchef-file ${RECIPE_SOURCE_FILE} ${RECIPE_OUTPUT_FILE}
DEPENDS tflchef-file ${RECIPE_SOURCE_FILE}
COMMENT "Generating ${RECIPE_OUTPUT_FILE}")
list(APPEND TESTS ${RECIPE_PREFIX})
list(APPEND TESTFILES ${RECIPE_OUTPUT_FILE})
endforeach(RECIPE)
# Test tflchef-reverse
file(GLOB GEN_TFLITEFILES RELATIVE ${TENSORFLOWLITERECIPES_DIR} "${TENSORFLOWLITERECIPES_DIR}/*/test.reverse")
# Note: While in development, tflchef-reverse may not handle the operator.
# To separate this linkage scan empty test.reverse for test targets for tflchef-reverse.
foreach(TFLITEFILE IN ITEMS ${GEN_TFLITEFILES})
get_filename_component(TFLITE_PREFIX ${TFLITEFILE} DIRECTORY)
# file from above tflchef-file block
# use tflite file as input of tflchef-reverse generated from tflchef-file
set(RECIPE_OUTPUT_FILE "${TFLITE_PREFIX}.tflite")
set(RECIPE_GEN_OUTPUT_FILE "${TFLITE_PREFIX}.gen.recipe")
set(RECIPE_GEN_OUTPUT_FILE2 "${TFLITE_PREFIX}.gen.tflite")
# Generate .gen.recipe from generated .tflite
add_custom_command(OUTPUT ${RECIPE_GEN_OUTPUT_FILE}
COMMAND tflchef-reverse ${RECIPE_OUTPUT_FILE} ${RECIPE_GEN_OUTPUT_FILE}
DEPENDS tflchef-reverse ${RECIPE_OUTPUT_FILE}
COMMENT "Generating ${RECIPE_GEN_OUTPUT_FILE}")
# now we are going to generate .gen.tflite from .gen.recipe
# to check generated .gen.recipe file is correct by using it.
# as weight values may be different, binary comparision is not acceptable.
add_custom_command(OUTPUT ${RECIPE_GEN_OUTPUT_FILE2}
COMMAND tflchef-file ${RECIPE_GEN_OUTPUT_FILE} ${RECIPE_GEN_OUTPUT_FILE2}
DEPENDS tflchef-file ${RECIPE_GEN_OUTPUT_FILE}
COMMENT "Generating ${RECIPE_GEN_OUTPUT_FILE2}")
list(APPEND TESTS ${TFLITE_PREFIX}.gen)
list(APPEND TESTFILES ${RECIPE_GEN_OUTPUT_FILE2})
endforeach(TFLITEFILE)
# Test local tflchef-reverse
file(GLOB GEN_TFLITEFILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/test.reverse")
foreach(TFLITEFILE IN ITEMS ${GEN_TFLITEFILES})
get_filename_component(TFLITE_PREFIX ${TFLITEFILE} DIRECTORY)
set(RECIPE_OUTPUT_FILE "${TFLITE_PREFIX}.tflite")
set(RECIPE_GEN_OUTPUT_FILE "${TFLITE_PREFIX}.gen.recipe")
set(RECIPE_GEN_OUTPUT_FILE2 "${TFLITE_PREFIX}.gen.tflite")
# Generate .gen.recipe from generated .tflite
add_custom_command(OUTPUT ${RECIPE_GEN_OUTPUT_FILE}
COMMAND tflchef-reverse ${RECIPE_OUTPUT_FILE} ${RECIPE_GEN_OUTPUT_FILE}
DEPENDS tflchef-reverse ${RECIPE_OUTPUT_FILE}
COMMENT "Generating ${RECIPE_GEN_OUTPUT_FILE}")
add_custom_command(OUTPUT ${RECIPE_GEN_OUTPUT_FILE2}
COMMAND tflchef-file ${RECIPE_GEN_OUTPUT_FILE} ${RECIPE_GEN_OUTPUT_FILE2}
DEPENDS tflchef-file ${RECIPE_GEN_OUTPUT_FILE}
COMMENT "Generating ${RECIPE_GEN_OUTPUT_FILE2}")
list(APPEND TESTS ${TFLITE_PREFIX}.gen)
list(APPEND TESTFILES ${RECIPE_GEN_OUTPUT_FILE2})
endforeach(TFLITEFILE)
# Add a dummy target to create a target-level dependency.
# TODO Find a way to create a dependency between tflchef_test and generated testfiles.
add_custom_target(tflchef_testfiles ALL DEPENDS ${TESTFILES})
# Using mio_tflite_validate for temporary as it only calls flatbuffer validate
# TODO do testing with running the model with runtime/interpreter
add_test(NAME tflchef_test
COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/runvalidate.sh"
$<TARGET_FILE:mio_tflite_validate>
${TESTS})
|