From b8d370029f38649e5c35b58b9970e94003e7cd29 Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Wed, 26 Jun 2019 15:42:05 -0700 Subject: [PATCH] Check that specific inputs are constants in Conv(Add|Mul|BN)Fusion rules (#1270) * Check for non-existent initializers while fusing conv and add. * Fix other places where initializer can be null * Add check if initializer is an input * update the models to comply with the new ONNX spec. In new ONNX spec, the initializers should not be in inputs. * Fix previous temporary code * Add negative test * Revert changes to conv_bn_fusion and conv_mul_fusion * making helper IsNodeArgConstant a little more general; updating remaining Conv*Fusion rules * minor comment * AllNodeIputsAreConstant to use new function --- onnxruntime/core/graph/graph_utils.cc | 8 +++- onnxruntime/core/graph/graph_utils.h | 3 ++ onnxruntime/core/optimizer/conv_add_fusion.cc | 30 ++++++++++--- onnxruntime/core/optimizer/conv_bn_fusion.cc | 41 ++++++++++++++---- onnxruntime/core/optimizer/conv_mul_fusion.cc | 26 ++++++++--- onnxruntime/core/session/inference_session.h | 2 +- onnxruntime/test/onnx/main.cc | 2 +- .../test/optimizer/graph_transform_test.cc | 25 +++++++++++ .../fusion/fuse-conv-add-mul-3d-2.onnx | Bin 50429 -> 50297 bytes .../fusion/fuse-conv-add-mul-3d.onnx | Bin 50136 -> 50029 bytes .../fusion/fuse-conv-add-no-bias.onnx | Bin 38351 -> 38286 bytes .../fusion/fuse-conv-bn-add-mul-float16.onnx | Bin 553 -> 378 bytes ...use-conv-bn-mul-add-unsqueeze-no-bias.onnx | Bin 40183 -> 39966 bytes .../fusion/fuse-conv-bn-no-bias.onnx | Bin 39333 -> 39172 bytes .../fusion/fuse-conv-mul-no-bias.onnx | Bin 38369 -> 38304 bytes .../negative-fuse-conv-add-no-bias.onnx | Bin 0 -> 38351 bytes 16 files changed, 114 insertions(+), 23 deletions(-) create mode 100644 onnxruntime/test/testdata/transform/fusion/negative-fuse-conv-add-no-bias.onnx diff --git a/onnxruntime/core/graph/graph_utils.cc b/onnxruntime/core/graph/graph_utils.cc index d3a21293a5..1a4ab6d8b5 100644 --- a/onnxruntime/core/graph/graph_utils.cc +++ b/onnxruntime/core/graph/graph_utils.cc @@ -399,16 +399,20 @@ bool IsGraphInput(const Graph& graph, const NodeArg* input) { return std::find(graph_inputs.begin(), graph_inputs.end(), input) != graph_inputs.end(); } +bool NodeArgIsConstant(const Graph& graph, const NodeArg& node_arg) { + const onnx::TensorProto* initializer = nullptr; + return graph.GetInitializedTensor(node_arg.Name(), initializer) && !IsGraphInput(graph, &node_arg); +} + bool AllNodeInputsAreConstant(const Graph& graph, const Node& node) { if (node.GetInputEdgesCount() > 0) { return false; } - const onnx::TensorProto* initializer = nullptr; for (const auto* input_def : node.InputDefs()) { // Important note: when an initializer appears in the graph's input, this input will not be considered constant, // because it can be overriden by the user at runtime. For constant folding to be applied, the initializer should // not appear in the graph's inputs (that is the only way to guarantee it will always be constant). - if (!graph.GetInitializedTensor(input_def->Name(), initializer) || IsGraphInput(graph, input_def)) { + if (!NodeArgIsConstant(graph, *input_def)) { return false; } } diff --git a/onnxruntime/core/graph/graph_utils.h b/onnxruntime/core/graph/graph_utils.h index 0f84a7575c..c3d872df23 100644 --- a/onnxruntime/core/graph/graph_utils.h +++ b/onnxruntime/core/graph/graph_utils.h @@ -41,6 +41,9 @@ bool IsGraphInput(const Graph& graph, const NodeArg* input); /** Checks if the given node has only constant inputs (initializers). */ bool AllNodeInputsAreConstant(const Graph& graph, const Node& node); +/** Checks if the given NodeArg is constant, i.e., it appears in the graph's initializers but not in its inputs. */ +bool NodeArgIsConstant(const Graph& graph, const NodeArg& node_arg); + /** Gets the name of the incoming NodeArg with the specified index for the given node. */ const std::string& GetNodeInputName(const Node& node, int index); diff --git a/onnxruntime/core/optimizer/conv_add_fusion.cc b/onnxruntime/core/optimizer/conv_add_fusion.cc index d0284e93ce..94296e908f 100644 --- a/onnxruntime/core/optimizer/conv_add_fusion.cc +++ b/onnxruntime/core/optimizer/conv_add_fusion.cc @@ -16,10 +16,14 @@ Status ConvAddFusion::Apply(Graph& graph, Node& node, RewriteRuleEffect& modifie const auto& add_inputs = add_node.InputDefs(); const ONNX_NAMESPACE::TensorProto* conv_W_tensor_proto = nullptr; - graph.GetInitializedTensor(conv_inputs[1]->Name(), conv_W_tensor_proto); + if (!graph.GetInitializedTensor(conv_inputs[1]->Name(), conv_W_tensor_proto)) { + return Status::OK(); + } const ONNX_NAMESPACE::TensorProto* add_B_tensor_proto = nullptr; - graph.GetInitializedTensor(add_inputs[1]->Name(), add_B_tensor_proto); + if (!graph.GetInitializedTensor(add_inputs[1]->Name(), add_B_tensor_proto)) { + return Status::OK(); + } // Currently, fusion is only supported for float or double data type. if (!Initializer::IsSupportedDataType(add_B_tensor_proto) || @@ -49,7 +53,9 @@ Status ConvAddFusion::Apply(Graph& graph, Node& node, RewriteRuleEffect& modifie const ONNX_NAMESPACE::TensorProto* conv_B_tensor_proto = nullptr; if (conv_inputs.size() == 3) { - graph.GetInitializedTensor(conv_inputs[2]->Name(), conv_B_tensor_proto); + if (!graph.GetInitializedTensor(conv_inputs[2]->Name(), conv_B_tensor_proto)) { + return Status::OK(); + } if (!Initializer::IsSupportedDataType(conv_B_tensor_proto) || conv_B_tensor_proto->data_type() != add_B_tensor_proto->data_type() || @@ -114,9 +120,21 @@ bool ConvAddFusion::SatisfyCondition(const Graph& graph, const Node& node) const } const auto& next_node = *node.OutputNodesBegin(); - return !(!graph_utils::IsSupportedOptypeVersionAndDomain(next_node, "Add", {7}) || - next_node.GetExecutionProviderType() != node.GetExecutionProviderType() || - next_node.GetInputEdgesCount() != 1 || graph.IsNodeOutputsInGraphOutputs(next_node)); + if (!graph_utils::IsSupportedOptypeVersionAndDomain(next_node, "Add", {7}) || + next_node.GetInputEdgesCount() != 1 || graph.IsNodeOutputsInGraphOutputs(next_node) || + // Make sure the two nodes do not span execution providers. + next_node.GetExecutionProviderType() != node.GetExecutionProviderType()) { + return false; + } + + // Check that the appropriate inputs to the Conv and Add nodes are constants. + if (!graph_utils::NodeArgIsConstant(graph, *node.InputDefs()[1]) || + (node.InputDefs().size() == 3 && !graph_utils::NodeArgIsConstant(graph, *node.InputDefs()[2])) || + !graph_utils::NodeArgIsConstant(graph, *next_node.InputDefs()[1])) { + return false; + } + + return true; } } // namespace onnxruntime diff --git a/onnxruntime/core/optimizer/conv_bn_fusion.cc b/onnxruntime/core/optimizer/conv_bn_fusion.cc index 1d22d7c02f..65469b365d 100644 --- a/onnxruntime/core/optimizer/conv_bn_fusion.cc +++ b/onnxruntime/core/optimizer/conv_bn_fusion.cc @@ -24,20 +24,30 @@ Status ConvBNFusion::Apply(Graph& graph, Node& node, RewriteRuleEffect& rule_eff // Get initializers of BatchNormalization const auto& bn_inputs = bn_node.InputDefs(); const ONNX_NAMESPACE::TensorProto* bn_scale_tensor_proto = nullptr; - graph.GetInitializedTensor(bn_inputs[1]->Name(), bn_scale_tensor_proto); + if (!graph.GetInitializedTensor(bn_inputs[1]->Name(), bn_scale_tensor_proto)) { + return Status::OK(); + } const ONNX_NAMESPACE::TensorProto* bn_B_tensor_proto = nullptr; - graph.GetInitializedTensor(bn_inputs[2]->Name(), bn_B_tensor_proto); + if (!graph.GetInitializedTensor(bn_inputs[2]->Name(), bn_B_tensor_proto)) { + return Status::OK(); + } const ONNX_NAMESPACE::TensorProto* bn_mean_tensor_proto = nullptr; - graph.GetInitializedTensor(bn_inputs[3]->Name(), bn_mean_tensor_proto); + if (!graph.GetInitializedTensor(bn_inputs[3]->Name(), bn_mean_tensor_proto)) { + return Status::OK(); + } const ONNX_NAMESPACE::TensorProto* bn_var_tensor_proto = nullptr; - graph.GetInitializedTensor(bn_inputs[4]->Name(), bn_var_tensor_proto); + if (!graph.GetInitializedTensor(bn_inputs[4]->Name(), bn_var_tensor_proto)) { + return Status::OK(); + } const auto& conv_inputs = conv_node.InputDefs(); const ONNX_NAMESPACE::TensorProto* conv_W_tensor_proto = nullptr; - graph.GetInitializedTensor(conv_inputs[1]->Name(), conv_W_tensor_proto); + if (!graph.GetInitializedTensor(conv_inputs[1]->Name(), conv_W_tensor_proto)) { + return Status::OK(); + } // Currently, fusion is only supported for float or double data type. if (!Initializer::IsSupportedDataType(bn_scale_tensor_proto) || @@ -149,9 +159,24 @@ bool ConvBNFusion::SatisfyCondition(const Graph& graph, const Node& node) const } const auto& next_node = *node.OutputNodesBegin(); - return !(!graph_utils::IsSupportedOptypeVersionAndDomain(next_node, "BatchNormalization", {7, 9}) || - next_node.GetInputEdgesCount() != 1 || graph.IsNodeOutputsInGraphOutputs(next_node) || - next_node.GetExecutionProviderType() != node.GetExecutionProviderType()); + if (!graph_utils::IsSupportedOptypeVersionAndDomain(next_node, "BatchNormalization", {7, 9}) || + next_node.GetInputEdgesCount() != 1 || graph.IsNodeOutputsInGraphOutputs(next_node) || + // Make sure the two nodes do not span execution providers. + next_node.GetExecutionProviderType() != node.GetExecutionProviderType()) { + return false; + } + + // Check that the appropriate inputs to the Conv and BN nodes are constants. + if (!graph_utils::NodeArgIsConstant(graph, *node.InputDefs()[1]) || + (node.InputDefs().size() == 3 && !graph_utils::NodeArgIsConstant(graph, *node.InputDefs()[2])) || + !graph_utils::NodeArgIsConstant(graph, *next_node.InputDefs()[1]) || + !graph_utils::NodeArgIsConstant(graph, *next_node.InputDefs()[2]) || + !graph_utils::NodeArgIsConstant(graph, *next_node.InputDefs()[3]) || + !graph_utils::NodeArgIsConstant(graph, *next_node.InputDefs()[4])) { + return false; + } + + return true; } } // namespace onnxruntime diff --git a/onnxruntime/core/optimizer/conv_mul_fusion.cc b/onnxruntime/core/optimizer/conv_mul_fusion.cc index 0e5cbfc5d5..54408f3185 100644 --- a/onnxruntime/core/optimizer/conv_mul_fusion.cc +++ b/onnxruntime/core/optimizer/conv_mul_fusion.cc @@ -16,10 +16,14 @@ Status ConvMulFusion::Apply(Graph& graph, Node& node, RewriteRuleEffect& rule_ef const auto& mul_inputs = mul_node.InputDefs(); const ONNX_NAMESPACE::TensorProto* conv_W_tensor_proto = nullptr; - graph.GetInitializedTensor(conv_inputs[1]->Name(), conv_W_tensor_proto); + if (!graph.GetInitializedTensor(conv_inputs[1]->Name(), conv_W_tensor_proto)) { + return Status::OK(); + } const ONNX_NAMESPACE::TensorProto* mul_B_tensor_proto = nullptr; - graph.GetInitializedTensor(mul_inputs[1]->Name(), mul_B_tensor_proto); + if (!graph.GetInitializedTensor(mul_inputs[1]->Name(), mul_B_tensor_proto)) { + return Status::OK(); + } if (!Initializer::IsSupportedDataType(conv_W_tensor_proto) || !Initializer::IsSupportedDataType(mul_B_tensor_proto) || @@ -112,9 +116,21 @@ bool ConvMulFusion::SatisfyCondition(const Graph& graph, const Node& node) const } const auto& next_node = *node.OutputNodesBegin(); - return !(!graph_utils::IsSupportedOptypeVersionAndDomain(next_node, "Mul", {7}) || - next_node.GetInputEdgesCount() != 1 || graph.IsNodeOutputsInGraphOutputs(next_node) || - next_node.GetExecutionProviderType() != node.GetExecutionProviderType()); + if (!graph_utils::IsSupportedOptypeVersionAndDomain(next_node, "Mul", {7}) || + next_node.GetInputEdgesCount() != 1 || graph.IsNodeOutputsInGraphOutputs(next_node) || + // Make sure the two nodes do not span execution providers. + next_node.GetExecutionProviderType() != node.GetExecutionProviderType()) { + return false; + } + + // Check that the appropriate inputs to the Conv and Mul nodels are constants. + if (!graph_utils::NodeArgIsConstant(graph, *node.InputDefs()[1]) || + (node.InputDefs().size() == 3 && !graph_utils::NodeArgIsConstant(graph, *node.InputDefs()[2])) || + !graph_utils::NodeArgIsConstant(graph, *next_node.InputDefs()[1])) { + return false; + } + + return true; } } // namespace onnxruntime diff --git a/onnxruntime/core/session/inference_session.h b/onnxruntime/core/session/inference_session.h index 0bf91e8caf..2a2371d439 100644 --- a/onnxruntime/core/session/inference_session.h +++ b/onnxruntime/core/session/inference_session.h @@ -434,7 +434,7 @@ class InferenceSession { //So its lifetime should be same as its constituents. This vector is to extend the lifetime of the owner. std::vector> custom_registries_; -#ifdef ENABLE_LANGUAGE_INTEROP_OPS +#ifdef ENABLE_LANGUAGE_INTEROP_OPS InterOpDomains interop_domains_; #endif }; diff --git a/onnxruntime/test/onnx/main.cc b/onnxruntime/test/onnx/main.cc index 830d9f6611..7d31f6e377 100644 --- a/onnxruntime/test/onnx/main.cc +++ b/onnxruntime/test/onnx/main.cc @@ -164,7 +164,7 @@ int real_main(int argc, char* argv[], Ort::Env& env) { case 'o': graph_optimization_level = static_cast(OrtStrtol(optarg, nullptr)); if (graph_optimization_level > 2) { - fprintf(stderr, "See usage for valid values of graph optimization level"); + fprintf(stderr, "See usage for valid values of graph optimization level\n"); usage(); return -1; } diff --git a/onnxruntime/test/optimizer/graph_transform_test.cc b/onnxruntime/test/optimizer/graph_transform_test.cc index 7cbdd59a16..043e0133d2 100644 --- a/onnxruntime/test/optimizer/graph_transform_test.cc +++ b/onnxruntime/test/optimizer/graph_transform_test.cc @@ -286,6 +286,31 @@ TEST(GraphTransformationTests, FuseConvAddNoBias) { ASSERT_TRUE(op_to_count["Unsqueeze"] == 0); } +TEST(GraphTransformationTests, NegativeFuseConvAddNoBias) { + string model_uri = MODEL_FOLDER + "fusion/negative-fuse-conv-add-no-bias.onnx"; + + std::shared_ptr p_model; + ASSERT_TRUE(Model::Load(model_uri, p_model).IsOK()); + Graph& graph = p_model->MainGraph(); + + onnxruntime::GraphTransformerManager graph_transformation_mgr{5}; + auto rule_transformer_L1 = std::make_unique("RuleTransformer1"); + rule_transformer_L1->Register(std::make_unique()); + graph_transformation_mgr.Register(std::move(rule_transformer_L1), TransformerLevel::Level1); + + auto rule_transformer_L2 = std::make_unique("RuleTransformerL2"); + rule_transformer_L2->Register(std::make_unique()); + graph_transformation_mgr.Register(std::move(rule_transformer_L2), TransformerLevel::Level2); + + ASSERT_TRUE(graph_transformation_mgr.ApplyTransformers(graph, TransformerLevel::Level1).IsOK()); + ASSERT_TRUE(graph_transformation_mgr.ApplyTransformers(graph, TransformerLevel::Level2).IsOK()); + + // Nodes are not fused because the weights to conv/add are not constants (they appear in the graph inputs). + std::map op_to_count = CountOpsInGraph(graph); + ASSERT_TRUE(op_to_count["Add"] != 0); + ASSERT_TRUE(op_to_count["Unsqueeze"] == 0); +} + TEST(GraphTransformationTests, FuseConvAddMul3D) { string model_uri = MODEL_FOLDER + "fusion/fuse-conv-add-mul-3d.onnx"; diff --git a/onnxruntime/test/testdata/transform/fusion/fuse-conv-add-mul-3d-2.onnx b/onnxruntime/test/testdata/transform/fusion/fuse-conv-add-mul-3d-2.onnx index fc613b9d47ab6ca51419bd1161d795bc4aaebb73..c3352045c3499a506aa71f91ac225392d760de77 100644 GIT binary patch delta 20 ccmey{$^5f}nU#at>V3yXR=*>YuOCqZ09vmI>i_@% delta 154 zcmey_!Th(AnU#at>T~BtR=*?lQCeI)0f|M4xv3?oMW$wkLQ-539E?IDTudAeP|OUZ f89^9Ltr3!1kUU5|SREF%#yHfnf;CJIKB5Ky=G7Z0 diff --git a/onnxruntime/test/testdata/transform/fusion/fuse-conv-add-mul-3d.onnx b/onnxruntime/test/testdata/transform/fusion/fuse-conv-add-mul-3d.onnx index 6145c08d25a40c5d9f9ce06815860214dbf8f84d..3a353583bdf016e50af120669010d3e1716d1b11 100644 GIT binary patch delta 20 ccmcc7&iuBGnU#at>T%mfR;R<0Hyu_309A1abpQYW delta 148 zcmaFc#(bllnU#at>RkIqR;R=DQCeI)0f|M4xv3?oMW$wkLQ-539E?IDTudAeP|OUZ z89_Ko4MnYykQkQ;P^|z|9as%mohTQ#bADcNNn&1!nW>o&8y5>u8AFl+7f)JgacW9@ RQEG8%P6<#W-{k1SLI7XkA0Yq$ diff --git a/onnxruntime/test/testdata/transform/fusion/fuse-conv-add-no-bias.onnx b/onnxruntime/test/testdata/transform/fusion/fuse-conv-add-no-bias.onnx index f2df9e10224356930c87fe2da0369056d8fb22e6..80a37a88340f368fbb25cf74dfb5b601e0e199c6 100644 GIT binary patch delta 19 bcmX@VnyGI!6AK5kRm(;e$ElOsrg{PZMVbc( delta 84 zcmeBM&2)Y>6AK5k)zOVCj#C|!xj2*a^U4h4%i|4%#JEH_7=;A5m^d7Om>G!KK{!f^ biwCSoKPfLh38;>Xivy^R1*C4W%TzA_GB*)C diff --git a/onnxruntime/test/testdata/transform/fusion/fuse-conv-bn-add-mul-float16.onnx b/onnxruntime/test/testdata/transform/fusion/fuse-conv-bn-add-mul-float16.onnx index f76a8bcb832a7c8cd9ac54c228145e3374fab0b5..41aeacbb77122c498442c43eaa35bc1d37e8d228 100644 GIT binary patch delta 31 mcmZ3<@{37`gGGqjt+Y7REhj&*#L&#@3DZU)7skn~Oez48DG0j& delta 149 zcmeyxw30=LgGGqjt+Y7REhj&*#L&!YGRsCG7e>}7X)ea_$#IMlkx{~2tijIy0j@$^ zTpS!+LM&WN9E?#yTr5tWj=|_+zOIgbC}M(K%wdi}C_?gFtd1@&PLUwfIir9)-%uY2 JZ*mx;3IG5}8B72G diff --git a/onnxruntime/test/testdata/transform/fusion/fuse-conv-bn-mul-add-unsqueeze-no-bias.onnx b/onnxruntime/test/testdata/transform/fusion/fuse-conv-bn-mul-add-unsqueeze-no-bias.onnx index 584fbdf53568530aa5823b708b1c8997d4a0c952..621616c2864afeff0455ff1cf5e2d1dfad1c7b57 100644 GIT binary patch delta 20 ccmeyqlWE=#CRPq+t0_A+vR;@ydEFdO09sTC=l}o! delta 238 zcmbQYgX#NDCRPq+tG7EhvR;^7ugt}noS#=_7+)T5ASA{m!oescz{SMj0L08d%nrg) za$EvnMfyp3@x{rBIjKOkTwEMLwJadDQLt<8 delta 182 zcmZqK#I$rX6DtR^)$Gk1S+~uoSLWhO&d)0|j4zKj5EA1O;b0UJ;9}x%0Agk!W(VOY zIW7UPBK@Si_~PWmoK&D%E-ntBS{9JnC|NFkxO`G(Vlf`++|`?BrcDya31@C^rBA diff --git a/onnxruntime/test/testdata/transform/fusion/fuse-conv-mul-no-bias.onnx b/onnxruntime/test/testdata/transform/fusion/fuse-conv-mul-no-bias.onnx index ed4c77f313b50e81ca20f2eeb7a54db7451d481d..80821b18f554f52f83c88465b0cf6af5be2ef9b5 100644 GIT binary patch delta 19 bcmaF3nrXpmCKe86t7#iqf~QWNG1U_QNmK`6 delta 84 zcmZ3mn(5(cCKe86tLqzCf~Pttb8#l;=am`8m&Y3jiE)W=FbWB9F>yEmF*6XegK(4- Z7Y|sGeo`J-9Tyh|P#p_M-Q=*TUI0nR5vu?I diff --git a/onnxruntime/test/testdata/transform/fusion/negative-fuse-conv-add-no-bias.onnx b/onnxruntime/test/testdata/transform/fusion/negative-fuse-conv-add-no-bias.onnx new file mode 100644 index 0000000000000000000000000000000000000000..f2df9e10224356930c87fe2da0369056d8fb22e6 GIT binary patch literal 38351 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 literal 0 HcmV?d00001