Fix GH Issue 10305 by adding implicit inputs to consumer nodes map. (#10319)

This commit is contained in:
Scott McKay 2022-01-20 07:46:35 +10:00 committed by GitHub
parent a656c55a75
commit 90e2a4b936
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 258 additions and 183 deletions

View file

@ -1066,7 +1066,7 @@ void Node::ForEachDef(std::function<void(const onnxruntime::NodeArg&, bool is_in
// Constructor: Given a <GraphProto> loaded from model file, construct
// a <Graph> object and Resolve() it.
//Status Graph::LoadGraph(const GraphProto& graph_proto,
// Status Graph::LoadGraph(const GraphProto& graph_proto,
// const std::unordered_map<std::string, int>& domain_to_version,
// Version ir_version,
// std::unique_ptr<Graph>& new_graph) {
@ -1607,16 +1607,19 @@ Status Graph::BuildConnections(std::unordered_set<std::string>& outer_scope_node
// now build connections within this Graph instance
node_arg_to_producer_node_.clear();
node_arg_to_consumer_nodes_.clear();
for (auto& node : Nodes()) {
// Need mutable input defs to be able to set any outer scope NodeArg implicit inputs
auto& input_args = node.MutableInputDefs();
auto& output_args = node.MutableOutputDefs();
if (!output_args.empty()) {
for (const auto* output_arg : output_args) {
if (output_arg->Exists()) {
node_arg_to_producer_node_.insert({output_arg->Name(), node.Index()});
}
for (const auto* implicit_input : node.ImplicitInputDefs()) {
node_arg_to_consumer_nodes_[implicit_input->Name()].insert(node.Index());
}
for (const auto* output_arg : output_args) {
if (output_arg->Exists()) {
node_arg_to_producer_node_.insert({output_arg->Name(), node.Index()});
}
}
@ -2650,7 +2653,7 @@ void Graph::InitFunctionBodyForNode(Node& node) {
<< node.Name() << "' optype " << node.OpType()
#ifndef ORT_NO_EXCEPTIONS
<< ". Error message " << e.what()
#endif //ORT_NO_EXCEPTIONS
#endif // ORT_NO_EXCEPTIONS
<< ". Execution will fail if ORT does not have a specialized kernel for this op";
// Return without using this function op's expansion. No need to fail just yet.
// If ORT has a specialized kernel for this op then execution will proceed
@ -3476,7 +3479,7 @@ void Graph::CleanUnusedInitializersAndNodeArgs(const std::unordered_set<std::str
std::unordered_set<const NodeArg*> used_args;
used_args.reserve(node_args_.size());
//Node Args we want to preserved even not being used
// Node Args we want to preserved even not being used
std::unordered_set<const NodeArg*> node_args_to_preserve;
if (initializer_names_to_preserve) {
node_args_to_preserve.reserve(initializer_names_to_preserve->size());

View file

@ -294,209 +294,209 @@ TEST(TransposeOptimizerTests, TestPadNonconst) {
// Todo: renable tests on resize transformer after adding NHWC support in upsample op on cpu
// https://github.com/microsoft/onnxruntime/issues/9857
//TEST(TransposeOptimizerTests, TestResize) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input0_arg = MakeInput<float>(builder, {{4, -1, 2, -1}}, {4, 6, 2, 10}, 0.0, 1.0);
// auto* const_1 = builder.MakeInitializer<float>({4}, {0.3f, 2.5f, 1.0f, 0.7f});
// auto* transpose_1_out_0 = builder.MakeIntermediate();
// auto* resize_1_out_0 = builder.MakeIntermediate();
// auto* transpose_2_out_0 = builder.MakeOutput();
// TEST(TransposeOptimizerTests, TestResize) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input0_arg = MakeInput<float>(builder, {{4, -1, 2, -1}}, {4, 6, 2, 10}, 0.0, 1.0);
// auto* const_1 = builder.MakeInitializer<float>({4}, {0.3f, 2.5f, 1.0f, 0.7f});
// auto* transpose_1_out_0 = builder.MakeIntermediate();
// auto* resize_1_out_0 = builder.MakeIntermediate();
// auto* transpose_2_out_0 = builder.MakeOutput();
//
// auto& transpose_1 = builder.AddNode("Transpose", {input0_arg}, {transpose_1_out_0});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// builder.AddNode("Resize", {transpose_1_out_0, const_1}, {resize_1_out_0});
// auto& transpose_2 = builder.AddNode("Transpose", {resize_1_out_0}, {transpose_2_out_0});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
// auto& transpose_1 = builder.AddNode("Transpose", {input0_arg}, {transpose_1_out_0});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// builder.AddNode("Resize", {transpose_1_out_0, const_1}, {resize_1_out_0});
// auto& transpose_2 = builder.AddNode("Transpose", {resize_1_out_0}, {transpose_2_out_0});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
//
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
//
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1,
// /*opset_version*/ 10);
//}
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1,
// /*opset_version*/ 10);
// }
//
//TEST(TransposeOptimizerTests, TestResizeOpset11) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input0_arg = MakeInput<float>(builder, {{4, -1, 2, -1}}, {4, 6, 2, 10}, 0.0, 1.0);
// auto* const_1 = builder.MakeInitializer<float>({8}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f});
// auto* const_2 = builder.MakeInitializer<float>({4}, {0.3f, 2.5f, 1.0f, 0.7f});
// auto* transpose_1_out_0 = builder.MakeIntermediate();
// auto* resize_1_out_0 = builder.MakeIntermediate();
// auto* transpose_2_out_0 = builder.MakeOutput();
// TEST(TransposeOptimizerTests, TestResizeOpset11) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input0_arg = MakeInput<float>(builder, {{4, -1, 2, -1}}, {4, 6, 2, 10}, 0.0, 1.0);
// auto* const_1 = builder.MakeInitializer<float>({8}, {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f});
// auto* const_2 = builder.MakeInitializer<float>({4}, {0.3f, 2.5f, 1.0f, 0.7f});
// auto* transpose_1_out_0 = builder.MakeIntermediate();
// auto* resize_1_out_0 = builder.MakeIntermediate();
// auto* transpose_2_out_0 = builder.MakeOutput();
//
// auto& transpose_1 = builder.AddNode("Transpose", {input0_arg}, {transpose_1_out_0});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// builder.AddNode("Resize", {transpose_1_out_0, const_1, const_2}, {resize_1_out_0});
// auto& transpose_2 = builder.AddNode("Transpose", {resize_1_out_0}, {transpose_2_out_0});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
// auto& transpose_1 = builder.AddNode("Transpose", {input0_arg}, {transpose_1_out_0});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// builder.AddNode("Resize", {transpose_1_out_0, const_1, const_2}, {resize_1_out_0});
// auto& transpose_2 = builder.AddNode("Transpose", {resize_1_out_0}, {transpose_2_out_0});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
//
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
//
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1,
// /*opset_version*/ 11);
//}
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1,
// /*opset_version*/ 11);
// }
//
//TEST(TransposeOptimizerTests, TestResizeOpset15) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input0_arg = MakeInput<float>(builder, {{4, -1, 2, -1}}, {4, 6, 2, 10}, 0.0, 1.0);
// auto* const_1 = builder.MakeInitializer<float>({4}, {0.3f, 2.5f, 1.0f, 0.7f});
// auto* transpose_1_out_0 = builder.MakeIntermediate();
// auto* resize_1_out_0 = builder.MakeIntermediate();
// auto* transpose_2_out_0 = builder.MakeOutput();
// auto empty_arg = NodeArg("", nullptr);
// TEST(TransposeOptimizerTests, TestResizeOpset15) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input0_arg = MakeInput<float>(builder, {{4, -1, 2, -1}}, {4, 6, 2, 10}, 0.0, 1.0);
// auto* const_1 = builder.MakeInitializer<float>({4}, {0.3f, 2.5f, 1.0f, 0.7f});
// auto* transpose_1_out_0 = builder.MakeIntermediate();
// auto* resize_1_out_0 = builder.MakeIntermediate();
// auto* transpose_2_out_0 = builder.MakeOutput();
// auto empty_arg = NodeArg("", nullptr);
//
// auto& transpose_1 = builder.AddNode("Transpose", {input0_arg}, {transpose_1_out_0});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// builder.AddNode("Resize", {transpose_1_out_0, &empty_arg, const_1}, {resize_1_out_0});
// auto& transpose_2 = builder.AddNode("Transpose", {resize_1_out_0}, {transpose_2_out_0});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
// auto& transpose_1 = builder.AddNode("Transpose", {input0_arg}, {transpose_1_out_0});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// builder.AddNode("Resize", {transpose_1_out_0, &empty_arg, const_1}, {resize_1_out_0});
// auto& transpose_2 = builder.AddNode("Transpose", {resize_1_out_0}, {transpose_2_out_0});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
//
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
//
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1,
// /*opset_version*/ 15);
//}
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1,
// /*opset_version*/ 15);
// }
//
//TEST(TransposeOptimizerTests, TestResizeSizeRoi) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input0_arg = MakeInput<float>(builder, {{4, -1, 2, -1}}, {4, 6, 2, 10}, 0.0, 1.0);
// auto* const_1 = builder.MakeInitializer<float>({8}, {0.1f, 0.2f, 0.3f, 0.4f, 0.9f, 0.8f, 0.7f, 0.6f});
// auto* const_2 = builder.MakeInitializer<int64_t>({4}, {10, 9, 8, 7});
// auto* transpose_1_out_0 = builder.MakeIntermediate();
// auto* resize_1_out_0 = builder.MakeIntermediate();
// auto* transpose_2_out_0 = builder.MakeOutput();
// auto empty_arg = NodeArg("", nullptr);
// TEST(TransposeOptimizerTests, TestResizeSizeRoi) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input0_arg = MakeInput<float>(builder, {{4, -1, 2, -1}}, {4, 6, 2, 10}, 0.0, 1.0);
// auto* const_1 = builder.MakeInitializer<float>({8}, {0.1f, 0.2f, 0.3f, 0.4f, 0.9f, 0.8f, 0.7f, 0.6f});
// auto* const_2 = builder.MakeInitializer<int64_t>({4}, {10, 9, 8, 7});
// auto* transpose_1_out_0 = builder.MakeIntermediate();
// auto* resize_1_out_0 = builder.MakeIntermediate();
// auto* transpose_2_out_0 = builder.MakeOutput();
// auto empty_arg = NodeArg("", nullptr);
//
// auto& transpose_1 = builder.AddNode("Transpose", {input0_arg}, {transpose_1_out_0});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// auto& resize_1 = builder.AddNode("Resize", {transpose_1_out_0, const_1, &empty_arg, const_2}, {resize_1_out_0});
// resize_1.AddAttribute("coordinate_transformation_mode", "tf_crop_and_resize");
// auto& transpose_2 = builder.AddNode("Transpose", {resize_1_out_0}, {transpose_2_out_0});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
// auto& transpose_1 = builder.AddNode("Transpose", {input0_arg}, {transpose_1_out_0});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// auto& resize_1 = builder.AddNode("Resize", {transpose_1_out_0, const_1, &empty_arg, const_2}, {resize_1_out_0});
// resize_1.AddAttribute("coordinate_transformation_mode", "tf_crop_and_resize");
// auto& transpose_2 = builder.AddNode("Transpose", {resize_1_out_0}, {transpose_2_out_0});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
//
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
//
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1,
// /*opset_version*/ 15);
//}
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1,
// /*opset_version*/ 15);
// }
//
//TEST(TransposeOptimizerTests, TestResizeRoiScalesZeroRank0) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input = builder.MakeInput<uint8_t>({1, 512, 512, 3},
// std::numeric_limits<uint8_t>::min(),
// std::numeric_limits<uint8_t>::max());
// auto* resize_in_roi = builder.MakeInitializer<float>({0}, {});
// auto* resize_in_scales = builder.MakeInitializer<float>({0}, {});
// auto* resize_in_sizes = builder.MakeInitializer<int64_t>({4}, {1, 256, 32, 32});
// TEST(TransposeOptimizerTests, TestResizeRoiScalesZeroRank0) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input = builder.MakeInput<uint8_t>({1, 512, 512, 3},
// std::numeric_limits<uint8_t>::min(),
// std::numeric_limits<uint8_t>::max());
// auto* resize_in_roi = builder.MakeInitializer<float>({0}, {});
// auto* resize_in_scales = builder.MakeInitializer<float>({0}, {});
// auto* resize_in_sizes = builder.MakeInitializer<int64_t>({4}, {1, 256, 32, 32});
//
// auto* transpose1_out_transposed = builder.MakeIntermediate();
// auto* resize_out_Y = builder.MakeIntermediate();
// auto* output = builder.MakeOutput();
// auto* transpose1_out_transposed = builder.MakeIntermediate();
// auto* resize_out_Y = builder.MakeIntermediate();
// auto* output = builder.MakeOutput();
//
// auto& transpose_1 = builder.AddNode("Transpose", {input}, {transpose1_out_transposed});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// builder.AddNode("Resize",
// {transpose1_out_transposed, resize_in_roi, resize_in_scales, resize_in_sizes},
// {resize_out_Y});
// auto& transpose_2 = builder.AddNode("Transpose", {resize_out_Y}, {output});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
// auto& transpose_1 = builder.AddNode("Transpose", {input}, {transpose1_out_transposed});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// builder.AddNode("Resize",
// {transpose1_out_transposed, resize_in_roi, resize_in_scales, resize_in_sizes},
// {resize_out_Y});
// auto& transpose_2 = builder.AddNode("Transpose", {resize_out_Y}, {output});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
//
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
//
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1);
//}
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1);
// }
//
//TEST(TransposeOptimizerTests, TestResizeNonconst) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input0_arg = MakeInput<float>(builder, {{4, -1, 2, -1}}, {4, 6, 2, 10}, 0.0, 1.0);
// auto* input1_arg = MakeInput<float>(builder, {{8}}, {8}, {0.1f, 0.2f, 0.3f, 0.4f, 0.9f, 0.8f, 0.7f, 0.6f});
// auto* input2_arg = MakeInput<float>(builder, {{4}}, {4}, {0.3f, 2.5f, 1.0f, 0.7f});
// auto* transpose_1_out_0 = builder.MakeIntermediate();
// auto* resize_1_out_0 = builder.MakeIntermediate();
// auto* transpose_2_out_0 = builder.MakeOutput();
// TEST(TransposeOptimizerTests, TestResizeNonconst) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input0_arg = MakeInput<float>(builder, {{4, -1, 2, -1}}, {4, 6, 2, 10}, 0.0, 1.0);
// auto* input1_arg = MakeInput<float>(builder, {{8}}, {8}, {0.1f, 0.2f, 0.3f, 0.4f, 0.9f, 0.8f, 0.7f, 0.6f});
// auto* input2_arg = MakeInput<float>(builder, {{4}}, {4}, {0.3f, 2.5f, 1.0f, 0.7f});
// auto* transpose_1_out_0 = builder.MakeIntermediate();
// auto* resize_1_out_0 = builder.MakeIntermediate();
// auto* transpose_2_out_0 = builder.MakeOutput();
//
// auto& transpose_1 = builder.AddNode("Transpose", {input0_arg}, {transpose_1_out_0});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// auto& resize_1 = builder.AddNode("Resize", {transpose_1_out_0, input1_arg, input2_arg}, {resize_1_out_0});
// resize_1.AddAttribute("coordinate_transformation_mode", "tf_crop_and_resize");
// auto& transpose_2 = builder.AddNode("Transpose", {resize_1_out_0}, {transpose_2_out_0});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
// auto& transpose_1 = builder.AddNode("Transpose", {input0_arg}, {transpose_1_out_0});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// auto& resize_1 = builder.AddNode("Resize", {transpose_1_out_0, input1_arg, input2_arg}, {resize_1_out_0});
// resize_1.AddAttribute("coordinate_transformation_mode", "tf_crop_and_resize");
// auto& transpose_2 = builder.AddNode("Transpose", {resize_1_out_0}, {transpose_2_out_0});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
//
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
//
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1,
// /*opset_version*/ 11);
//}
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1,
// /*opset_version*/ 11);
// }
//
//TEST(TransposeOptimizerTests, TestResizeNonconstOpset13) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input0_arg = MakeInput<float>(builder, {{4, -1, 2, -1}}, {4, 6, 2, 10}, 0.0, 1.0);
// auto* input1_arg = MakeInput<float>(builder, {{8}}, {8}, {0.1f, 0.2f, 0.3f, 0.4f, 0.9f, 0.8f, 0.7f, 0.6f});
// auto* input2_arg = MakeInput<float>(builder, {{4}}, {4}, {0.3f, 2.5f, 1.0f, 0.7f});
// auto* transpose_1_out_0 = builder.MakeIntermediate();
// auto* resize_1_out_0 = builder.MakeIntermediate();
// auto* transpose_2_out_0 = builder.MakeOutput();
// TEST(TransposeOptimizerTests, TestResizeNonconstOpset13) {
// auto build_test_case_1 = [&](ModelTestBuilder& builder) {
// auto* input0_arg = MakeInput<float>(builder, {{4, -1, 2, -1}}, {4, 6, 2, 10}, 0.0, 1.0);
// auto* input1_arg = MakeInput<float>(builder, {{8}}, {8}, {0.1f, 0.2f, 0.3f, 0.4f, 0.9f, 0.8f, 0.7f, 0.6f});
// auto* input2_arg = MakeInput<float>(builder, {{4}}, {4}, {0.3f, 2.5f, 1.0f, 0.7f});
// auto* transpose_1_out_0 = builder.MakeIntermediate();
// auto* resize_1_out_0 = builder.MakeIntermediate();
// auto* transpose_2_out_0 = builder.MakeOutput();
//
// auto& transpose_1 = builder.AddNode("Transpose", {input0_arg}, {transpose_1_out_0});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// auto& resize_1 = builder.AddNode("Resize", {transpose_1_out_0, input1_arg, input2_arg}, {resize_1_out_0});
// resize_1.AddAttribute("coordinate_transformation_mode", "tf_crop_and_resize");
// auto& transpose_2 = builder.AddNode("Transpose", {resize_1_out_0}, {transpose_2_out_0});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
// auto& transpose_1 = builder.AddNode("Transpose", {input0_arg}, {transpose_1_out_0});
// transpose_1.AddAttribute("perm", std::vector<int64_t>{0, 3, 1, 2});
// auto& resize_1 = builder.AddNode("Resize", {transpose_1_out_0, input1_arg, input2_arg}, {resize_1_out_0});
// resize_1.AddAttribute("coordinate_transformation_mode", "tf_crop_and_resize");
// auto& transpose_2 = builder.AddNode("Transpose", {resize_1_out_0}, {transpose_2_out_0});
// transpose_2.AddAttribute("perm", std::vector<int64_t>{0, 2, 3, 1});
// };
//
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
// auto check_optimized_graph_1 = [&](InferenceSessionWrapper& session) {
// int transpose_cost = EstimateTransposeCost(session.GetGraph());
// EXPECT_EQ(transpose_cost, 0);
// };
//
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1,
// /*opset_version*/ 13);
//}
// TransformerTester(build_test_case_1,
// check_optimized_graph_1,
// TransformerLevel::Default,
// TransformerLevel::Level1,
// /*opset_version*/ 13);
// }
TEST(TransposeOptimizerTests, TestAdd) {
auto build_test_case_1 = [&](ModelTestBuilder& builder) {
@ -3869,5 +3869,19 @@ TEST(TransposeOptimizerTests, RegressionTest_GitHubIssue9671) {
ASSERT_STATUS_OK(session_object.Initialize()); // optimizers run during initialization
}
// regression test for a model where the transpose optimizations incorrectly removed a node providing an implicit
// input to a subgraph. fixed by updating Graph::BuildConnections to add implicit inputs to node_arg_to_consumer_nodes_
// see https://github.com/microsoft/onnxruntime/issues/10305 for more details.
TEST(TransposeOptimizerTests, RegressionTest_GitHubIssue10305) {
Status status;
auto model_uri = ORT_TSTR("testdata/ort_github_issue_10305.onnx");
SessionOptions so;
so.session_logid = "TransposeOptimizerTests.RegressionTest_GitHubIssue10305";
InferenceSession session_object{so, GetEnvironment()};
ASSERT_STATUS_OK(session_object.Load(model_uri));
ASSERT_STATUS_OK(session_object.Initialize()); // optimizers run during initialization
}
} // namespace test
} // namespace onnxruntime

Binary file not shown.

View file

@ -0,0 +1,58 @@
import onnx
from onnx import helper
from onnx import TensorProto
# Loop is so the Tranpose output is used in a subgraph
loop_body = helper.make_graph(
[
helper.make_node("Add", ["transpose:0", "loop_state_in"], ["loop_state_out"], "Add1"),
],
"Loop_body",
[
helper.make_tensor_value_info('iteration_num', TensorProto.INT64, [1]),
helper.make_tensor_value_info('subgraph_keep_going_in', TensorProto.BOOL, [1]),
helper.make_tensor_value_info('loop_state_in', TensorProto.FLOAT, [1])
],
[
helper.make_tensor_value_info('subgraph_keep_going_in', TensorProto.BOOL, [1]),
helper.make_tensor_value_info('loop_state_out', TensorProto.FLOAT, [2, 2, 2]),
],
[
]
)
# Create the main graph
graph_proto = helper.make_graph(
[
# add a Transpose that can be moved past the Slice
helper.make_node('Transpose', inputs=['input:0'], outputs=['transpose:0'], name='transpose0', perm=[1, 0, 2]),
helper.make_node('Slice',
inputs=['transpose:0', 'start', 'end'],
outputs=['strided_slice:0'], name='slice0'),
helper.make_node('Squeeze',
inputs=['strided_slice:0', 'start'],
outputs=['out:0'],
name='squeeze0'),
helper.make_node("Loop", ["max_trip_count", "subgraph_keep_going_in", "state_var_in"], ["out:1"], "Loop1",
body=loop_body)
],
"Main_graph",
[
helper.make_tensor_value_info('input:0', TensorProto.FLOAT, [2, 2, 2]),
helper.make_tensor_value_info('state_var_in', TensorProto.FLOAT, [1]),
],
[
helper.make_tensor_value_info('out:0', TensorProto.FLOAT, [2, 2]),
helper.make_tensor_value_info('out:1', TensorProto.FLOAT, [2, 2, 2]),
],
[
helper.make_tensor('start', TensorProto.INT64, [1], [0]),
helper.make_tensor('end', TensorProto.INT64, [1], [1]),
helper.make_tensor('max_trip_count', TensorProto.INT64, [1], [1]),
helper.make_tensor('subgraph_keep_going_in', TensorProto.BOOL, [1], [1]),
]
)
model = helper.make_model(graph_proto)
onnx.checker.check_model(model, True)
onnx.save(model, 'ort_github_issue_10305.onnx')