From cf7ee5f6e8bcf9d039e75ed832cba04b9794cff9 Mon Sep 17 00:00:00 2001 From: Scott McKay Date: Sun, 20 Oct 2019 01:15:27 -0700 Subject: [PATCH] Support negative axis in unsqueeze elimination (#2158) * Handle negative axes in UnsqueezeElimination. * Address PR comments * Trigger rebuild. Some CI builds are unable to be retried --- .../core/optimizer/unsqueeze_elimination.cc | 28 +++++++++++------- .../test/optimizer/graph_transform_test.cc | 4 ++- .../test/providers/provider_test_utils.h | 14 +++++++++ ...nv-bn-mul-add-unsqueeze.negative_axes.onnx | Bin 0 -> 642980 bytes 4 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 onnxruntime/test/testdata/transform/fusion/fuse-conv-bn-mul-add-unsqueeze.negative_axes.onnx diff --git a/onnxruntime/core/optimizer/unsqueeze_elimination.cc b/onnxruntime/core/optimizer/unsqueeze_elimination.cc index 43947a2903..86b4ce3047 100644 --- a/onnxruntime/core/optimizer/unsqueeze_elimination.cc +++ b/onnxruntime/core/optimizer/unsqueeze_elimination.cc @@ -12,16 +12,6 @@ using namespace onnxruntime::common; namespace onnxruntime { Status UnsqueezeElimination::Apply(Graph& graph, Node& node, RewriteRuleEffect& rule_effect) const { - // Get "axes" attribute. It's a required attribute so can't be null (model loading would fail if it was). - const ONNX_NAMESPACE::AttributeProto& attr = *graph_utils::GetNodeAttribute(node, "axes"); - - std::vector axes; - axes.reserve(attr.ints_size()); - for (int i = 0; i < attr.ints_size(); i++) { - axes.push_back(static_cast(attr.ints(i))); - } - - // Generate new dims. NodeArg& input_def = *node.MutableInputDefs()[0]; const auto& tensor_proto = *graph_utils::GetConstantInitializer(graph, input_def.Name()); @@ -31,8 +21,24 @@ Status UnsqueezeElimination::Apply(Graph& graph, Node& node, RewriteRuleEffect& return Status::OK(); } - std::vector new_dims(axes.size() + tensor_proto.dims().size(), 0); + std::vector axes; + if (!graph_utils::GetRepeatedNodeAttributeValues(node, "axes", axes)) { + // missing 'axes'. should have failed at model load but just in case... + return Status::OK(); + } + auto num_axes = axes.size(); + auto output_rank = num_axes + tensor_proto.dims().size(); + + // handle any negative axis values + for (auto& axis : axes) { + if (axis < 0) { + axis += output_rank; + } + } + + // Generate new dims. + std::vector new_dims(output_rank, 0); for (int64_t axis : axes) { new_dims[axis] = 1; } diff --git a/onnxruntime/test/optimizer/graph_transform_test.cc b/onnxruntime/test/optimizer/graph_transform_test.cc index 3b7cd5ef9e..9dbee78498 100644 --- a/onnxruntime/test/optimizer/graph_transform_test.cc +++ b/onnxruntime/test/optimizer/graph_transform_test.cc @@ -29,6 +29,7 @@ #include "core/util/math.h" #include "test/capturing_sink.h" #include "test/framework/test_utils.h" +#include "test/providers/provider_test_utils.h" #include "test/test_environment.h" #include "gtest/gtest.h" @@ -262,12 +263,13 @@ TEST(GraphTransformationTests, FuseConvBNNoBias) { TEST(GraphTransformationTests, FuseConvBNMulAddUnsqueeze) { std::vector test_models = {"fusion/fuse-conv-bn-mul-add-unsqueeze.onnx", + "fusion/fuse-conv-bn-mul-add-unsqueeze.negative_axes.onnx", "fusion/fuse-conv-bn-mul-add-unsqueeze-no-bias.onnx"}; for (const auto& model : test_models) { string model_uri = MODEL_FOLDER + model; std::shared_ptr p_model; - ASSERT_TRUE(Model::Load(model_uri, p_model).IsOK()); + ASSERT_STATUS_OK(Model::Load(model_uri, p_model)); Graph& graph = p_model->MainGraph(); onnxruntime::GraphTransformerManager graph_transformation_mgr{5}; diff --git a/onnxruntime/test/providers/provider_test_utils.h b/onnxruntime/test/providers/provider_test_utils.h index 1d573776c8..1c91ccba71 100644 --- a/onnxruntime/test/providers/provider_test_utils.h +++ b/onnxruntime/test/providers/provider_test_utils.h @@ -24,6 +24,20 @@ #include #include "core/util/math_cpuonly.h" +// helpers to run a function and check the status, outputting any error if it fails. +// note: wrapped in do{} while(false) so the _tmp_status variable has limited scope +#define ASSERT_STATUS_OK(function) \ + do { \ + auto _tmp_status = function; \ + ASSERT_TRUE(_tmp_status.IsOK()) << _tmp_status; \ + } while (false) + +#define EXPECT_STATUS_OK(function) \ + do { \ + auto _tmp_status = function; \ + EXPECT_TRUE(_tmp_status.IsOK()) << _tmp_status; \ + } while (false) + namespace onnxruntime { class InferenceSession; struct SessionOptions; diff --git a/onnxruntime/test/testdata/transform/fusion/fuse-conv-bn-mul-add-unsqueeze.negative_axes.onnx b/onnxruntime/test/testdata/transform/fusion/fuse-conv-bn-mul-add-unsqueeze.negative_axes.onnx new file mode 100644 index 0000000000000000000000000000000000000000..a2002ec79fe478b23d1bd4a4e6dac87ea3ed3934 GIT binary patch literal 642980 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