Move HPS model related stuffs to public folder Move HPS model related stuffs from internal to public folder. Change-Id: I94ee96f7c86f1bc183f4425a4043c693a7b6988d
diff --git a/README.md b/README.md index 2bc39f3..7684d92 100644 --- a/README.md +++ b/README.md
@@ -20,6 +20,10 @@ Mobilenet V2 quantized model from https://tfhub.dev/tensorflow/lite-model/mobilenet_v2_1.0_224_quantized/1/default/1?lite-format=tflite +### hps_quant.tflite + +HPS (Human Presence Sensor) non-tiled quantized model from https://chromium.googlesource.com/chromiumos/platform/hps-firmware/+/6cdea6d1158a8cd3238b8ae4f744fdb494779c80/models/shared.tflite + ## Visualize the model For tflite models, use the [web-based visualization tool](https://lutzroeder.github.io/netron/) to
diff --git a/quant_models/CMakeLists.txt b/quant_models/CMakeLists.txt index 0281dd9..50ca35a 100644 --- a/quant_models/CMakeLists.txt +++ b/quant_models/CMakeLists.txt
@@ -11,6 +11,19 @@ springbok_modules( NAME + hps + SRC + "hps_quant.tflite" + C_IDENTIFIER + "quant_models_hps" + FLAGS + "-iree-input-type=tosa" + RVV_OFF + PUBLIC +) + +springbok_modules( + NAME mobilenet_v1 SRC "mobilenet_v1_0.25_224_quant.tflite" @@ -55,6 +68,19 @@ # Binaries to execute the IREE model input # ------------------------------------------------------------------------------ +foreach(N 0 1 2 3 4 5 6) + iree_model_input( + NAME + hps_${N}_quant_input + SHAPE + "1, 240, 320, 1" + SRC + "$ENV{ROOTDIR}/ml/ml-models-public/test_data/hps_${N}.jpg" + QUANT + SIGNED + ) +endforeach() + iree_model_input( NAME mobilenet_quant_input @@ -88,6 +114,49 @@ # # to increase it. +foreach(N 0 1 2 3 4 5 6) +iree_cc_binary( + NAME + hps_${N}_bytecode_static + SRCS + "iree_exec/hps.c" + DEPS + ::hps_${N}_quant_input_c + ::hps_bytecode_module_static_c + ::hps_bytecode_module_static_lib + iree::vm::bytecode_module + model_util::util_static + COPTS + "-DHPS_IDX=${N}" + LINKOPTS + "LINKER:--defsym=__stack_size__=200k" + # TODO(b/241297921): determine HPS heap size + "LINKER:--defsym=__heap_size__=5M" +) + +springbok_test( + NAME + hps_${N}_emitc_static + SRCS + "iree_exec/hps.c" + DEPS + ::hps_${N}_quant_input_c + ::hps_c_module_static_emitc + ::hps_c_module_static_lib + model_util::util_static + LINKOPTS + "LINKER:--defsym=__stack_size__=200k" + # TODO(b/241297921): determine HPS heap size + "LINKER:--defsym=__heap_size__=5M" + COPTS + "-DHPS_IDX=${N}" + "-DBUILD_EMITC" + TESTFILES + "iree_exec/hps_test.run" + "iree_exec/hps_${N}_test.filecheck" +) +endforeach() + iree_cc_binary( NAME mobilenet_v1_bytecode_static
diff --git a/quant_models/hps_quant.tflite b/quant_models/hps_quant.tflite new file mode 100644 index 0000000..71457ad --- /dev/null +++ b/quant_models/hps_quant.tflite Binary files differ
diff --git a/quant_models/iree_exec/hps.c b/quant_models/iree_exec/hps.c new file mode 100644 index 0000000..5537c29 --- /dev/null +++ b/quant_models/iree_exec/hps.c
@@ -0,0 +1,103 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Human Presence Sensor Model + +#include "hps.h" + +#include <springbok.h> + +#include "iree/base/api.h" +#include "iree/hal/api.h" +#include "model_util/util.h" + +#if HPS_IDX == 0 +#include "hps_0_quant_input_c.h" +#define HPS_QUANT_INPUT hps_0_quant_input +#elif HPS_IDX == 2 +#include "hps_2_quant_input_c.h" +#define HPS_QUANT_INPUT hps_2_quant_input +#elif HPS_IDX == 3 +#include "hps_3_quant_input_c.h" +#define HPS_QUANT_INPUT hps_3_quant_input +#elif HPS_IDX == 4 +#include "hps_4_quant_input_c.h" +#define HPS_QUANT_INPUT hps_4_quant_input +#elif HPS_IDX == 5 +#include "hps_5_quant_input_c.h" +#define HPS_QUANT_INPUT hps_5_quant_input +#elif HPS_IDX == 6 +#include "hps_6_quant_input_c.h" +#define HPS_QUANT_INPUT hps_6_quant_input +#else +#include "hps_1_quant_input_c.h" +#define HPS_QUANT_INPUT hps_1_quant_input +#endif + +// Compiled module embedded here to avoid file IO: +#if !defined(BUILD_EMITC) +#include "hps_bytecode_module_static.h" +#include "hps_bytecode_module_static_c.h" +#else +#include "hps_c_module_static_c.h" +#include "hps_c_module_static_emitc.h" +#endif + +__attribute__((section(".model_output"))) HpsOutput score; + +iree_status_t create_module(iree_vm_instance_t *instance, + iree_vm_module_t **module) { +#if !defined(BUILD_EMITC) + const struct iree_file_toc_t *module_file_toc = + quant_models_hps_bytecode_module_static_create(); + return iree_vm_bytecode_module_create( + instance, + iree_make_const_byte_span(module_file_toc->data, module_file_toc->size), + iree_allocator_null(), iree_allocator_system(), module); +#else + return module_create(instance, iree_allocator_system(), module); +#endif +} + +iree_hal_executable_library_query_fn_t library_query(void) { +#if !defined(BUILD_EMITC) + return &hps_bytecode_module_static_linked_llvm_cpu_library_query; +#else + return &hps_c_module_static_linked_llvm_cpu_library_query; +#endif +} + +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_const_byte_span_t **byte_span) { + byte_span[0] = malloc(sizeof(iree_const_byte_span_t)); + *byte_span[0] = iree_make_const_byte_span( + HPS_QUANT_INPUT, model->input_size_bytes[0] * model->input_length[0]); + return iree_ok_status(); +} + +iree_status_t process_output(const MlModel *model, + iree_hal_buffer_mapping_t *buffers, + uint32_t *output_length) { + iree_status_t result = iree_ok_status(); + int8_t *data = (int8_t *)buffers[0].contents.data; + score.score_0 = data[0]; + score.score_1 = data[1]; + + LOG_INFO("Score 0: %d, Score 1: %d", score.score_0, score.score_1); + + *output_length = sizeof(score); + return result; +}
diff --git a/quant_models/iree_exec/hps.h b/quant_models/iree_exec/hps.h new file mode 100644 index 0000000..0a9d0b7 --- /dev/null +++ b/quant_models/iree_exec/hps.h
@@ -0,0 +1,43 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef QUANT_MODELS_IREE_EXEC_HPS_H_ +#define QUANT_MODELS_IREE_EXEC_HPS_H_ + +#include <stdint.h> + +#include "model_util/util.h" + +typedef struct { + int8_t score_0; + int8_t score_1; +} HpsOutput; + +const MlModel kModel = { + .num_input = 1, + .num_input_dim = {4}, + .input_shape = {{1, 240, 320, 1}}, + .input_length = {240 * 320 * 1}, + .input_size_bytes = {sizeof(int8_t)}, + .num_output = 1, + .output_length = {2}, + .output_size_bytes = sizeof(int8_t), + .hal_element_type = IREE_HAL_ELEMENT_TYPE_SINT_8, + .entry_func = "module.main", + .model_name = "hps_quant", +}; + +#endif // QUANT_MODELS_IREE_EXEC_HPS_H_
diff --git a/quant_models/iree_exec/hps_0_test.filecheck b/quant_models/iree_exec/hps_0_test.filecheck new file mode 100644 index 0000000..bdb087d --- /dev/null +++ b/quant_models/iree_exec/hps_0_test.filecheck
@@ -0,0 +1 @@ +// CHECK: Score 0: -118, Score 1: -128
diff --git a/quant_models/iree_exec/hps_1_test.filecheck b/quant_models/iree_exec/hps_1_test.filecheck new file mode 100644 index 0000000..a934a24 --- /dev/null +++ b/quant_models/iree_exec/hps_1_test.filecheck
@@ -0,0 +1 @@ +// CHECK: Score 0: 127, Score 1: -128
diff --git a/quant_models/iree_exec/hps_2_test.filecheck b/quant_models/iree_exec/hps_2_test.filecheck new file mode 100644 index 0000000..d5c0e12 --- /dev/null +++ b/quant_models/iree_exec/hps_2_test.filecheck
@@ -0,0 +1 @@ +// CHECK: Score 0: 127, Score 1: 127
diff --git a/quant_models/iree_exec/hps_3_test.filecheck b/quant_models/iree_exec/hps_3_test.filecheck new file mode 100644 index 0000000..ac3ec09 --- /dev/null +++ b/quant_models/iree_exec/hps_3_test.filecheck
@@ -0,0 +1 @@ +// CHECK: Score 0: -115, Score 1: -128
diff --git a/quant_models/iree_exec/hps_4_test.filecheck b/quant_models/iree_exec/hps_4_test.filecheck new file mode 100644 index 0000000..269b27c --- /dev/null +++ b/quant_models/iree_exec/hps_4_test.filecheck
@@ -0,0 +1 @@ +// CHECK: Score 0: -97, Score 1: -128
diff --git a/quant_models/iree_exec/hps_5_test.filecheck b/quant_models/iree_exec/hps_5_test.filecheck new file mode 100644 index 0000000..a934a24 --- /dev/null +++ b/quant_models/iree_exec/hps_5_test.filecheck
@@ -0,0 +1 @@ +// CHECK: Score 0: 127, Score 1: -128
diff --git a/quant_models/iree_exec/hps_6_test.filecheck b/quant_models/iree_exec/hps_6_test.filecheck new file mode 100644 index 0000000..9babf4a --- /dev/null +++ b/quant_models/iree_exec/hps_6_test.filecheck
@@ -0,0 +1 @@ +// CHECK: Score 0: 127, Score 1: -115
diff --git a/quant_models/iree_exec/hps_test.run b/quant_models/iree_exec/hps_test.run new file mode 100644 index 0000000..7565300 --- /dev/null +++ b/quant_models/iree_exec/hps_test.run
@@ -0,0 +1,41 @@ +// RUN: ${TEST_RUNNER_CMD} %S/hps_0_emitc_static 2>&1 | tee %t +// RUN: cat %t | FileCheck %S/hps_0_test.filecheck + +// RUN: ${TEST_RUNNER_CMD} %S/hps_0_bytecode_static 2>&1 | tee %t +// RUN: cat %t | FileCheck %S/hps_0_test.filecheck + +// RUN: ${TEST_RUNNER_CMD} %S/hps_1_emitc_static 2>&1 | tee %t +// RUN: cat %t | FileCheck %S/hps_1_test.filecheck + +// RUN: ${TEST_RUNNER_CMD} %S/hps_1_bytecode_static 2>&1 | tee %t +// RUN: cat %t | FileCheck %S/hps_1_test.filecheck + +// RUN: ${TEST_RUNNER_CMD} %S/hps_2_emitc_static 2>&1 | tee %t +// cat %t | FileCheck %S/hps_2_test.filecheck + +// RUN: ${TEST_RUNNER_CMD} %S/hps_2_bytecode_static 2>&1 | tee %t +// RUN: cat %t | FileCheck %S/hps_2_test.filecheck + +// RUN: ${TEST_RUNNER_CMD} %S/hps_3_emitc_static 2>&1 | tee %t +// RUN: cat %t | FileCheck %S/hps_3_test.filecheck + +// RUN: ${TEST_RUNNER_CMD} %S/hps_3_bytecode_static 2>&1 | tee %t +// RUN: cat %t | FileCheck %S/hps_3_test.filecheck + +// RUN: ${TEST_RUNNER_CMD} %S/hps_4_emitc_static 2>&1 | tee %t +// RUN: cat %t | FileCheck %S/hps_4_test.filecheck + +// RUN: ${TEST_RUNNER_CMD} %S/hps_4_bytecode_static 2>&1 | tee %t +// RUN: cat %t | FileCheck %S/hps_4_test.filecheck + +// RUN: ${TEST_RUNNER_CMD} %S/hps_5_emitc_static 2>&1 | tee %t +// RUN: cat %t | FileCheck %S/hps_5_test.filecheck + +// RUN: ${TEST_RUNNER_CMD} %S/hps_5_bytecode_static 2>&1 | tee %t +// RUN: cat %t | FileCheck %S/hps_5_test.filecheck + +// RUN: ${TEST_RUNNER_CMD} %S/hps_6_emitc_static 2>&1 | tee %t +// RUN: cat %t | FileCheck %S/hps_6_test.filecheck + +// RUN: ${TEST_RUNNER_CMD} %S/hps_6_bytecode_static 2>&1 | tee %t +// RUN: cat %t | FileCheck %S/hps_6_test.filecheck