diff --git a/onnxruntime/core/optimizer/qdq_transformer/selectors_actions/qdq_selector_action_transformer.cc b/onnxruntime/core/optimizer/qdq_transformer/selectors_actions/qdq_selector_action_transformer.cc index c88ae9b8c4782..1e0f633360889 100644 --- a/onnxruntime/core/optimizer/qdq_transformer/selectors_actions/qdq_selector_action_transformer.cc +++ b/onnxruntime/core/optimizer/qdq_transformer/selectors_actions/qdq_selector_action_transformer.cc @@ -86,7 +86,7 @@ void DropQDQNodesRules(SelectorActionRegistry& qdq_selector_action_registry) { std::unique_ptr selector_no_16bit_and_positive_scale = std::make_unique(false, true, false, providers); qdq_selector_action_registry.RegisterSelectorAndAction(drop_action_no_int16_and_positive_scale_name, - {{"MaxPool", {12}}, + {{"MaxPool", {12, 22}}, {"ReduceMax", {}}, {"ReduceMin", {}}}, std::move(selector_no_16bit_and_positive_scale), diff --git a/onnxruntime/core/optimizer/qdq_transformer/selectors_actions/shared/utils.cc b/onnxruntime/core/optimizer/qdq_transformer/selectors_actions/shared/utils.cc index 84ec94369a50e..09edd12f8fee7 100644 --- a/onnxruntime/core/optimizer/qdq_transformer/selectors_actions/shared/utils.cc +++ b/onnxruntime/core/optimizer/qdq_transformer/selectors_actions/shared/utils.cc @@ -52,7 +52,7 @@ static const OpVersionsAndSelector::OpVersionsMap GetMiscOpVersionsMap() { {"Expand", {}}, {"Flatten", {}}, {"Transpose", {}}, - {"MaxPool", {12}}, + {"MaxPool", {12, 22}}, {"Resize", {}}, {"Squeeze", {}}, {"Unsqueeze", {}}, diff --git a/onnxruntime/test/optimizer/qdq_transformer_test.cc b/onnxruntime/test/optimizer/qdq_transformer_test.cc index 0e4980684a578..5f8f0b9c614ed 100644 --- a/onnxruntime/test/optimizer/qdq_transformer_test.cc +++ b/onnxruntime/test/optimizer/qdq_transformer_test.cc @@ -1104,6 +1104,28 @@ TEST(QDQTransformerTests, MaxpoolDontDropQDQForNegativeScale) { RunMaxPoolNegativeScaleDropQDQTestCase(); } +// Q/DQ around a MaxPool must still be dropped for the opset-22 MaxPool schema, not only MaxPool-12. +TEST(QDQTransformerTests, MaxpoolDropQDQOpset22) { + auto build_test_case = [](ModelTestBuilder& builder) { + auto* input_arg = builder.MakeInput({1, 17, 17, 3}, 0, 255); + auto* dq_output = builder.MakeIntermediate(); + auto* maxpool_output = builder.MakeIntermediate(); + + builder.AddDequantizeLinearNode(input_arg, 0.003f, 128, dq_output); + builder.AddNode("MaxPool", {dq_output}, {maxpool_output}).AddAttribute("kernel_shape", std::vector{2, 2}); + builder.AddQuantizeLinearNode(maxpool_output, 0.003f, 128, builder.MakeOutput()); + }; + + auto check_graph = [](InferenceSessionWrapper& session) { + auto op_to_count = CountOpsInGraph(session.GetGraph()); + EXPECT_EQ(op_to_count["MaxPool"], 1); + EXPECT_EQ(op_to_count["QuantizeLinear"], 0); + EXPECT_EQ(op_to_count["DequantizeLinear"], 0); + }; + + TransformerTester(build_test_case, check_graph, TransformerLevel::Level1, TransformerLevel::Level2, 22); +} + // Runs a test case that checks if Q/DQ nodes are dropped from DQ -> (Un)Squeeze -> Q. template static void RunSqueezeUnsqueezeDropQDQTestCase(const std::string& squeeze_type,