Use xxd -i to replace iree_c_embed_data in iree_model_input Use "xxd -i" to replace iree_c_embed_data in iree_model_input. As a result, malloc and memcpy on input buffers can be avoided. This also enable a future scenario of using sensor inputs. Change-Id: Ia378f21bc48cd2341f9b181ea627d7123e5fb01e
diff --git a/cmake/iree_model_input.cmake b/cmake/iree_model_input.cmake index 7be9e35..60bf53b 100644 --- a/cmake/iree_model_input.cmake +++ b/cmake/iree_model_input.cmake
@@ -51,7 +51,7 @@ endif() set(_GEN_INPUT_SCRIPT "${CMAKE_SOURCE_DIR}/build_tools/gen_mlmodel_input.py") - set(_OUTPUT_BINARY ${_RULE_NAME}.bin) + set(_OUTPUT_BINARY ${_RULE_NAME}) set(_ARGS) list(APPEND _ARGS "--i=${_INPUT_FILENAME}") list(APPEND _ARGS "--o=${_OUTPUT_BINARY}") @@ -63,26 +63,54 @@ list(APPEND _ARGS "--q") endif() + # Replace dependencies passed by ::name with iree::package::name + iree_package_ns(_PACKAGE_NS) + list(TRANSFORM _RULE_DEPS REPLACE "^::" "${_PACKAGE_NS}::") + + # Prefix the library with the package name, so we get: iree_package_name. + iree_package_name(_PACKAGE_NAME) + + set(_RULE_C_NAME "${_RULE_NAME}_c") + set(_LIB_NAME "${_PACKAGE_NAME}_${_RULE_C_NAME}") + set(_GEN_TARGET "${_LIB_NAME}_gen") + set(_H_FILE_NAME ${_RULE_C_NAME}.h) + add_custom_command( OUTPUT ${_OUTPUT_BINARY} + ${_H_FILE_NAME} COMMAND ${_GEN_INPUT_SCRIPT} ${_ARGS} + COMMAND + xxd -i ${_OUTPUT_BINARY} > ${_H_FILE_NAME} DEPENDS ${_GEN_INPUT_SCRIPT} ${_INPUT_FILENAME} ) - iree_c_embed_data( - NAME - "${_RULE_NAME}_c" - GENERATED_SRCS - "${_OUTPUT_BINARY}" - C_FILE_OUTPUT - "${_RULE_NAME}_c.c" - H_FILE_OUTPUT - "${_RULE_NAME}_c.h" - FLATTEN - PUBLIC + add_custom_target( + ${_GEN_TARGET} + DEPENDS + "${_H_FILE_NAME}" ) + + add_library(${_LIB_NAME} + ${_H_FILE_NAME} + ) + add_dependencies(${_LIB_NAME} ${_GEN_TARGET}) + + SET_TARGET_PROPERTIES( + ${_LIB_NAME} + PROPERTIES + LINKER_LANGUAGE C + ) + + # Alias the iree_package_name library to iree::package::name. + # This lets us more clearly map to Bazel and makes it possible to + # disambiguate the underscores in paths vs. the separators. + add_library(${_PACKAGE_NS}::${_RULE_C_NAME} ALIAS ${_LIB_NAME}) + iree_package_dir(_PACKAGE_DIR) + if(${_RULE_C_NAME} STREQUAL ${_PACKAGE_DIR}) + add_library(${_PACKAGE_NS} ALIAS ${_LIB_NAME}) + endif() endfunction()
diff --git a/samples/float_model/mnist.c b/samples/float_model/mnist.c index 98bfbbb..5c7e874 100644 --- a/samples/float_model/mnist.c +++ b/samples/float_model/mnist.c
@@ -36,11 +36,12 @@ module_file_toc->size); } -iree_status_t load_input_data(const MlModel *model, void **buffer) { - iree_status_t result = alloc_input_buffer(model, buffer); - const struct iree_file_toc_t *input_file_toc = mnist_input_c_create(); - memcpy(*buffer, input_file_toc->data, input_file_toc->size); - return result; +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_byte_span_t **byte_span) { + byte_span[0] = malloc(sizeof(iree_byte_span_t)); + *byte_span[0] = iree_make_byte_span( + mnist_input, model->input_size_bytes[0] * model->input_length[0]); + return iree_ok_status(); } iree_status_t process_output(const MlModel *model,
diff --git a/samples/float_model/mobilenet_v1.c b/samples/float_model/mobilenet_v1.c index a0163f5..4b610fd 100644 --- a/samples/float_model/mobilenet_v1.c +++ b/samples/float_model/mobilenet_v1.c
@@ -36,11 +36,11 @@ module_file_toc->size); } -iree_status_t load_input_data(const MlModel *model, void **buffer) { - iree_status_t result = alloc_input_buffer(model, buffer); - const struct iree_file_toc_t *input_file_toc = mobilenet_input_c_create(); - memcpy(*buffer, input_file_toc->data, input_file_toc->size); - return result; +iree_status_t load_input_data(const MlModel *model, void **buffer, iree_byte_span_t **byte_span) { + byte_span[0] = malloc(sizeof(iree_byte_span_t)); + *byte_span[0] = iree_make_byte_span(mobilenet_input, model->input_size_bytes[0] * + model->input_length[0]); + return iree_ok_status(); } iree_status_t process_output(const MlModel *model,
diff --git a/samples/quant_model/barcode.c b/samples/quant_model/barcode.c index 105c6da..d70733c 100644 --- a/samples/quant_model/barcode.c +++ b/samples/quant_model/barcode.c
@@ -34,7 +34,8 @@ module_file_toc->size); } -iree_status_t load_input_data(const MlModel *model, void **buffer) { +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_byte_span_t **byte_span) { iree_status_t result = alloc_input_buffer(model, buffer); // Populate initial value srand(768954); @@ -43,6 +44,9 @@ ((uint8_t *)*buffer)[i] = (uint8_t)rand(); } } + byte_span[0] = malloc(sizeof(iree_byte_span_t)); + *byte_span[0] = iree_make_byte_span( + buffer[0], model->input_size_bytes[0] * model->input_length[0]); return result; }
diff --git a/samples/quant_model/daredevil.c b/samples/quant_model/daredevil.c index c20447c..d4cb0ac 100644 --- a/samples/quant_model/daredevil.c +++ b/samples/quant_model/daredevil.c
@@ -32,7 +32,8 @@ module_file_toc->size); } -iree_status_t load_input_data(const MlModel *model, void **buffer) { +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_byte_span_t **byte_span) { iree_status_t result = alloc_input_buffer(model, buffer); // Populate initial value srand(3689964); @@ -41,6 +42,9 @@ ((uint8_t *)*buffer)[i] = (uint8_t)rand(); } } + byte_span[0] = malloc(sizeof(iree_byte_span_t)); + *byte_span[0] = iree_make_byte_span( + buffer[0], model->input_size_bytes[0] * model->input_length[0]); return result; }
diff --git a/samples/quant_model/fssd_25_8bit_v2.c b/samples/quant_model/fssd_25_8bit_v2.c index be979db..4070c81 100644 --- a/samples/quant_model/fssd_25_8bit_v2.c +++ b/samples/quant_model/fssd_25_8bit_v2.c
@@ -33,7 +33,8 @@ module_file_toc->size); } -iree_status_t load_input_data(const MlModel *model, void **buffer) { +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_byte_span_t **byte_span) { iree_status_t result = alloc_input_buffer(model, buffer); // Populate initial value srand(11111111); @@ -42,6 +43,9 @@ ((uint8_t *)*buffer)[i] = (uint8_t)rand(); } } + byte_span[0] = malloc(sizeof(iree_byte_span_t)); + *byte_span[0] = iree_make_byte_span( + buffer[0], model->input_size_bytes[0] * model->input_length[0]); return result; }
diff --git a/samples/quant_model/mobilenet_v1.c b/samples/quant_model/mobilenet_v1.c index f55232d..5640c5e 100644 --- a/samples/quant_model/mobilenet_v1.c +++ b/samples/quant_model/mobilenet_v1.c
@@ -36,12 +36,13 @@ module_file_toc->size); } -iree_status_t load_input_data(const MlModel *model, void **buffer) { - iree_status_t result = alloc_input_buffer(model, buffer); - const struct iree_file_toc_t *input_file_toc = - mobilenet_quant_input_c_create(); - memcpy(*buffer, input_file_toc->data, input_file_toc->size); - return result; +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_byte_span_t **byte_span) { + byte_span[0] = malloc(sizeof(iree_byte_span_t)); + *byte_span[0] = + iree_make_byte_span(mobilenet_quant_input, + model->input_size_bytes[0] * model->input_length[0]); + return iree_ok_status(); } iree_status_t process_output(const MlModel *model,
diff --git a/samples/quant_model/mobilenet_v2.c b/samples/quant_model/mobilenet_v2.c index 612ce65..990d724 100644 --- a/samples/quant_model/mobilenet_v2.c +++ b/samples/quant_model/mobilenet_v2.c
@@ -32,7 +32,8 @@ module_file_toc->size); } -iree_status_t load_input_data(const MlModel *model, void **buffer) { +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_byte_span_t **byte_span) { iree_status_t result = alloc_input_buffer(model, buffer); // Populate initial value srand(33333333); @@ -41,6 +42,9 @@ ((uint8_t *)*buffer)[i] = (uint8_t)rand(); } } + byte_span[0] = malloc(sizeof(iree_byte_span_t)); + *byte_span[0] = iree_make_byte_span( + buffer[0], model->input_size_bytes[0] * model->input_length[0]); return result; }
diff --git a/samples/quant_model/person_detection.c b/samples/quant_model/person_detection.c index 0f8e4ea..379eb0f 100644 --- a/samples/quant_model/person_detection.c +++ b/samples/quant_model/person_detection.c
@@ -36,12 +36,13 @@ module_file_toc->size); } -iree_status_t load_input_data(const MlModel *model, void **buffer) { - iree_status_t result = alloc_input_buffer(model, buffer); - const struct iree_file_toc_t *input_file_toc = - person_detection_quant_input_c_create(); - memcpy(*buffer, input_file_toc->data, input_file_toc->size); - return result; +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_byte_span_t **byte_span) { + byte_span[0] = malloc(sizeof(iree_byte_span_t)); + *byte_span[0] = + iree_make_byte_span(person_detection_quant_input, + model->input_size_bytes[0] * model->input_length[0]); + return iree_ok_status(); } iree_status_t process_output(const MlModel *model,
diff --git a/samples/quant_model/scenenet_v2.c b/samples/quant_model/scenenet_v2.c index 931c389..da680f7 100644 --- a/samples/quant_model/scenenet_v2.c +++ b/samples/quant_model/scenenet_v2.c
@@ -32,7 +32,8 @@ module_file_toc->size); } -iree_status_t load_input_data(const MlModel *model, void **buffer) { +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_byte_span_t **byte_span) { iree_status_t result = alloc_input_buffer(model, buffer); // Populate initial value srand(55555555); @@ -41,6 +42,9 @@ ((uint8_t *)*buffer)[i] = (uint8_t)rand(); } } + byte_span[0] = malloc(sizeof(iree_byte_span_t)); + *byte_span[0] = iree_make_byte_span( + buffer[0], model->input_size_bytes[0] * model->input_length[0]); return result; }
diff --git a/samples/quant_model/semantic_lift.c b/samples/quant_model/semantic_lift.c index 2ce1e95..973bc0b 100644 --- a/samples/quant_model/semantic_lift.c +++ b/samples/quant_model/semantic_lift.c
@@ -32,7 +32,8 @@ module_file_toc->size); } -iree_status_t load_input_data(const MlModel *model, void **buffer) { +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_byte_span_t **byte_span) { iree_status_t result = alloc_input_buffer(model, buffer); // Populate initial value srand(66666666); @@ -41,6 +42,9 @@ ((uint8_t *)*buffer)[i] = (uint8_t)rand(); } } + byte_span[0] = malloc(sizeof(iree_byte_span_t)); + *byte_span[0] = iree_make_byte_span( + buffer[0], model->input_size_bytes[0] * model->input_length[0]); return result; }
diff --git a/samples/quant_model/voice_commands.c b/samples/quant_model/voice_commands.c index 4fdbbee..18b06a7 100644 --- a/samples/quant_model/voice_commands.c +++ b/samples/quant_model/voice_commands.c
@@ -32,7 +32,8 @@ module_file_toc->size); } -iree_status_t load_input_data(const MlModel *model, void **buffer) { +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_byte_span_t **byte_span) { iree_status_t result = alloc_input_buffer(model, buffer); // Populate initial value srand(77777777); @@ -41,6 +42,9 @@ ((uint8_t *)*buffer)[i] = (uint8_t)rand(); } } + byte_span[0] = malloc(sizeof(iree_byte_span_t)); + *byte_span[0] = iree_make_byte_span( + buffer[0], model->input_size_bytes[0] * model->input_length[0]); return result; }
diff --git a/samples/simple_vec_mul/float_vec.c b/samples/simple_vec_mul/float_vec.c index 15c50e2..1d4a2d1 100644 --- a/samples/simple_vec_mul/float_vec.c +++ b/samples/simple_vec_mul/float_vec.c
@@ -46,7 +46,8 @@ } #endif -iree_status_t load_input_data(const MlModel *model, void **buffer) { +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_byte_span_t **byte_span) { iree_status_t result = alloc_input_buffer(model, buffer); // Populate initial values // arg0 = 0, 1/4, 1/2, 3/4... 1023/4 @@ -57,6 +58,11 @@ ((float *)buffer[1])[i] = i / 2.0f; } } + for (int i = 0; i < model->num_input; ++i) { + byte_span[i] = malloc(sizeof(iree_byte_span_t)); + *byte_span[i] = iree_make_byte_span( + buffer[i], model->input_size_bytes[i] * model->input_length[i]); + } return result; }
diff --git a/samples/simple_vec_mul/int_vec.c b/samples/simple_vec_mul/int_vec.c index 6abf697..7a78c81 100644 --- a/samples/simple_vec_mul/int_vec.c +++ b/samples/simple_vec_mul/int_vec.c
@@ -46,7 +46,8 @@ } #endif -iree_status_t load_input_data(const MlModel *model, void **buffer) { +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_byte_span_t **byte_span) { iree_status_t result = alloc_input_buffer(model, buffer); // Populate initial values // arg0 = 0, 0, 1, 1,..., 511 @@ -57,6 +58,11 @@ ((int32_t *)buffer[1])[i] = i; } } + for (int i = 0; i < model->num_input; ++i) { + byte_span[i] = malloc(sizeof(iree_byte_span_t)); + *byte_span[i] = iree_make_byte_span( + buffer[i], model->input_size_bytes[i] * model->input_length[i]); + } return result; }
diff --git a/samples/util/model_api.h b/samples/util/model_api.h index c5671c7..a996bcb 100644 --- a/samples/util/model_api.h +++ b/samples/util/model_api.h
@@ -47,7 +47,8 @@ // For each ML workload, based on the model configuration, allocate the buffer // and prepare the data. It can be loaded from a embedded image binary, a // randomly generated stream, or a pointer from the sensor/ISP output. -iree_status_t load_input_data(const MlModel *model, void **buffer); +iree_status_t load_input_data(const MlModel *model, void **buffer, + iree_byte_span_t **byte_span); // Process the ML execution output into the final data to be sent to the // host. The final format is model dependent, so the address and size
diff --git a/samples/util/util.c b/samples/util/util.c index b347358..f629dce 100644 --- a/samples/util/util.c +++ b/samples/util/util.c
@@ -34,7 +34,8 @@ // Prepare the input buffer, and populate the initial value. // The input buffer must be released by the caller. - result = load_input_data(model, arg_buffers); + iree_byte_span_t *byte_span[MAX_MODEL_INPUT_NUM] = {NULL}; + result = load_input_data(model, arg_buffers, byte_span); // Wrap buffers in shaped buffer views. // The buffers can be mapped on the CPU and that can also be used @@ -48,11 +49,12 @@ iree_hal_device_allocator(device), model->input_shape[i], model->num_input_dim[i], model->hal_element_type, IREE_HAL_ENCODING_TYPE_DENSE_ROW_MAJOR, input_memory_type, - IREE_HAL_MEMORY_ACCESS_READ, IREE_HAL_BUFFER_USAGE_ALL, - iree_make_byte_span(arg_buffers[i], model->input_size_bytes[i] * - model->input_length[i]), + IREE_HAL_MEMORY_ACCESS_READ, IREE_HAL_BUFFER_USAGE_ALL, *byte_span[i], iree_allocator_null(), &(arg_buffer_views[i])); } + if (byte_span[i] != NULL) { + free(byte_span[i]); + } } return result; }