From 4df94a631d49592243f3a22a358471ebef3a80d0 Mon Sep 17 00:00:00 2001 From: Guoyu Wang <62914304+gwang-msft@users.noreply.github.com> Date: Tue, 21 Sep 2021 00:44:43 -0700 Subject: [PATCH] [NNAPI EP] Fix MaxPool error using uint8 (#9129) * fix issue in maxpool running using uint8 * Minor update --- .../nnapi/nnapi_builtin/builders/op_builder.cc | 6 ++++-- .../test/providers/nnapi/nnapi_basic_test.cc | 2 +- .../testdata/nnapi_internal_uint8_support.onnx | Bin 364 -> 483 bytes .../testdata/nnapi_internal_uint8_support.py | 13 +++++++------ 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/onnxruntime/core/providers/nnapi/nnapi_builtin/builders/op_builder.cc b/onnxruntime/core/providers/nnapi/nnapi_builtin/builders/op_builder.cc index 319ebe26c5..a351a5c483 100644 --- a/onnxruntime/core/providers/nnapi/nnapi_builtin/builders/op_builder.cc +++ b/onnxruntime/core/providers/nnapi/nnapi_builtin/builders/op_builder.cc @@ -1284,8 +1284,10 @@ Status PoolOpBuilder::AddToModelBuilderImpl(ModelBuilder& model_builder, const N int32_t fuse_code = model_builder.FindActivation(node, *node.OutputDefs()[0]); // Get output scale and zero point if this is QLinearAveragePool - float y_scale = 0.0f; - int32_t y_zero_point = 0; + // Otherwise we will use the scale and zero point of the input + const OperandType& input_operand_type = operand_types.at(input); + float y_scale = input_operand_type.operandType.scale; + int32_t y_zero_point = input_operand_type.operandType.zeroPoint; if (is_qlinear_average_pool) { const auto& initializers = model_builder.GetInitializerTensors(); float x_scale = 0.0f; diff --git a/onnxruntime/test/providers/nnapi/nnapi_basic_test.cc b/onnxruntime/test/providers/nnapi/nnapi_basic_test.cc index b80aa7cb85..b8c4acd127 100644 --- a/onnxruntime/test/providers/nnapi/nnapi_basic_test.cc +++ b/onnxruntime/test/providers/nnapi/nnapi_basic_test.cc @@ -82,7 +82,7 @@ TEST(NnapiExecutionProviderTest, InternalUint8SupportTest) { const ORTCHAR_T* model_file_name = ORT_TSTR("testdata/nnapi_internal_uint8_support.onnx"); #if defined(__ANDROID__) - std::vector dims_x = {1, 3}; + std::vector dims_x = {1, 1, 1, 3}; std::vector values_x = {0.0f, 256.0f, 512.0f}; OrtValue ml_value_x; CreateMLValue(TestNnapiExecutionProvider()->GetAllocator(0, OrtMemTypeDefault), dims_x, values_x, diff --git a/onnxruntime/test/testdata/nnapi_internal_uint8_support.onnx b/onnxruntime/test/testdata/nnapi_internal_uint8_support.onnx index daee608f7c1a8feebb8a01b2fe01ddb50b0ab1a6..03fca2f5337a6bbac30af799ed0e21d11930d8e5 100644 GIT binary patch literal 483 zcmZuuO;3YB5M>v%FeMFLt5Ll5$jPJeBBi}FsZEVN&|Wqx-9#c?5NJX?`BVD4{4we( zAJU|oZ1&BYd6U^Udgty_g?m6goIC|A;s9%&#x#jTk&~`Z-*!yo;XB{hP(yk%>^)ZW zEEJrjFoSmKK|pk$2C)cOZtLYM^{3-M#uOc7w=IACh)H#rcd*fi7bgT`HgOaWglZ%C!9WL2~W4K z;v!eAyBtW5IfPcWx#2BmtVt7<-jJ*Le6*O-smSG^ETTK<>@8jLEO+`kvd~adl#j7j o+V7l63Oh*gT6a$F)jwJDKk%z6`4^Wtk;{X5v delta 191 zcmaFN{Dz60gWc*e6PN8ob`@!k!qUXNlFX`9CB8r?%O^80HL-}xaiWK+A6s&MUUFiI z5}Pxa*5c-3Nvy~$mS9-G$i$_`#Ssw?Q6R(<5noc2m{(koU!0mE#R+FCafZNzxtu1; yF{*NNrKG~_oE*RyrYp?F7$L;R#lyiU#KFbH!3f06NkG9!Btd4NAd?f5051S!v@q5H diff --git a/onnxruntime/test/testdata/nnapi_internal_uint8_support.py b/onnxruntime/test/testdata/nnapi_internal_uint8_support.py index f419df2dc7..d7d2c18cf5 100644 --- a/onnxruntime/test/testdata/nnapi_internal_uint8_support.py +++ b/onnxruntime/test/testdata/nnapi_internal_uint8_support.py @@ -8,10 +8,11 @@ from onnx import TensorProto # def GenerateModel(model_name): def GenerateModel(model_name): nodes = [ - helper.make_node("QuantizeLinear", ["X", "Scale", "Zero_point"], ["X_quantized"], "quantize"), - helper.make_node("Concat", ["X_quantized", "X_quantized"], ["X_concat"], axis=0, name="concat"), - helper.make_node("Transpose", ["X_concat"], ["X_transposed"], "transpose"), - helper.make_node("DequantizeLinear", ["X_transposed", "Scale", "Zero_point"], ["Y"], "dequantize"), + helper.make_node("QuantizeLinear", ["X", "Scale", "Zero_point"], ["X_quantized"], "quantize_0"), + helper.make_node("Concat", ["X_quantized", "X_quantized"], ["X_concat"], axis=-2, name="concat_0"), + helper.make_node("MaxPool", ["X_concat"], ["X_maxpool"], kernel_shape=[2, 2], name="maxpool_0"), + helper.make_node("Transpose", ["X_maxpool"], ["X_transposed"], perm=[0, 1, 3, 2], name="transpose_0"), + helper.make_node("DequantizeLinear", ["X_transposed", "Scale", "Zero_point"], ["Y"], "dequantize_0"), ] initializers = [ @@ -20,14 +21,14 @@ def GenerateModel(model_name): ] inputs = [ - helper.make_tensor_value_info('X', TensorProto.FLOAT, [1, 3]), + helper.make_tensor_value_info('X', TensorProto.FLOAT, [1, 1, 1, 3]), ] graph = helper.make_graph( nodes, "NNAPI_Internal_uint8_Test", inputs, - [helper.make_tensor_value_info('Y', TensorProto.FLOAT, [3, 2])], + [helper.make_tensor_value_info('Y', TensorProto.FLOAT, [1, 1, 2, 1])], initializers )