Add support for using test data in model benchmarks Supports providing a raw file containing test data. If no test data is provided, then the input will be memset to zero. Tested: soundstream q16 streaming encoder with/without test data Change-Id: I1323f17d5c2f70389aaad266b78ec0ea3054851b
diff --git a/benchmarks/benchmark_kelvin.cc b/benchmarks/benchmark_kelvin.cc index 6a84038..6b9e22e 100644 --- a/benchmarks/benchmark_kelvin.cc +++ b/benchmarks/benchmark_kelvin.cc
@@ -39,6 +39,12 @@ #define MODEL_HEADER STR(MODEL_HEADER_DIRECTORY BENCHMARK_NAME MODEL_HEADER_TYPE) #include MODEL_HEADER +#if (TEST_DATA == 1) +#define TEST_DATA_HEADER_TYPE _test_data.h +#define TEST_DATA_HEADER STR(MODEL_HEADER_DIRECTORY BENCHMARK_NAME TEST_DATA_HEADER_TYPE) +#include TEST_DATA_HEADER +#endif + namespace { constexpr int kTensorArenaSize = 1024 * 1024; uint8_t g_tensor_arena[kTensorArenaSize] __attribute__((aligned(64))); @@ -118,9 +124,12 @@ } TfLiteTensor* input = interpreter->input(0); - // Set input tensor to zero for first inference, subsequent runs - // will run on output tensor data (since the memory is shared). +#if (TEST_DATA == 1) + memcpy(tflite::GetTensorData<uint8_t>(input), g_benchmark_test_data, input->bytes); +#else memset(tflite::GetTensorData<uint8_t>(input), 0, input->bytes); +#endif + if (interpreter->Invoke() != kTfLiteOk) { return kInvokeFailed; } @@ -130,6 +139,11 @@ // TODO(michaelbrooks): Possibly set/verify test data? for (int i = 0; i < iterations; ++i) { +#if (TEST_DATA == 1) + memcpy(tflite::GetTensorData<uint8_t>(input), g_benchmark_test_data, input->bytes); +#else + memset(tflite::GetTensorData<uint8_t>(input), 0, input->bytes); +#endif interpreter->Invoke(); } uint64_t end = mcycle_read();
diff --git a/benchmarks/benchmarks.bzl b/benchmarks/benchmarks.bzl index 318269d..e28ed6a 100644 --- a/benchmarks/benchmarks.bzl +++ b/benchmarks/benchmarks.bzl
@@ -21,6 +21,7 @@ name, model, iterations, + test_data = None, profile = False, hw_test_size = "medium", hw_test_tags = [], @@ -28,20 +29,33 @@ iss_test_tags = [], **kwargs): + kelvin_headers = ["@kelvin_sw//benchmarks:benchmark.h"] + model_header_name = "{}_model".format(name) bin_to_c_file( - name = "{}_model".format(name), + name = model_header_name, srcs = [model], var_name = "g_benchmark_model_data", ) + kelvin_headers.append(model_header_name) + + if test_data: + test_data_header_name = "{}_test_data".format(name) + bin_to_c_file( + name = test_data_header_name, + srcs = [test_data], + var_name = "g_benchmark_test_data", + ) + kelvin_headers.append(test_data_header_name) # Test to run in simulator and MPACT. kelvin_test( name = "{}".format(name), srcs = ["@kelvin_sw//benchmarks:benchmark_kelvin.cc"], - hdrs = ["@kelvin_sw//benchmarks:benchmark.h", "{}_model.h".format(name)], + hdrs = kelvin_headers, copts = [ "-DITERATIONS={}".format(iterations), "-DBENCHMARK_NAME={}".format(name), + "-DTEST_DATA={}".format(1 if test_data else 0), "-DPROFILE={}".format(1 if profile else 0), ], deps = [ @@ -61,6 +75,7 @@ name, model, iterations, + test_data = None, profile = False, **kwargs): _kelvin_benchmark_device( @@ -68,6 +83,7 @@ model = model, device_type = "fpga_nexus", iterations = iterations, + test_data = test_data, profile = profile, **kwargs, ) @@ -76,6 +92,7 @@ name, model, iterations, + test_data = None, profile = False, **kwargs): @@ -84,6 +101,7 @@ model = model, device_type = "asic", iterations = iterations, + test_data = test_data, profile = profile, **kwargs, ) @@ -92,6 +110,7 @@ name, model, iterations, + test_data = None, profile = False, **kwargs): @@ -99,6 +118,7 @@ name = "{}_asic".format(name), model = model, iterations = iterations, + test_data = test_data, profile = profile, **kwargs, ) @@ -107,6 +127,7 @@ name = "{}_fpga".format(name), model = model, iterations = iterations, + test_data = test_data, profile = profile, **kwargs, ) @@ -126,15 +147,10 @@ model, device_type, iterations, + test_data = None, profile = False, **kwargs): - bin_to_c_file( - name = "{}_model".format(name), - srcs = [model], - var_name = "g_benchmark_model_data", - ) - # Creation of binaries for running on FPGA smc_flash_binary( name = "{}_smc".format(name), @@ -185,6 +201,24 @@ ], ) + kelvin_headers = ["@kelvin_sw//benchmarks:benchmark.h"] + model_header_name = "{}_model".format(name) + bin_to_c_file( + name = "{}_model".format(name), + srcs = [model], + var_name = "g_benchmark_model_data", + ) + kelvin_headers.append(model_header_name) + + if test_data: + test_data_header_name = "{}_test_data".format(name) + bin_to_c_file( + name = test_data_header_name, + srcs = [test_data], + var_name = "g_benchmark_test_data", + ) + kelvin_headers.append(test_data_header_name) + kelvin_binary( name = "{}_kelvin".format(name), srcs = [ @@ -193,12 +227,10 @@ copts = [ "-DITERATIONS={}".format(iterations), "-DBENCHMARK_NAME={}".format(name), + "-DTEST_DATA={}".format(1 if test_data else 0), "-DPROFILE={}".format(1 if profile else 0), ], - hdrs = [ - "@kelvin_sw//benchmarks:benchmark.h", - "{}_model.h".format(name), - ], + hdrs = kelvin_headers, deps = [ "@kelvin_sw//benchmarks:benchmark_header", "@kelvin_sw//benchmarks:cycle_count",