From 294eaca9eff6f6d750a03fbea3451b155d360029 Mon Sep 17 00:00:00 2001 From: Hariharan Seshadri Date: Tue, 25 Aug 2020 13:23:52 -0700 Subject: [PATCH] Support double for ArgMax operator (#4907) --- .../providers/cpu/cpu_execution_provider.cc | 10 ++- .../providers/cpu/reduction/reduction_ops.cc | 3 + .../cpu/reduction/reduction_ops_test.cc | 71 ++++++++++++------- 3 files changed, 56 insertions(+), 28 deletions(-) diff --git a/onnxruntime/core/providers/cpu/cpu_execution_provider.cc b/onnxruntime/core/providers/cpu/cpu_execution_provider.cc index c1b6ee8a10..2382a8d24f 100644 --- a/onnxruntime/core/providers/cpu/cpu_execution_provider.cc +++ b/onnxruntime/core/providers/cpu/cpu_execution_provider.cc @@ -310,6 +310,7 @@ class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, 11, MLFloat16, Round); class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, 11, uint8_t, DynamicQuantizeLinear); class ONNX_OPERATOR_VERSIONED_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, 11, 11, float, ArgMax); +class ONNX_OPERATOR_VERSIONED_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, 11, 11, double, ArgMax); class ONNX_OPERATOR_VERSIONED_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, 11, 11, int32_t, ArgMax); class ONNX_OPERATOR_VERSIONED_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, 11, 11, float, ArgMin); class ONNX_OPERATOR_VERSIONED_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, 11, 11, int32_t, ArgMin); @@ -401,6 +402,7 @@ class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, // opset 12 class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, 12, float, ArgMax); +class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, 12, double, ArgMax); class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, 12, int32_t, ArgMax); class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, 12, float, ArgMin); class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kCpuExecutionProvider, kOnnxDomain, 12, int32_t, ArgMin); @@ -453,7 +455,7 @@ KernelCreateInfo BuildKernelCreateInfo() { Status RegisterOnnxOperatorKernels(KernelRegistry& kernel_registry) { static const BuildKernelCreateInfoFn function_table[] = { - BuildKernelCreateInfo, //default entry to avoid the list become empty after ops-reducing + BuildKernelCreateInfo, //default entry to avoid the list become empty after ops-reducing BuildKernelCreateInfo, BuildKernelCreateInfo, @@ -910,6 +912,8 @@ Status RegisterOnnxOperatorKernels(KernelRegistry& kernel_registry) { DynamicQuantizeLinear)>, BuildKernelCreateInfo, + BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, + BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo() { Status RegisterOnnxMLOperatorKernels(KernelRegistry& kernel_registry) { static const BuildKernelCreateInfoFn function_table[] = { - BuildKernelCreateInfo, //default entry to avoid the list become empty after ops-reducing + BuildKernelCreateInfo, //default entry to avoid the list become empty after ops-reducing BuildKernelCreateInfo, BuildKernelCreateInfo("reduced", {3, 1, 1}, {4, 8, 12}); - #if defined(OPENVINO_CONFIG_GPU_FP32) || defined(OPENVINO_CONFIG_GPU_FP16) || defined(OPENVINO_CONFIG_MYRIAD) - test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider, kOpenVINOExecutionProvider}); // OpenVINO: Disabled temporarily - #else - test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider}); //TensorRT: axis must be 0 - # endif +#if defined(OPENVINO_CONFIG_GPU_FP32) || defined(OPENVINO_CONFIG_GPU_FP16) || defined(OPENVINO_CONFIG_MYRIAD) + test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider, kOpenVINOExecutionProvider}); // OpenVINO: Disabled temporarily +#else + test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider}); //TensorRT: axis must be 0 +#endif } TEST(ReductionOpTest, ReduceMax_int8) { @@ -637,11 +637,11 @@ TEST(ReductionOpTest, ReduceMax_int8) { 9, 10, 11, 12}); test.AddOutput("reduced", {3, 1, 1}, {4, 8, 12}); - #if defined(OPENVINO_CONFIG_MYRIAD) - test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider, kOpenVINOExecutionProvider}); // OpenVINO: Disabled temporarily - #else - test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider}); //TensorRT: axis must be 0 - #endif +#if defined(OPENVINO_CONFIG_MYRIAD) + test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider, kOpenVINOExecutionProvider}); // OpenVINO: Disabled temporarily +#else + test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider}); //TensorRT: axis must be 0 +#endif } TEST(ReductionOpTest, ReduceMax_uint8) { @@ -658,11 +658,11 @@ TEST(ReductionOpTest, ReduceMax_uint8) { 9, 10, 11, 12}); test.AddOutput("reduced", {3, 1, 1}, {4, 8, 12}); - #if defined(OPENVINO_CONFIG_MYRIAD) - test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider, kOpenVINOExecutionProvider}); // OpenVINO: Disabled temporarily - #else - test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider}); //TensorRT: axis must be 0 - #endif +#if defined(OPENVINO_CONFIG_MYRIAD) + test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider, kOpenVINOExecutionProvider}); // OpenVINO: Disabled temporarily +#else + test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider}); //TensorRT: axis must be 0 +#endif } #if !(defined USE_TENSORRT) && !(defined USE_TVM) @@ -1152,7 +1152,6 @@ void test_apex_reduce_sum( } else { test.Run(); } - } TEST(ReductionOpTest, ReduceSum_apex_matrix_large) { @@ -1204,13 +1203,13 @@ TEST(ReductionOpTest, ReduceSum_batch_by_seq_by_30528) { #endif TEST(ReductionOpTest, ReduceSum_bert_selected_batch_size) { - #if defined(OPENVINO_CONFIG_MYRIAD) || defined(OPENVINO_CONFIG_VAD_M) - test_apex_reduce_sum(85 * 128, 768, true); - test_apex_reduce_sum(86 * 128, 768, true); - #else - test_apex_reduce_sum(85 * 128, 768); - test_apex_reduce_sum(86 * 128, 768); - #endif +#if defined(OPENVINO_CONFIG_MYRIAD) || defined(OPENVINO_CONFIG_VAD_M) + test_apex_reduce_sum(85 * 128, 768, true); + test_apex_reduce_sum(86 * 128, 768, true); +#else + test_apex_reduce_sum(85 * 128, 768); + test_apex_reduce_sum(86 * 128, 768); +#endif } TEST(ReductionOpTest, ReduceSum_apex_more) { @@ -1608,6 +1607,26 @@ TEST(ReductionOpTest, ArgMax) { test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider}); //TensorRT: axis must be 0 } +TEST(ReductionOpTest, ArgMax_Double_Type) { + OpTester test("ArgMax", 11); + test.AddAttribute("axis", static_cast(1)); + test.AddAttribute("keepdims", static_cast(1)); + test.AddInput("data", {3, 2, 2}, + {1.0, 2.0, + 3.0, 4.0, + + 5.0, 6.0, + 7.0, 8.0, + + 9.0, 10.0, + 11.0, 12.0}); + test.AddOutput("reduced", {3, 1, 2}, + {1, 1, + 1, 1, + 1, 1}); + test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider}); //TensorRT: axis must be 0 +} + TEST(ReductionOpTest, ArgMax_do_not_keepdims) { OpTester test("ArgMax"); test.AddAttribute("axis", (int64_t)1); @@ -1636,7 +1655,7 @@ TEST(ReductionOpTest, ArgMax_do_not_keepdims_2) { {1.0f, 2.0f, 3.0f}); test.AddOutput("reduced", {}, {2}); - test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider}); // TensorRT: node1: at least 2 dimensions are required for input + test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider}); // TensorRT: node1: at least 2 dimensions are required for input } TEST(ReductionOpTest, ArgMax_int32) { @@ -1796,7 +1815,7 @@ TEST(ReductionOpTest, ArgMin_do_not_keepdims_2) { test.AddInput("data", {3}, {1.0f, 2.0f, 3.0f}); test.AddOutput("reduced", {}, {0}); - test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider}); // TensorRT: node1: at least 2 dimensions are required for input + test.Run(OpTester::ExpectResult::kExpectSuccess, "", {kTensorrtExecutionProvider}); // TensorRT: node1: at least 2 dimensions are required for input } TEST(ReductionOpTest, ArgMin_do_not_keepdims_2_select_last) {