5 nnas_include(TargetRequire)
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})
18 get_target_property(ARTIFACTS_BIN_PATH testDataGenerator BINARY_DIR)
20 set(options USE_QCONFIG)
21 set(oneValueArgs DTYPE GRANULARITY INPUT_DTYPE OUTPUT_DTYPE)
22 set(multiValueArgs "")
25 cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
29 set(QCONFIG_OPT "--config" "${ARTIFACTS_BIN_PATH}/${RECIPE}.qconf.json")
32 set(INPUT_DTYPE_OPT "")
34 set(INPUT_DTYPE_OPT "--input_type" "${ARG_INPUT_DTYPE}")
37 set(OUTPUT_DTYPE_OPT "")
39 set(OUTPUT_DTYPE_OPT "--output_type" "${ARG_OUTPUT_DTYPE}")
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")
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}
59 COMMENT "Generate ${RECIPE}.q.circle"
62 list(APPEND TEST_DEPS ${QUANT_CIRCLE_PATH})
63 list(APPEND TEST_NAMES ${RECIPE})
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")
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}
78 COMMENT "Generate ${RECIPE}.q.circle"
81 list(APPEND TEST_DEPS ${FULL_FAKE_QUANT_CIRCLE_PATH})
82 list(APPEND TEST_NAMES ${RECIPE})
83 endmacro(AddFakeQuant)
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")
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}
97 COMMENT "Generate ${RECIPE}.q.circle"
100 list(APPEND TEST_DEPS ${REQUANT_CIRCLE_PATH})
101 list(APPEND TEST_NAMES ${RECIPE})
104 # Macro to quantize without quantize_dequantize_weights
105 macro(AddSkipQDQW RECIPE)
106 cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
110 set(QCONFIG_OPT "--config" "${ARTIFACTS_BIN_PATH}/${RECIPE}.qconf.json")
113 set(INPUT_DTYPE_OPT "")
115 set(INPUT_DTYPE_OPT "--input_type" "${ARG_INPUT_DTYPE}")
118 set(OUTPUT_DTYPE_OPT "")
120 set(OUTPUT_DTYPE_OPT "--output_type" "${ARG_OUTPUT_DTYPE}")
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")
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}
138 COMMENT "Generate ${RECIPE}.q.circle"
141 list(APPEND TEST_DEPS ${QUANT_CIRCLE_PATH})
142 list(APPEND TEST_NAMES ${RECIPE})
143 endmacro(AddSkipQDQW)
151 set(TEST_RUNNER "${CMAKE_CURRENT_BINARY_DIR}/testall.sh")
152 set(TEST_RUNNER_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/testall.sh")
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"
161 list(APPEND TEST_DEPS "${TEST_RUNNER}")
164 ### Generate test.config
166 set(TEST_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/test.config")
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}
180 COMMENT "Generate test configuration"
183 list(APPEND TEST_DEPS "${TEST_CONFIG}")
186 # copy rule-lib.sh (a library of shell script functions)
189 # getting path for rule-lib.sh in dredd-rule-lib
190 get_target_property(DREDD_RULE_LIB_DIR dredd_rule_lib BINARY_DIR)
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")
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"
202 list(APPEND TEST_DEPS "${RULE_LIB_BINARY_PATH}")
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)
208 get_target_property(ARTIFACTS_BIN_PATH testDataGenerator BINARY_DIR)
212 NAME circle_quantizer_dredd_recipe_test
213 COMMAND ${TEST_RUNNER}
215 ${ARTIFACTS_BIN_PATH}