Imported Upstream version 1.25.0
[platform/core/ml/nnfw.git] / compiler / circle-quantizer-dredd-recipe-test / CMakeLists.txt
1 if(NOT ENABLE_TEST)
2   return()
3 endif(NOT ENABLE_TEST)
4
5 nnas_include(TargetRequire)
6
7 unset(REQUIRED_TARGETS)
8 list(APPEND REQUIRED_TARGETS circle-inspect)
9 list(APPEND REQUIRED_TARGETS circle-verify)
10 list(APPEND REQUIRED_TARGETS circle-quantizer)
11 list(APPEND REQUIRED_TARGETS record-minmax)
12 list(APPEND REQUIRED_TARGETS dredd_rule_lib)
13 TargetRequire_Return(${REQUIRED_TARGETS})
14
15 unset(TEST_DEPS)
16 unset(TEST_NAMES)
17
18 get_target_property(ARTIFACTS_BIN_PATH testDataGenerator BINARY_DIR)
19
20 set(options USE_QCONFIG)
21 set(oneValueArgs DTYPE GRANULARITY INPUT_DTYPE OUTPUT_DTYPE)
22 set(multiValueArgs "")
23
24 macro(Add RECIPE)
25   cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
26
27   set(QCONFIG_OPT "")
28   if(ARG_USE_QCONFIG)
29     set(QCONFIG_OPT "--config" "${ARTIFACTS_BIN_PATH}/${RECIPE}.qconf.json")
30   endif()
31
32   set(INPUT_DTYPE_OPT "")
33   if(ARG_INPUT_DTYPE)
34     set(INPUT_DTYPE_OPT "--input_type" "${ARG_INPUT_DTYPE}")
35   endif()
36
37   set(OUTPUT_DTYPE_OPT "")
38   if(ARG_OUTPUT_DTYPE)
39     set(OUTPUT_DTYPE_OPT "--output_type" "${ARG_OUTPUT_DTYPE}")
40   endif()
41
42   set(CIRCLE_PATH "${ARTIFACTS_BIN_PATH}/${RECIPE}.circle")
43   set(FAKE_QUANT_CIRCLE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${RECIPE}.fq.circle")
44   set(RECORDED_CIRCLE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${RECIPE}.recorded.circle")
45   set(QUANT_CIRCLE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${RECIPE}.q.circle")
46
47   # Generate quantized .circle
48   add_custom_command(OUTPUT ${QUANT_CIRCLE_PATH}
49     COMMAND $<TARGET_FILE:circle-quantizer> --quantize_dequantize_weights float32 ${ARG_DTYPE} ${ARG_GRANULARITY} ${QCONFIG_OPT} ${CIRCLE_PATH} ${FAKE_QUANT_CIRCLE_PATH}
50     COMMAND $<TARGET_FILE:record-minmax> --input_model ${FAKE_QUANT_CIRCLE_PATH} --output_model ${RECORDED_CIRCLE_PATH}
51     COMMAND $<TARGET_FILE:circle-quantizer>
52       --quantize_with_minmax float32 ${ARG_DTYPE} ${ARG_GRANULARITY}
53       ${QCONFIG_OPT} ${RECORDED_CIRCLE_PATH} ${QUANT_CIRCLE_PATH}
54       ${INPUT_DTYPE_OPT} ${OUTPUT_DTYPE_OPT}
55     DEPENDS 
56       circle-quantizer
57       record-minmax
58       ${CIRCLE_PATH}
59     COMMENT "Generate ${RECIPE}.q.circle"
60   )
61
62   list(APPEND TEST_DEPS ${QUANT_CIRCLE_PATH})
63   list(APPEND TEST_NAMES ${RECIPE})
64 endmacro(Add)
65
66 # Macro to generate fully fake-quantized models
67 macro(AddFakeQuant RECIPE)
68   set(CIRCLE_PATH "${ARTIFACTS_BIN_PATH}/${RECIPE}.circle")
69   # NOTE We use .q.circle because it is convention for output file (see testall.sh for more details)
70   set(FULL_FAKE_QUANT_CIRCLE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${RECIPE}.q.circle")
71
72   # Generate fully fake-quantized .circle
73   add_custom_command(OUTPUT ${FULL_FAKE_QUANT_CIRCLE_PATH}
74     COMMAND $<TARGET_FILE:circle-quantizer> --fake_quantize ${CIRCLE_PATH} ${FULL_FAKE_QUANT_CIRCLE_PATH}
75     DEPENDS
76       circle-quantizer
77       ${CIRCLE_PATH}
78     COMMENT "Generate ${RECIPE}.q.circle"
79   )
80
81   list(APPEND TEST_DEPS ${FULL_FAKE_QUANT_CIRCLE_PATH})
82   list(APPEND TEST_NAMES ${RECIPE})
83 endmacro(AddFakeQuant)
84
85 # Macro to generate re-quantized models
86 macro(AddReQuant RECIPE)
87   set(CIRCLE_PATH "${ARTIFACTS_BIN_PATH}/${RECIPE}.circle")
88   # NOTE We use .q.circle because it is convention for output file (see testall.sh for more details)
89   set(REQUANT_CIRCLE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${RECIPE}.q.circle")
90
91   # Generate re-quantized .circle
92   add_custom_command(OUTPUT ${REQUANT_CIRCLE_PATH}
93     COMMAND $<TARGET_FILE:circle-quantizer> --requantize int8 uint8 ${CIRCLE_PATH} ${REQUANT_CIRCLE_PATH}
94     DEPENDS
95       circle-quantizer
96       ${CIRCLE_PATH}
97     COMMENT "Generate ${RECIPE}.q.circle"
98   )
99
100   list(APPEND TEST_DEPS ${REQUANT_CIRCLE_PATH})
101   list(APPEND TEST_NAMES ${RECIPE})
102 endmacro(AddReQuant)
103
104 # Macro to quantize without quantize_dequantize_weights
105 macro(AddSkipQDQW RECIPE)
106   cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
107
108   set(QCONFIG_OPT "")
109   if(ARG_USE_QCONFIG)
110     set(QCONFIG_OPT "--config" "${ARTIFACTS_BIN_PATH}/${RECIPE}.qconf.json")
111   endif()
112
113   set(INPUT_DTYPE_OPT "")
114   if(ARG_INPUT_DTYPE)
115     set(INPUT_DTYPE_OPT "--input_type" "${ARG_INPUT_DTYPE}")
116   endif()
117
118   set(OUTPUT_DTYPE_OPT "")
119   if(ARG_OUTPUT_DTYPE)
120     set(OUTPUT_DTYPE_OPT "--output_type" "${ARG_OUTPUT_DTYPE}")
121   endif()
122
123   set(CIRCLE_PATH "${ARTIFACTS_BIN_PATH}/${RECIPE}.circle")
124   set(RECORDED_CIRCLE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${RECIPE}.recorded.circle")
125   set(QUANT_CIRCLE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${RECIPE}.q.circle")
126
127   # Generate quantized .circle
128   add_custom_command(OUTPUT ${QUANT_CIRCLE_PATH}
129     COMMAND $<TARGET_FILE:record-minmax> --input_model ${CIRCLE_PATH} --output_model ${RECORDED_CIRCLE_PATH}
130     COMMAND $<TARGET_FILE:circle-quantizer>
131       --quantize_with_minmax float32 ${ARG_DTYPE} ${ARG_GRANULARITY}
132       ${QCONFIG_OPT} ${RECORDED_CIRCLE_PATH} ${QUANT_CIRCLE_PATH}
133       ${INPUT_DTYPE_OPT} ${OUTPUT_DTYPE_OPT}
134     DEPENDS
135       circle-quantizer
136       record-minmax
137       ${CIRCLE_PATH}
138     COMMENT "Generate ${RECIPE}.q.circle"
139   )
140
141   list(APPEND TEST_DEPS ${QUANT_CIRCLE_PATH})
142   list(APPEND TEST_NAMES ${RECIPE})
143 endmacro(AddSkipQDQW)
144
145 # Read "test.lst"
146 include("test.lst")
147
148 ##
149 ## Copy testall
150 ##
151 set(TEST_RUNNER "${CMAKE_CURRENT_BINARY_DIR}/testall.sh")
152 set(TEST_RUNNER_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/testall.sh")
153
154 add_custom_command(
155   OUTPUT ${TEST_RUNNER}
156   COMMAND ${CMAKE_COMMAND} -E copy "${TEST_RUNNER_SOURCE}" "${TEST_RUNNER}"
157   DEPENDS ${TEST_RUNNER_SOURCE}
158   COMMENT "Generate test runner"
159 )
160
161 list(APPEND TEST_DEPS "${TEST_RUNNER}")
162
163 ###
164 ### Generate test.config
165 ###
166 set(TEST_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/test.config")
167
168 add_custom_command(
169   OUTPUT ${TEST_CONFIG}
170   COMMAND ${CMAKE_COMMAND} -E remove -f ${TEST_CONFIG}
171   COMMAND ${CMAKE_COMMAND} -E echo 'CIRCLE_INSPECT_PATH=\"$<TARGET_FILE:circle-inspect>\"' >> ${TEST_CONFIG}
172   COMMAND ${CMAKE_COMMAND} -E echo 'CIRCLE_VERIFY_PATH=\"$<TARGET_FILE:circle-verify>\"' >> ${TEST_CONFIG}
173   COMMAND ${CMAKE_COMMAND} -E echo 'RECORD_MINMAX_PATH=\"$<TARGET_FILE:record-minmax>\"' >> ${TEST_CONFIG}
174   COMMAND ${CMAKE_COMMAND} -E echo 'CIRCLE_QUANTIZER_PATH=\"$<TARGET_FILE:circle-quantizer>\"' >> ${TEST_CONFIG}
175   DEPENDS
176     circle-inspect
177     circle-verify
178     record-minmax
179     circle-quantizer
180   COMMENT "Generate test configuration"
181 )
182
183 list(APPEND TEST_DEPS "${TEST_CONFIG}")
184
185 #
186 # copy rule-lib.sh (a library of shell script functions)
187 #
188
189 # getting path for rule-lib.sh in dredd-rule-lib
190 get_target_property(DREDD_RULE_LIB_DIR dredd_rule_lib BINARY_DIR)
191
192 set(RULE_LIB_SOURCE_PATH "${DREDD_RULE_LIB_DIR}/rule-lib.sh")
193 set(RULE_LIB_BINARY_PATH "${CMAKE_CURRENT_BINARY_DIR}/rule-lib.sh")
194
195 add_custom_command(
196   OUTPUT ${RULE_LIB_BINARY_PATH}
197   COMMAND ${CMAKE_COMMAND} -E copy "${RULE_LIB_SOURCE_PATH}" "${RULE_LIB_BINARY_PATH}"
198   DEPENDS ${RULE_LIB_SOURCE_PATH}
199   COMMENT "Generate rule lib"
200 )
201
202 list(APPEND TEST_DEPS "${RULE_LIB_BINARY_PATH}")
203
204 # Generate dependencies
205 add_custom_target(circle_quantizer_dredd_recipe_test ALL DEPENDS ${TEST_DEPS})
206 add_dependencies(circle_quantizer_dredd_recipe_test common_artifacts_deps)
207
208 get_target_property(ARTIFACTS_BIN_PATH testDataGenerator BINARY_DIR)
209
210 # Run tests
211 add_test(
212   NAME circle_quantizer_dredd_recipe_test
213   COMMAND ${TEST_RUNNER}
214           ${TEST_CONFIG}
215           ${ARTIFACTS_BIN_PATH}
216           ${TEST_NAMES}
217 )