From 1d92cb3fc7d05720a4f2d2ee288772d5aff85032 Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Wed, 29 Oct 2025 16:39:11 -0700 Subject: [PATCH 01/12] update --- .../tensorrt/tensorrt_execution_provider.cc | 64 +++++++++++++------ 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc b/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc index cd0c0e4bffdb5..932253ff1b634 100644 --- a/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc +++ b/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc @@ -2035,9 +2035,25 @@ std::unique_ptr TensorrtExecutionProvider::GetSubGraph(SubGraph } // Find inputs and outputs of the subgraph + std::unique_ptr sub_graph = onnxruntime::IndexedSubGraph::Create(); - std::unordered_map original_inputs, fused_inputs, fused_outputs, fused_outputs_to_add, graph_outputs_to_add; + std::unordered_map original_inputs; + + // These maps store the inputs and outpus of the subgraph. + // Please note that the inputs and outputs of the maps will be dynamically updated during node iteration + // to determine the final inputs and outputs of the subgraph. + std::unordered_map fused_inputs, fused_outputs; + + // This map stores the node's output that will be consumed by another node outside of this subgraph. + // So the node's output should be put into the subgraph's output list. + std::unordered_map fused_outputs_to_add; + + // This map stores the node's output that is original graph's output. + // So the node's output should be put into the subgraph's output list. + std::unordered_map graph_outputs_to_add; + std::unordered_set erased; + int input_order = 0; int output_order = 0; @@ -2056,7 +2072,7 @@ std::unique_ptr TensorrtExecutionProvider::GetSubGraph(SubGraph erased.insert(input); } else if (erased.find(input) == erased.end()) { // Only when input is neither in output list nor erased list, add the input to input list - fused_inputs[input] = input_order++; + fused_inputs.insert({input, input_order++}); } } @@ -2071,7 +2087,7 @@ std::unique_ptr TensorrtExecutionProvider::GetSubGraph(SubGraph erased.insert(input); } else if (erased.find(input) == erased.end()) { // Only when input is neither in output list nor erased list, add the input to input list - fused_inputs[input] = input_order++; + fused_inputs.insert({input, input_order++}); } } @@ -2099,32 +2115,38 @@ std::unique_ptr TensorrtExecutionProvider::GetSubGraph(SubGraph erased.insert(output); } else if (erased.find(output) == erased.end()) { if (graph_output_names.find(output->Name()) != graph_output_names.end()) { - graph_outputs_to_add[output] = output_order; + // This output is the graph's output. + // So the output should be put into the subgraph's output list. + graph_outputs_to_add.insert({output, output_order}); } - fused_outputs[output] = output_order++; + fused_outputs.insert({output, output_order++}); } } else { - fused_outputs_to_add[output] = output_order++; + // This output will be consumed by another node outside of this subgraph. + // So the output should be put into the subgraph's output list. + fused_outputs_to_add.insert({output, output_order++}); } } - } else { - for (const auto& output : node->OutputDefs()) { - const auto& it = fused_inputs.find(output); - if (it != fused_inputs.end()) { - fused_inputs.erase(it); - erased.insert(output); - } - // Only when output is neither in input list nor erased list, and the output is consumed by another node, add the output to output list - else if (erased.find(output) == erased.end()) { - if (graph_output_names.find(output->Name()) != graph_output_names.end()) { - graph_outputs_to_add[output] = output_order; - } + } - if (graph.GetGraph().GetConsumerNodes(output->Name()).size() > 0) { - fused_outputs[output] = output_order++; - } + for (const auto& output : node->OutputDefs()) { + const auto& it = fused_inputs.find(output); + if (it != fused_inputs.end()) { + fused_inputs.erase(it); + erased.insert(output); + } else if (erased.find(output) == erased.end()) { + if (graph.GetGraph().GetConsumerNodes(output->Name()).size() > 0) { + // Only when output is neither in input list nor erased list, + // and the output is consumed by another node, add the output to output list + fused_outputs.insert({output, output_order++}); } } + + if (graph_output_names.find(output->Name()) != graph_output_names.end()) { + // This output is the graph's output. + // So the output should be put into the subgraph's output list. + graph_outputs_to_add.insert({output, output_order++}); + } } } From 3f00973323c34628a054f05d449ad7c2829fb005 Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Thu, 30 Oct 2025 14:17:31 -0700 Subject: [PATCH 02/12] Add unit tests --- .../providers/tensorrt/tensorrt_basic_test.cc | 56 +++- .../providers/tensorrt/tensorrt_test_utils.cc | 284 ++++++++++++++++++ .../providers/tensorrt/tensorrt_test_utils.h | 10 + 3 files changed, 349 insertions(+), 1 deletion(-) create mode 100644 onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc create mode 100644 onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h diff --git a/onnxruntime/test/providers/tensorrt/tensorrt_basic_test.cc b/onnxruntime/test/providers/tensorrt/tensorrt_basic_test.cc index a746493d779f8..a0149613c21c3 100644 --- a/onnxruntime/test/providers/tensorrt/tensorrt_basic_test.cc +++ b/onnxruntime/test/providers/tensorrt/tensorrt_basic_test.cc @@ -1,5 +1,7 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +#include "onnxruntime_cxx_api.h" +#include "tensorrt_test_utils.h" #include "core/graph/onnx_protobuf.h" #include "core/session/inference_session.h" #include "test/providers/provider_test_utils.h" @@ -1358,5 +1360,57 @@ TEST(TensorrtExecutionProviderTest, RemoveCycleTest) { ASSERT_STATUS_OK(session_object.Run(run_options, feeds, output_names, &fetches)); VerifyOutputs(fetches, expected_dims_mul_m, expected_values_mul_m); } + +TEST(TensorrtExecutionProviderTest, TestSessionOutputs) { + /* + * Model #1: + * + * "input" ---> TopK --- + * |---> "scores" + * |--- Less ---> "Less_output_0" + * |--- Div ---> "Div_output_0" + * |--- Mod ---> "labels" + */ + { + Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"}; + OrtTensorRTProviderOptionsV2 provider_options; + Ort::SessionOptions session_options; + session_options.AppendExecutionProvider_TensorRT_V2(provider_options); + + auto model_path = ORT_TSTR("model_with_topk_and_multiple_graph_outputs.onnx"); + Ort::Status status(CreateModelWithTopKWhichContainsGraphOutput(model_path)); + ASSERT_TRUE(status.IsOK()); + + Ort::Session session(env, model_path, session_options); + + size_t output_count = session.GetOutputCount(); + ASSERT_TRUE(output_count == 4); + } + + /* + * Model #2: + * + * "X" ---> Dropout ---> MatMul ---> "Y" + * ^ | + * | | + * "W" ------ ----> Can't be graph's output + * + */ + { + Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"}; + OrtTensorRTProviderOptionsV2 provider_options; + Ort::SessionOptions session_options; + session_options.AppendExecutionProvider_TensorRT_V2(provider_options); + + auto model_path = ORT_TSTR("model_with_node_output_not_used.onnx"); + Ort::Status status(CreateModelWithNodeOutputNotUsed(model_path)); + ASSERT_TRUE(status.IsOK()); + + Ort::Session session(env, model_path, session_options); + + size_t output_count = session.GetOutputCount(); + ASSERT_TRUE(output_count == 1); + } +} } // namespace test } // namespace onnxruntime diff --git a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc new file mode 100644 index 0000000000000..1456ea1a4e138 --- /dev/null +++ b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc @@ -0,0 +1,284 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +#pragma once + +#include "onnxruntime_cxx_api.h" +#include "core/common/path_string.h" + +#include +#include + +#include +#include +#include + +using namespace ONNX_NAMESPACE; + +#define ONNX_IR_VERSION 11 +#define OPSET_VERSION 23 + +namespace onnxruntime { +namespace test { + +// Helper: make TensorProto +TensorProto MakeTensor(const std::string& name, + TensorProto::DataType dtype, + const std::vector& dims, + const std::vector& vals) { + TensorProto t; + t.set_name(name); + t.set_data_type(dtype); + for (auto d : dims) t.add_dims(d); + for (auto v : vals) t.add_int64_data(v); + return t; +} + +TensorProto MakeTensorFloat(const std::string& name, + const std::vector& dims, + const std::vector& vals) { + TensorProto t; + t.set_name(name); + t.set_data_type(TensorProto::FLOAT); + for (auto d : dims) t.add_dims(d); + for (auto v : vals) t.add_float_data(v); + return t; +} + +OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { + // -------------------- + // Create Model + // -------------------- + ModelProto model; + model.set_ir_version(ONNX_IR_VERSION); + auto* opset = model.add_opset_import(); + opset->set_domain(""); // empty = default ONNX domain + opset->set_version(OPSET_VERSION); + + GraphProto* graph = model.mutable_graph(); + graph->set_name("DropoutMatMulGraph"); + + // -------------------- + // Create Inputs + // X: [3, 2] + // W: [2, 3] + // -------------------- + { + auto* x = graph->add_input(); + x->set_name("X"); + + auto* type = x->mutable_type(); + auto* tt = type->mutable_tensor_type(); + tt->set_elem_type(TensorProto::FLOAT); + + auto* shape = tt->mutable_shape(); + shape->add_dim()->set_dim_value(3); + shape->add_dim()->set_dim_value(2); + } + + { + auto* w = graph->add_input(); + w->set_name("W"); + + auto* type = w->mutable_type(); + auto* tt = type->mutable_tensor_type(); + tt->set_elem_type(TensorProto::FLOAT); + + auto* shape = tt->mutable_shape(); + shape->add_dim()->set_dim_value(2); + shape->add_dim()->set_dim_value(3); + } + + // -------------------- + // Output Y: [2, 3] + // -------------------- + { + auto* x = graph->add_output(); + x->set_name("Y"); + + auto* type = x->mutable_type(); + auto* tt = type->mutable_tensor_type(); + tt->set_elem_type(TensorProto::FLOAT); + + auto* shape = tt->mutable_shape(); + shape->add_dim()->set_dim_value(2); + shape->add_dim()->set_dim_value(3); + } + + // -------------------- + // Dropout Node + // -------------------- + { + NodeProto* node = graph->add_node(); + node->set_name("DropoutNode"); + node->set_op_type("Dropout"); + + node->add_input("X"); + node->add_output("dropout_out"); + node->add_output("dropout_mask"); + } + + // -------------------- + // MatMul Node + // -------------------- + { + NodeProto* node = graph->add_node(); + node->set_name("MatMulNode"); + node->set_op_type("MatMul"); + + node->add_input("dropout_out"); + node->add_input("W"); + node->add_output("Y"); + } + + // -------------------- + // Validate + // -------------------- + try { + onnx::checker::check_model(model); + } catch (const std::exception& ex) { + std::string error_msg = "Model validation failed: " + std::string(ex.what()); + const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); + return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, error_msg.c_str()); + } + + std::ofstream ofs(model_name, std::ios::binary); + if (!model.SerializeToOstream(&ofs)) { + const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); + return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, "Failed to write model"); + } + + return nullptr; +} + +OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_name) { + ModelProto model; + model.set_ir_version(ONNX_IR_VERSION); + auto* opset = model.add_opset_import(); + opset->set_domain(""); // empty = default ONNX domain + opset->set_version(OPSET_VERSION); + + auto* graph = model.mutable_graph(); + graph->set_name("TopKGraph"); + + // ====================== + // ---- Model Input ---- + // ====================== + { + auto* inp = graph->add_input(); + inp->set_name("input"); + + auto* type = inp->mutable_type(); + auto* tt = type->mutable_tensor_type(); + tt->set_elem_type(TensorProto::FLOAT); + + // Shape: ["N"] + auto* shape = tt->mutable_shape(); + shape->add_dim()->set_dim_param("N"); + } + + // ====================== + // ---- Initializers ---- + // ====================== + { + // K = [300] + TensorProto K = MakeTensor("K", TensorProto::INT64, {1}, {300}); + *graph->add_initializer() = K; + + // zero = 0.0 (scalar) + TensorProto zero = MakeTensor("zero", TensorProto::INT64, {}, {0}); + *graph->add_initializer() = zero; + + // twenty_six = 26 (scalar) + TensorProto ts = MakeTensor("twenty_six", TensorProto::INT64, {}, {26}); + *graph->add_initializer() = ts; + } + + // ====================== + // ---- TopK ---- + // ====================== + { + NodeProto* n = graph->add_node(); + n->set_op_type("TopK"); + n->add_input("input"); + n->add_input("K"); + n->add_output("scores"); + n->add_output("topk_indices"); + n->set_name("TopK"); + } + + // ====================== + // ---- Less ---- + // ====================== + { + NodeProto* n = graph->add_node(); + n->set_op_type("Less"); + n->add_input("topk_indices"); + n->add_input("zero"); + n->add_output("Less_output_0"); + n->set_name("Less"); + } + + // ====================== + // ---- Div ---- + // ====================== + { + NodeProto* n = graph->add_node(); + n->set_op_type("Div"); + n->add_input("topk_indices"); + n->add_input("twenty_six"); + n->add_output("Div_17_output_0"); + n->set_name("Div"); + } + + // ====================== + // ---- Mod ---- + // ====================== + { + NodeProto* n = graph->add_node(); + n->set_op_type("Mod"); + n->add_input("topk_indices"); + n->add_input("twenty_six"); + n->add_output("labels"); + n->set_name("Mod"); + } + + // ========================= + // ---- Graph Outputs ---- + // ========================= + auto add_output = [&](const std::string& name, TensorProto::DataType type, const std::string& dim) { + auto* out = graph->add_output(); + out->set_name(name); + + auto* tt = out->mutable_type()->mutable_tensor_type(); + tt->set_elem_type(type); + + auto* shape = tt->mutable_shape(); + shape->add_dim()->set_dim_param(dim); + }; + + add_output("scores", TensorProto::FLOAT, "K"); + add_output("Less_output_0", TensorProto::BOOL, "K"); + add_output("Div_17_output_0", TensorProto::INT64, "K"); + add_output("labels", TensorProto::INT64, "K"); + + // ====================== + // Validate + Save + // ====================== + try { + onnx::checker::check_model(model); + } catch (const std::exception& e) { + std::string error_msg = "Model validation failed: " + std::string(e.what()); + const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); + return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, error_msg.c_str()); + } + + std::ofstream ofs(model_name, std::ios::binary); + if (!model.SerializeToOstream(&ofs)) { + const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); + return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, "Failed to write model"); + } + + return nullptr; +} +} +} diff --git a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h new file mode 100644 index 0000000000000..9f98b1f396469 --- /dev/null +++ b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h @@ -0,0 +1,10 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +#include "onnxruntime_cxx_api.h" + +namespace onnxruntime { +namespace test { +OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_name); +OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name); +} +} From 4308033f331da6e02b54cec8b9dd2121224a177c Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Thu, 30 Oct 2025 14:30:47 -0700 Subject: [PATCH 03/12] lintrunner -a --- onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc | 6 +++--- onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc index 1456ea1a4e138..18b66f85ec34f 100644 --- a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc +++ b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc @@ -154,7 +154,7 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n ModelProto model; model.set_ir_version(ONNX_IR_VERSION); auto* opset = model.add_opset_import(); - opset->set_domain(""); // empty = default ONNX domain + opset->set_domain(""); // empty = default ONNX domain opset->set_version(OPSET_VERSION); auto* graph = model.mutable_graph(); @@ -280,5 +280,5 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n return nullptr; } -} -} +} // namespace test +} // namespace onnxruntime diff --git a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h index 9f98b1f396469..f13ccae413d31 100644 --- a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h +++ b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h @@ -6,5 +6,5 @@ namespace onnxruntime { namespace test { OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_name); OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name); -} -} +} // namespace test +} // namespace onnxruntime From fb44919859e686fd6c38bddf7cbb6fad994862b8 Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Thu, 30 Oct 2025 14:31:24 -0700 Subject: [PATCH 04/12] update --- .../nv_tensorrt_rtx/nv_execution_provider.cc | 64 +++-- .../nv_tensorrt_rtx/nv_basic_test.cc | 51 ++++ .../test_nv_trt_rtx_ep_util.cc | 261 ++++++++++++++++++ .../nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.h | 3 + 4 files changed, 358 insertions(+), 21 deletions(-) diff --git a/onnxruntime/core/providers/nv_tensorrt_rtx/nv_execution_provider.cc b/onnxruntime/core/providers/nv_tensorrt_rtx/nv_execution_provider.cc index 62210d65848d1..3c6f6c9b82c83 100644 --- a/onnxruntime/core/providers/nv_tensorrt_rtx/nv_execution_provider.cc +++ b/onnxruntime/core/providers/nv_tensorrt_rtx/nv_execution_provider.cc @@ -1387,9 +1387,25 @@ std::unique_ptr NvExecutionProvider::GetSubGraph(SubGraph_t gra } // Find inputs and outputs of the subgraph + std::unique_ptr sub_graph = onnxruntime::IndexedSubGraph::Create(); - std::unordered_map original_inputs, fused_inputs, fused_outputs, fused_outputs_to_add, graph_outputs_to_add; + std::unordered_map original_inputs; + + // These maps store the inputs and outpus of the subgraph. + // Please note that the inputs and outputs of the maps will be dynamically updated during node iteration + // to determine the final inputs and outputs of the subgraph. + std::unordered_map fused_inputs, fused_outputs; + + // This map stores the node's output that will be consumed by another node outside of this subgraph. + // So the node's output should be put into the subgraph's output list. + std::unordered_map fused_outputs_to_add; + + // This map stores the node's output that is original graph's output. + // So the node's output should be put into the subgraph's output list. + std::unordered_map graph_outputs_to_add; + std::unordered_set erased; + int input_order = 0; int output_order = 0; @@ -1408,7 +1424,7 @@ std::unique_ptr NvExecutionProvider::GetSubGraph(SubGraph_t gra erased.insert(input); } else if (erased.find(input) == erased.end()) { // Only when input is neither in output list nor erased list, add the input to input list - fused_inputs[input] = input_order++; + fused_inputs.insert({input, input_order++}); } } @@ -1423,7 +1439,7 @@ std::unique_ptr NvExecutionProvider::GetSubGraph(SubGraph_t gra erased.insert(input); } else if (erased.find(input) == erased.end()) { // Only when input is neither in output list nor erased list, add the input to input list - fused_inputs[input] = input_order++; + fused_inputs.insert({input, input_order++}); } } @@ -1451,32 +1467,38 @@ std::unique_ptr NvExecutionProvider::GetSubGraph(SubGraph_t gra erased.insert(output); } else if (erased.find(output) == erased.end()) { if (graph_output_names.find(output->Name()) != graph_output_names.end()) { - graph_outputs_to_add[output] = output_order; + // This output is the graph's output. + // So the output should be put into the subgraph's output list. + graph_outputs_to_add.insert({output, output_order}); } - fused_outputs[output] = output_order++; + fused_outputs.insert({output, output_order++}); } } else { - fused_outputs_to_add[output] = output_order++; + // This output will be consumed by another node outside of this subgraph. + // So the output should be put into the subgraph's output list. + fused_outputs_to_add.insert({output, output_order++}); } } - } else { - for (const auto& output : node->OutputDefs()) { - const auto& it = fused_inputs.find(output); - if (it != fused_inputs.end()) { - fused_inputs.erase(it); - erased.insert(output); - } - // Only when output is neither in input list nor erased list, and the output is consumed by another node, add the output to output list - else if (erased.find(output) == erased.end()) { - if (graph_output_names.find(output->Name()) != graph_output_names.end()) { - graph_outputs_to_add[output] = output_order; - } + } - if (graph.GetGraph().GetConsumerNodes(output->Name()).size() > 0) { - fused_outputs[output] = output_order++; - } + for (const auto& output : node->OutputDefs()) { + const auto& it = fused_inputs.find(output); + if (it != fused_inputs.end()) { + fused_inputs.erase(it); + erased.insert(output); + } else if (erased.find(output) == erased.end()) { + if (graph.GetGraph().GetConsumerNodes(output->Name()).size() > 0) { + // Only when output is neither in input list nor erased list, + // and the output is consumed by another node, add the output to output list + fused_outputs.insert({output, output_order++}); } } + + if (graph_output_names.find(output->Name()) != graph_output_names.end()) { + // This output is the graph's output. + // So the output should be put into the subgraph's output list. + graph_outputs_to_add.insert({output, output_order++}); + } } } diff --git a/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc b/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc index d8cc56d738175..1e14ec61d638a 100644 --- a/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc +++ b/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc @@ -398,6 +398,57 @@ TEST(NvExecutionProviderTest, DataTransfer) { device_tensor = Ort::Value(); } +TEST(NvExecutionProviderTest, TestSessionOutputs) { + /* + * Model #1: + * + * "input" ---> TopK --- + * |---> "scores" + * |--- Less ---> "Less_output_0" + * |--- Div ---> "Div_output_0" + * |--- Mod ---> "labels" + */ + { + Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"}; + OrtTensorRTProviderOptionsV2 provider_options; + Ort::SessionOptions session_options; + session_options.AppendExecutionProvider_TensorRT_V2(provider_options); + + auto model_path = ORT_TSTR("model_with_topk_and_multiple_graph_outputs.onnx"); + Ort::Status status(CreateModelWithTopKWhichContainsGraphOutput(model_path)); + ASSERT_TRUE(status.IsOK()); + + Ort::Session session(env, model_path, session_options); + + size_t output_count = session.GetOutputCount(); + ASSERT_TRUE(output_count == 4); + } + + /* + * Model #2: + * + * "X" ---> Dropout ---> MatMul ---> "Y" + * ^ | + * | | + * "W" ------ ----> Can't be graph's output + * + */ + { + Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"}; + OrtTensorRTProviderOptionsV2 provider_options; + Ort::SessionOptions session_options; + session_options.AppendExecutionProvider_TensorRT_V2(provider_options); + + auto model_path = ORT_TSTR("model_with_node_output_not_used.onnx"); + Ort::Status status(CreateModelWithNodeOutputNotUsed(model_path)); + ASSERT_TRUE(status.IsOK()); + + Ort::Session session(env, model_path, session_options); + + size_t output_count = session.GetOutputCount(); + ASSERT_TRUE(output_count == 1); + } + #endif } // namespace test diff --git a/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.cc b/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.cc index 3a91fc1ba09bb..e2aaec7f097fb 100644 --- a/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.cc +++ b/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.cc @@ -464,5 +464,266 @@ Ort::IoBinding generate_io_binding( return binding; } +// Helper: make TensorProto +TensorProto MakeTensor(const std::string& name, + TensorProto::DataType dtype, + const std::vector& dims, + const std::vector& vals) { + TensorProto t; + t.set_name(name); + t.set_data_type(dtype); + for (auto d : dims) t.add_dims(d); + for (auto v : vals) t.add_int64_data(v); + return t; +} + +TensorProto MakeTensorFloat(const std::string& name, + const std::vector& dims, + const std::vector& vals) { + TensorProto t; + t.set_name(name); + t.set_data_type(TensorProto::FLOAT); + for (auto d : dims) t.add_dims(d); + for (auto v : vals) t.add_float_data(v); + return t; +} + +OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { + // -------------------- + // Create Model + // -------------------- + ModelProto model; + model.set_ir_version(ONNX_IR_VERSION); + auto* opset = model.add_opset_import(); + opset->set_domain(""); // empty = default ONNX domain + opset->set_version(OPSET_VERSION); + + GraphProto* graph = model.mutable_graph(); + graph->set_name("DropoutMatMulGraph"); + + // -------------------- + // Create Inputs + // X: [3, 2] + // W: [2, 3] + // -------------------- + { + auto* x = graph->add_input(); + x->set_name("X"); + + auto* type = x->mutable_type(); + auto* tt = type->mutable_tensor_type(); + tt->set_elem_type(TensorProto::FLOAT); + + auto* shape = tt->mutable_shape(); + shape->add_dim()->set_dim_value(3); + shape->add_dim()->set_dim_value(2); + } + + { + auto* w = graph->add_input(); + w->set_name("W"); + + auto* type = w->mutable_type(); + auto* tt = type->mutable_tensor_type(); + tt->set_elem_type(TensorProto::FLOAT); + + auto* shape = tt->mutable_shape(); + shape->add_dim()->set_dim_value(2); + shape->add_dim()->set_dim_value(3); + } + + // -------------------- + // Output Y: [2, 3] + // -------------------- + { + auto* x = graph->add_output(); + x->set_name("Y"); + + auto* type = x->mutable_type(); + auto* tt = type->mutable_tensor_type(); + tt->set_elem_type(TensorProto::FLOAT); + + auto* shape = tt->mutable_shape(); + shape->add_dim()->set_dim_value(2); + shape->add_dim()->set_dim_value(3); + } + + // -------------------- + // Dropout Node + // -------------------- + { + NodeProto* node = graph->add_node(); + node->set_name("DropoutNode"); + node->set_op_type("Dropout"); + + node->add_input("X"); + node->add_output("dropout_out"); + node->add_output("dropout_mask"); + } + + // -------------------- + // MatMul Node + // -------------------- + { + NodeProto* node = graph->add_node(); + node->set_name("MatMulNode"); + node->set_op_type("MatMul"); + + node->add_input("dropout_out"); + node->add_input("W"); + node->add_output("Y"); + } + + // -------------------- + // Validate + // -------------------- + try { + onnx::checker::check_model(model); + } catch (const std::exception& ex) { + std::string error_msg = "Model validation failed: " + std::string(ex.what()); + const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); + return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, error_msg.c_str()); + } + + std::ofstream ofs(model_name, std::ios::binary); + if (!model.SerializeToOstream(&ofs)) { + const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); + return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, "Failed to write model"); + } + + return nullptr; +} + +OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_name) { + ModelProto model; + model.set_ir_version(ONNX_IR_VERSION); + auto* opset = model.add_opset_import(); + opset->set_domain(""); // empty = default ONNX domain + opset->set_version(OPSET_VERSION); + + auto* graph = model.mutable_graph(); + graph->set_name("TopKGraph"); + + // ====================== + // ---- Model Input ---- + // ====================== + { + auto* inp = graph->add_input(); + inp->set_name("input"); + + auto* type = inp->mutable_type(); + auto* tt = type->mutable_tensor_type(); + tt->set_elem_type(TensorProto::FLOAT); + + // Shape: ["N"] + auto* shape = tt->mutable_shape(); + shape->add_dim()->set_dim_param("N"); + } + + // ====================== + // ---- Initializers ---- + // ====================== + { + // K = [300] + TensorProto K = MakeTensor("K", TensorProto::INT64, {1}, {300}); + *graph->add_initializer() = K; + + // zero = 0.0 (scalar) + TensorProto zero = MakeTensor("zero", TensorProto::INT64, {}, {0}); + *graph->add_initializer() = zero; + + // twenty_six = 26 (scalar) + TensorProto ts = MakeTensor("twenty_six", TensorProto::INT64, {}, {26}); + *graph->add_initializer() = ts; + } + + // ====================== + // ---- TopK ---- + // ====================== + { + NodeProto* n = graph->add_node(); + n->set_op_type("TopK"); + n->add_input("input"); + n->add_input("K"); + n->add_output("scores"); + n->add_output("topk_indices"); + n->set_name("TopK"); + } + + // ====================== + // ---- Less ---- + // ====================== + { + NodeProto* n = graph->add_node(); + n->set_op_type("Less"); + n->add_input("topk_indices"); + n->add_input("zero"); + n->add_output("Less_output_0"); + n->set_name("Less"); + } + + // ====================== + // ---- Div ---- + // ====================== + { + NodeProto* n = graph->add_node(); + n->set_op_type("Div"); + n->add_input("topk_indices"); + n->add_input("twenty_six"); + n->add_output("Div_17_output_0"); + n->set_name("Div"); + } + + // ====================== + // ---- Mod ---- + // ====================== + { + NodeProto* n = graph->add_node(); + n->set_op_type("Mod"); + n->add_input("topk_indices"); + n->add_input("twenty_six"); + n->add_output("labels"); + n->set_name("Mod"); + } + + // ========================= + // ---- Graph Outputs ---- + // ========================= + auto add_output = [&](const std::string& name, TensorProto::DataType type, const std::string& dim) { + auto* out = graph->add_output(); + out->set_name(name); + + auto* tt = out->mutable_type()->mutable_tensor_type(); + tt->set_elem_type(type); + + auto* shape = tt->mutable_shape(); + shape->add_dim()->set_dim_param(dim); + }; + + add_output("scores", TensorProto::FLOAT, "K"); + add_output("Less_output_0", TensorProto::BOOL, "K"); + add_output("Div_17_output_0", TensorProto::INT64, "K"); + add_output("labels", TensorProto::INT64, "K"); + + // ====================== + // Validate + Save + // ====================== + try { + onnx::checker::check_model(model); + } catch (const std::exception& e) { + std::string error_msg = "Model validation failed: " + std::string(e.what()); + const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); + return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, error_msg.c_str()); + } + + std::ofstream ofs(model_name, std::ios::binary); + if (!model.SerializeToOstream(&ofs)) { + const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); + return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, "Failed to write model"); + } + + return nullptr; +} + } // namespace test } // namespace onnxruntime diff --git a/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.h b/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.h index 0f011af8211ca..11000a76ad2cd 100644 --- a/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.h +++ b/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.h @@ -119,6 +119,9 @@ void CreateBaseModel(const PathString& model_name, void CreateLargeLLMModel(const PathString& model_path, const PathString& external_data_path); +OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_name); +OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name); + Ort::IoBinding generate_io_binding( Ort::Session& session, std::map> shape_overwrites = {}, From f763515ae67e23312c0c0b4b66cad8b3d63c76ae Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Thu, 30 Oct 2025 17:41:15 -0700 Subject: [PATCH 05/12] fix build issues --- .../nv_tensorrt_rtx/nv_basic_test.cc | 101 +++++++++--------- .../test_nv_trt_rtx_ep_util.cc | 72 +++++++------ .../providers/tensorrt/tensorrt_test_utils.cc | 66 ++++++------ .../providers/tensorrt/tensorrt_test_utils.h | 1 + 4 files changed, 123 insertions(+), 117 deletions(-) diff --git a/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc b/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc index 1e14ec61d638a..72b275c14ea3b 100644 --- a/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc +++ b/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc @@ -203,6 +203,56 @@ TEST_P(TypeTests, IOTypes) { } } +TEST(NvExecutionProviderTest, TestSessionOutputs) { + /* + * Model #1: + * + * "input" ---> TopK --- + * |---> "scores" + * |--- Less ---> "Less_output_0" + * |--- Div ---> "Div_output_0" + * |--- Mod ---> "labels" + */ + { + Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"}; + Ort::SessionOptions session_options; + session_options.AppendExecutionProvider(kNvTensorRTRTXExecutionProvider, {}); + + auto model_path = ORT_TSTR("model_with_topk_and_multiple_graph_outputs.onnx"); + Ort::Status status(CreateModelWithTopKWhichContainsGraphOutput(model_path)); + ASSERT_TRUE(status.IsOK()); + + Ort::Session session(env, model_path, session_options); + + size_t output_count = session.GetOutputCount(); + ASSERT_TRUE(output_count == 4); + } + + /* + * Model #2: + * + * "X" ---> Dropout ---> MatMul ---> "Y" + * ^ | + * | | + * "W" ------ ----> Can't be graph's output + * + */ + { + Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"}; + Ort::SessionOptions session_options; + session_options.AppendExecutionProvider(kNvTensorRTRTXExecutionProvider, {}); + + auto model_path = ORT_TSTR("model_with_node_output_not_used.onnx"); + Ort::Status status(CreateModelWithNodeOutputNotUsed(model_path)); + ASSERT_TRUE(status.IsOK()); + + Ort::Session session(env, model_path, session_options); + + size_t output_count = session.GetOutputCount(); + ASSERT_TRUE(output_count == 1); + } +} + INSTANTIATE_TEST_SUITE_P(NvExecutionProviderTest, TypeTests, ::testing::Values(ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT, ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT16, @@ -398,57 +448,6 @@ TEST(NvExecutionProviderTest, DataTransfer) { device_tensor = Ort::Value(); } -TEST(NvExecutionProviderTest, TestSessionOutputs) { - /* - * Model #1: - * - * "input" ---> TopK --- - * |---> "scores" - * |--- Less ---> "Less_output_0" - * |--- Div ---> "Div_output_0" - * |--- Mod ---> "labels" - */ - { - Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"}; - OrtTensorRTProviderOptionsV2 provider_options; - Ort::SessionOptions session_options; - session_options.AppendExecutionProvider_TensorRT_V2(provider_options); - - auto model_path = ORT_TSTR("model_with_topk_and_multiple_graph_outputs.onnx"); - Ort::Status status(CreateModelWithTopKWhichContainsGraphOutput(model_path)); - ASSERT_TRUE(status.IsOK()); - - Ort::Session session(env, model_path, session_options); - - size_t output_count = session.GetOutputCount(); - ASSERT_TRUE(output_count == 4); - } - - /* - * Model #2: - * - * "X" ---> Dropout ---> MatMul ---> "Y" - * ^ | - * | | - * "W" ------ ----> Can't be graph's output - * - */ - { - Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"}; - OrtTensorRTProviderOptionsV2 provider_options; - Ort::SessionOptions session_options; - session_options.AppendExecutionProvider_TensorRT_V2(provider_options); - - auto model_path = ORT_TSTR("model_with_node_output_not_used.onnx"); - Ort::Status status(CreateModelWithNodeOutputNotUsed(model_path)); - ASSERT_TRUE(status.IsOK()); - - Ort::Session session(env, model_path, session_options); - - size_t output_count = session.GetOutputCount(); - ASSERT_TRUE(output_count == 1); - } - #endif } // namespace test diff --git a/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.cc b/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.cc index e2aaec7f097fb..79cc2fef42666 100644 --- a/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.cc +++ b/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.cc @@ -19,6 +19,14 @@ #include "test/common/trt_op_test_utils.h" #include "test/providers/provider_test_utils.h" #include "test/unittest_util/framework_test_utils.h" +#include +#include +#include +#include +#include + +#define ONNX_IR_VERSION 11 +#define OPSET_VERSION 23 namespace onnxruntime { namespace test { @@ -464,12 +472,12 @@ Ort::IoBinding generate_io_binding( return binding; } -// Helper: make TensorProto -TensorProto MakeTensor(const std::string& name, - TensorProto::DataType dtype, - const std::vector& dims, - const std::vector& vals) { - TensorProto t; +// Helper: make ONNX_NAMESPACE::TensorProto +ONNX_NAMESPACE::TensorProto MakeTensor(const std::string& name, + ONNX_NAMESPACE::TensorProto::DataType dtype, + const std::vector& dims, + const std::vector& vals) { + ONNX_NAMESPACE::TensorProto t; t.set_name(name); t.set_data_type(dtype); for (auto d : dims) t.add_dims(d); @@ -477,12 +485,12 @@ TensorProto MakeTensor(const std::string& name, return t; } -TensorProto MakeTensorFloat(const std::string& name, - const std::vector& dims, - const std::vector& vals) { - TensorProto t; +ONNX_NAMESPACE::TensorProto MakeTensorFloat(const std::string& name, + const std::vector& dims, + const std::vector& vals) { + ONNX_NAMESPACE::TensorProto t; t.set_name(name); - t.set_data_type(TensorProto::FLOAT); + t.set_data_type(ONNX_NAMESPACE::TensorProto::FLOAT); for (auto d : dims) t.add_dims(d); for (auto v : vals) t.add_float_data(v); return t; @@ -492,13 +500,13 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { // -------------------- // Create Model // -------------------- - ModelProto model; + ONNX_NAMESPACE::ModelProto model; model.set_ir_version(ONNX_IR_VERSION); auto* opset = model.add_opset_import(); opset->set_domain(""); // empty = default ONNX domain opset->set_version(OPSET_VERSION); - GraphProto* graph = model.mutable_graph(); + ONNX_NAMESPACE::GraphProto* graph = model.mutable_graph(); graph->set_name("DropoutMatMulGraph"); // -------------------- @@ -512,7 +520,7 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { auto* type = x->mutable_type(); auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(TensorProto::FLOAT); + tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); auto* shape = tt->mutable_shape(); shape->add_dim()->set_dim_value(3); @@ -525,7 +533,7 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { auto* type = w->mutable_type(); auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(TensorProto::FLOAT); + tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); auto* shape = tt->mutable_shape(); shape->add_dim()->set_dim_value(2); @@ -541,7 +549,7 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { auto* type = x->mutable_type(); auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(TensorProto::FLOAT); + tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); auto* shape = tt->mutable_shape(); shape->add_dim()->set_dim_value(2); @@ -552,7 +560,7 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { // Dropout Node // -------------------- { - NodeProto* node = graph->add_node(); + ONNX_NAMESPACE::NodeProto* node = graph->add_node(); node->set_name("DropoutNode"); node->set_op_type("Dropout"); @@ -565,7 +573,7 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { // MatMul Node // -------------------- { - NodeProto* node = graph->add_node(); + ONNX_NAMESPACE::NodeProto* node = graph->add_node(); node->set_name("MatMulNode"); node->set_op_type("MatMul"); @@ -595,7 +603,7 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { } OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_name) { - ModelProto model; + ONNX_NAMESPACE::ModelProto model; model.set_ir_version(ONNX_IR_VERSION); auto* opset = model.add_opset_import(); opset->set_domain(""); // empty = default ONNX domain @@ -613,7 +621,7 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n auto* type = inp->mutable_type(); auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(TensorProto::FLOAT); + tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); // Shape: ["N"] auto* shape = tt->mutable_shape(); @@ -625,15 +633,15 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n // ====================== { // K = [300] - TensorProto K = MakeTensor("K", TensorProto::INT64, {1}, {300}); + ONNX_NAMESPACE::TensorProto K = MakeTensor("K", ONNX_NAMESPACE::TensorProto::INT64, {1}, {300}); *graph->add_initializer() = K; // zero = 0.0 (scalar) - TensorProto zero = MakeTensor("zero", TensorProto::INT64, {}, {0}); + ONNX_NAMESPACE::TensorProto zero = MakeTensor("zero", ONNX_NAMESPACE::TensorProto::INT64, {}, {0}); *graph->add_initializer() = zero; // twenty_six = 26 (scalar) - TensorProto ts = MakeTensor("twenty_six", TensorProto::INT64, {}, {26}); + ONNX_NAMESPACE::TensorProto ts = MakeTensor("twenty_six", ONNX_NAMESPACE::TensorProto::INT64, {}, {26}); *graph->add_initializer() = ts; } @@ -641,7 +649,7 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n // ---- TopK ---- // ====================== { - NodeProto* n = graph->add_node(); + ONNX_NAMESPACE::NodeProto* n = graph->add_node(); n->set_op_type("TopK"); n->add_input("input"); n->add_input("K"); @@ -654,7 +662,7 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n // ---- Less ---- // ====================== { - NodeProto* n = graph->add_node(); + ONNX_NAMESPACE::NodeProto* n = graph->add_node(); n->set_op_type("Less"); n->add_input("topk_indices"); n->add_input("zero"); @@ -666,7 +674,7 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n // ---- Div ---- // ====================== { - NodeProto* n = graph->add_node(); + ONNX_NAMESPACE::NodeProto* n = graph->add_node(); n->set_op_type("Div"); n->add_input("topk_indices"); n->add_input("twenty_six"); @@ -678,7 +686,7 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n // ---- Mod ---- // ====================== { - NodeProto* n = graph->add_node(); + ONNX_NAMESPACE::NodeProto* n = graph->add_node(); n->set_op_type("Mod"); n->add_input("topk_indices"); n->add_input("twenty_six"); @@ -689,7 +697,7 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n // ========================= // ---- Graph Outputs ---- // ========================= - auto add_output = [&](const std::string& name, TensorProto::DataType type, const std::string& dim) { + auto add_output = [&](const std::string& name, ONNX_NAMESPACE::TensorProto::DataType type, const std::string& dim) { auto* out = graph->add_output(); out->set_name(name); @@ -700,10 +708,10 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n shape->add_dim()->set_dim_param(dim); }; - add_output("scores", TensorProto::FLOAT, "K"); - add_output("Less_output_0", TensorProto::BOOL, "K"); - add_output("Div_17_output_0", TensorProto::INT64, "K"); - add_output("labels", TensorProto::INT64, "K"); + add_output("scores", ONNX_NAMESPACE::TensorProto::FLOAT, "K"); + add_output("Less_output_0", ONNX_NAMESPACE::TensorProto::BOOL, "K"); + add_output("Div_17_output_0", ONNX_NAMESPACE::TensorProto::INT64, "K"); + add_output("labels", ONNX_NAMESPACE::TensorProto::INT64, "K"); // ====================== // Validate + Save diff --git a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc index 18b66f85ec34f..43e68e1879d34 100644 --- a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc +++ b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc @@ -12,20 +12,18 @@ #include #include -using namespace ONNX_NAMESPACE; - #define ONNX_IR_VERSION 11 #define OPSET_VERSION 23 namespace onnxruntime { namespace test { -// Helper: make TensorProto -TensorProto MakeTensor(const std::string& name, - TensorProto::DataType dtype, - const std::vector& dims, - const std::vector& vals) { - TensorProto t; +// Helper: make ONNX_NAMESPACE::TensorProto +ONNX_NAMESPACE::TensorProto MakeTensor(const std::string& name, + ONNX_NAMESPACE::TensorProto::DataType dtype, + const std::vector& dims, + const std::vector& vals) { + ONNX_NAMESPACE::TensorProto t; t.set_name(name); t.set_data_type(dtype); for (auto d : dims) t.add_dims(d); @@ -33,12 +31,12 @@ TensorProto MakeTensor(const std::string& name, return t; } -TensorProto MakeTensorFloat(const std::string& name, - const std::vector& dims, - const std::vector& vals) { - TensorProto t; +ONNX_NAMESPACE::TensorProto MakeTensorFloat(const std::string& name, + const std::vector& dims, + const std::vector& vals) { + ONNX_NAMESPACE::TensorProto t; t.set_name(name); - t.set_data_type(TensorProto::FLOAT); + t.set_data_type(ONNX_NAMESPACE::TensorProto::FLOAT); for (auto d : dims) t.add_dims(d); for (auto v : vals) t.add_float_data(v); return t; @@ -48,13 +46,13 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { // -------------------- // Create Model // -------------------- - ModelProto model; + ONNX_NAMESPACE::ModelProto model; model.set_ir_version(ONNX_IR_VERSION); auto* opset = model.add_opset_import(); opset->set_domain(""); // empty = default ONNX domain opset->set_version(OPSET_VERSION); - GraphProto* graph = model.mutable_graph(); + ONNX_NAMESPACE::GraphProto* graph = model.mutable_graph(); graph->set_name("DropoutMatMulGraph"); // -------------------- @@ -68,7 +66,7 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { auto* type = x->mutable_type(); auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(TensorProto::FLOAT); + tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); auto* shape = tt->mutable_shape(); shape->add_dim()->set_dim_value(3); @@ -81,7 +79,7 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { auto* type = w->mutable_type(); auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(TensorProto::FLOAT); + tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); auto* shape = tt->mutable_shape(); shape->add_dim()->set_dim_value(2); @@ -97,7 +95,7 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { auto* type = x->mutable_type(); auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(TensorProto::FLOAT); + tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); auto* shape = tt->mutable_shape(); shape->add_dim()->set_dim_value(2); @@ -108,7 +106,7 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { // Dropout Node // -------------------- { - NodeProto* node = graph->add_node(); + ONNX_NAMESPACE::NodeProto* node = graph->add_node(); node->set_name("DropoutNode"); node->set_op_type("Dropout"); @@ -121,7 +119,7 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { // MatMul Node // -------------------- { - NodeProto* node = graph->add_node(); + ONNX_NAMESPACE::NodeProto* node = graph->add_node(); node->set_name("MatMulNode"); node->set_op_type("MatMul"); @@ -151,7 +149,7 @@ OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { } OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_name) { - ModelProto model; + ONNX_NAMESPACE::ModelProto model; model.set_ir_version(ONNX_IR_VERSION); auto* opset = model.add_opset_import(); opset->set_domain(""); // empty = default ONNX domain @@ -169,7 +167,7 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n auto* type = inp->mutable_type(); auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(TensorProto::FLOAT); + tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); // Shape: ["N"] auto* shape = tt->mutable_shape(); @@ -181,15 +179,15 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n // ====================== { // K = [300] - TensorProto K = MakeTensor("K", TensorProto::INT64, {1}, {300}); + ONNX_NAMESPACE::TensorProto K = MakeTensor("K", ONNX_NAMESPACE::TensorProto::INT64, {1}, {300}); *graph->add_initializer() = K; // zero = 0.0 (scalar) - TensorProto zero = MakeTensor("zero", TensorProto::INT64, {}, {0}); + ONNX_NAMESPACE::TensorProto zero = MakeTensor("zero", ONNX_NAMESPACE::TensorProto::INT64, {}, {0}); *graph->add_initializer() = zero; // twenty_six = 26 (scalar) - TensorProto ts = MakeTensor("twenty_six", TensorProto::INT64, {}, {26}); + ONNX_NAMESPACE::TensorProto ts = MakeTensor("twenty_six", ONNX_NAMESPACE::TensorProto::INT64, {}, {26}); *graph->add_initializer() = ts; } @@ -197,7 +195,7 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n // ---- TopK ---- // ====================== { - NodeProto* n = graph->add_node(); + ONNX_NAMESPACE::NodeProto* n = graph->add_node(); n->set_op_type("TopK"); n->add_input("input"); n->add_input("K"); @@ -210,7 +208,7 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n // ---- Less ---- // ====================== { - NodeProto* n = graph->add_node(); + ONNX_NAMESPACE::NodeProto* n = graph->add_node(); n->set_op_type("Less"); n->add_input("topk_indices"); n->add_input("zero"); @@ -222,7 +220,7 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n // ---- Div ---- // ====================== { - NodeProto* n = graph->add_node(); + ONNX_NAMESPACE::NodeProto* n = graph->add_node(); n->set_op_type("Div"); n->add_input("topk_indices"); n->add_input("twenty_six"); @@ -234,7 +232,7 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n // ---- Mod ---- // ====================== { - NodeProto* n = graph->add_node(); + ONNX_NAMESPACE::NodeProto* n = graph->add_node(); n->set_op_type("Mod"); n->add_input("topk_indices"); n->add_input("twenty_six"); @@ -245,7 +243,7 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n // ========================= // ---- Graph Outputs ---- // ========================= - auto add_output = [&](const std::string& name, TensorProto::DataType type, const std::string& dim) { + auto add_output = [&](const std::string& name, ONNX_NAMESPACE::TensorProto::DataType type, const std::string& dim) { auto* out = graph->add_output(); out->set_name(name); @@ -256,10 +254,10 @@ OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_n shape->add_dim()->set_dim_param(dim); }; - add_output("scores", TensorProto::FLOAT, "K"); - add_output("Less_output_0", TensorProto::BOOL, "K"); - add_output("Div_17_output_0", TensorProto::INT64, "K"); - add_output("labels", TensorProto::INT64, "K"); + add_output("scores", ONNX_NAMESPACE::TensorProto::FLOAT, "K"); + add_output("Less_output_0", ONNX_NAMESPACE::TensorProto::BOOL, "K"); + add_output("Div_17_output_0", ONNX_NAMESPACE::TensorProto::INT64, "K"); + add_output("labels", ONNX_NAMESPACE::TensorProto::INT64, "K"); // ====================== // Validate + Save diff --git a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h index f13ccae413d31..3857d8ee80131 100644 --- a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h +++ b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. #include "onnxruntime_cxx_api.h" +#include "core/common/path_string.h" namespace onnxruntime { namespace test { From 186c938c014019b2ca5d80320631db6419bc687c Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Fri, 31 Oct 2025 12:30:11 -0700 Subject: [PATCH 06/12] fix build warning --- onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc index 43e68e1879d34..51738342c6cb0 100644 --- a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc +++ b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc @@ -1,6 +1,5 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -#pragma once #include "onnxruntime_cxx_api.h" #include "core/common/path_string.h" From fe795311303eafe872be26e7d1eee81b143fee07 Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Thu, 20 Nov 2025 10:36:12 -0800 Subject: [PATCH 07/12] add comments and refactor the logic of adding graph's outputs --- .../nv_tensorrt_rtx/nv_execution_provider.cc | 21 +++++++------------ .../tensorrt/tensorrt_execution_provider.cc | 21 +++++++------------ 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/onnxruntime/core/providers/nv_tensorrt_rtx/nv_execution_provider.cc b/onnxruntime/core/providers/nv_tensorrt_rtx/nv_execution_provider.cc index 3c6f6c9b82c83..d49621bfe700e 100644 --- a/onnxruntime/core/providers/nv_tensorrt_rtx/nv_execution_provider.cc +++ b/onnxruntime/core/providers/nv_tensorrt_rtx/nv_execution_provider.cc @@ -1406,6 +1406,11 @@ std::unique_ptr NvExecutionProvider::GetSubGraph(SubGraph_t gra std::unordered_set erased; + // This is the relative ordering that ensures node's input or output being added to the 'fused_inputs', + // 'fused_outputs', 'fused_outputs_to_add' and 'graph_outputs_to_add' maps is associated with a relative order index. + // Items added earlier receive a smaller order index than items added later. + // When constructing the final sub_graph's input or output lists, entries with smaller + // order indices will appear before those with larger indices. int input_order = 0; int output_order = 0; @@ -1460,20 +1465,8 @@ std::unique_ptr NvExecutionProvider::GetSubGraph(SubGraph_t gra } else { output = (it->GetNode()).ImplicitInputDefs()[it->GetDstArgIndex() - static_cast(it->GetNode().InputDefs().size())]; } - if (node_set.find(node_idx) != node_set.end()) { - const auto& iter = fused_inputs.find(output); - if (iter != fused_inputs.end()) { - fused_inputs.erase(iter); - erased.insert(output); - } else if (erased.find(output) == erased.end()) { - if (graph_output_names.find(output->Name()) != graph_output_names.end()) { - // This output is the graph's output. - // So the output should be put into the subgraph's output list. - graph_outputs_to_add.insert({output, output_order}); - } - fused_outputs.insert({output, output_order++}); - } - } else { + + if (node_set.find(node_idx) == node_set.end()) { // This output will be consumed by another node outside of this subgraph. // So the output should be put into the subgraph's output list. fused_outputs_to_add.insert({output, output_order++}); diff --git a/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc b/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc index 932253ff1b634..0b92a4f648c80 100644 --- a/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc +++ b/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc @@ -2054,6 +2054,11 @@ std::unique_ptr TensorrtExecutionProvider::GetSubGraph(SubGraph std::unordered_set erased; + // This is the relative ordering that ensures node's input or output being added to the 'fused_inputs', + // 'fused_outputs', 'fused_outputs_to_add' and 'graph_outputs_to_add' maps is associated with a relative order index. + // Items added earlier receive a smaller order index than items added later. + // When constructing the final sub_graph's input or output lists, entries with smaller + // order indices will appear before those with larger indices. int input_order = 0; int output_order = 0; @@ -2108,20 +2113,8 @@ std::unique_ptr TensorrtExecutionProvider::GetSubGraph(SubGraph } else { output = (it->GetNode()).ImplicitInputDefs()[it->GetDstArgIndex() - static_cast(it->GetNode().InputDefs().size())]; } - if (node_set.find(node_idx) != node_set.end()) { - const auto& iter = fused_inputs.find(output); - if (iter != fused_inputs.end()) { - fused_inputs.erase(iter); - erased.insert(output); - } else if (erased.find(output) == erased.end()) { - if (graph_output_names.find(output->Name()) != graph_output_names.end()) { - // This output is the graph's output. - // So the output should be put into the subgraph's output list. - graph_outputs_to_add.insert({output, output_order}); - } - fused_outputs.insert({output, output_order++}); - } - } else { + + if (node_set.find(node_idx) == node_set.end()) { // This output will be consumed by another node outside of this subgraph. // So the output should be put into the subgraph's output list. fused_outputs_to_add.insert({output, output_order++}); From aef06028e034c16dc7f01ca82cdc74b5ce3c7097 Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Thu, 20 Nov 2025 10:47:58 -0800 Subject: [PATCH 08/12] fix typo --- .../core/providers/nv_tensorrt_rtx/nv_execution_provider.cc | 2 +- .../core/providers/tensorrt/tensorrt_execution_provider.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/onnxruntime/core/providers/nv_tensorrt_rtx/nv_execution_provider.cc b/onnxruntime/core/providers/nv_tensorrt_rtx/nv_execution_provider.cc index d49621bfe700e..0e683db1c0d53 100644 --- a/onnxruntime/core/providers/nv_tensorrt_rtx/nv_execution_provider.cc +++ b/onnxruntime/core/providers/nv_tensorrt_rtx/nv_execution_provider.cc @@ -1391,7 +1391,7 @@ std::unique_ptr NvExecutionProvider::GetSubGraph(SubGraph_t gra std::unique_ptr sub_graph = onnxruntime::IndexedSubGraph::Create(); std::unordered_map original_inputs; - // These maps store the inputs and outpus of the subgraph. + // These maps store the inputs and outputs of the subgraph. // Please note that the inputs and outputs of the maps will be dynamically updated during node iteration // to determine the final inputs and outputs of the subgraph. std::unordered_map fused_inputs, fused_outputs; diff --git a/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc b/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc index 0b92a4f648c80..e5b48da33fbc3 100644 --- a/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc +++ b/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc @@ -2039,7 +2039,7 @@ std::unique_ptr TensorrtExecutionProvider::GetSubGraph(SubGraph std::unique_ptr sub_graph = onnxruntime::IndexedSubGraph::Create(); std::unordered_map original_inputs; - // These maps store the inputs and outpus of the subgraph. + // These maps store the inputs and outputs of the subgraph. // Please note that the inputs and outputs of the maps will be dynamically updated during node iteration // to determine the final inputs and outputs of the subgraph. std::unordered_map fused_inputs, fused_outputs; From f169747c9d37e11a620f3bcfd3a6e5f5408b630a Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Thu, 20 Nov 2025 11:27:23 -0800 Subject: [PATCH 09/12] address reviewer's comments --- .../nv_tensorrt_rtx/nv_basic_test.cc | 16 +- .../test_nv_trt_rtx_ep_util.cc | 269 ----------------- .../nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.h | 3 - .../providers/tensorrt/tensorrt_basic_test.cc | 18 +- .../providers/tensorrt/tensorrt_test_utils.cc | 281 ------------------ .../providers/tensorrt/tensorrt_test_utils.h | 11 - .../test/testdata/node_output_not_used.onnx | Bin 0 -> 189 bytes .../test/testdata/node_output_not_used.py | 42 +++ .../topk_and_multiple_graph_outputs.onnx | Bin 0 -> 393 bytes .../topk_and_multiple_graph_outputs.py | 86 ++++++ 10 files changed, 138 insertions(+), 588 deletions(-) delete mode 100644 onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc delete mode 100644 onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h create mode 100644 onnxruntime/test/testdata/node_output_not_used.onnx create mode 100644 onnxruntime/test/testdata/node_output_not_used.py create mode 100644 onnxruntime/test/testdata/topk_and_multiple_graph_outputs.onnx create mode 100644 onnxruntime/test/testdata/topk_and_multiple_graph_outputs.py diff --git a/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc b/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc index 72b275c14ea3b..af9706855ee3c 100644 --- a/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc +++ b/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc @@ -214,15 +214,11 @@ TEST(NvExecutionProviderTest, TestSessionOutputs) { * |--- Mod ---> "labels" */ { - Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"}; Ort::SessionOptions session_options; session_options.AppendExecutionProvider(kNvTensorRTRTXExecutionProvider, {}); - auto model_path = ORT_TSTR("model_with_topk_and_multiple_graph_outputs.onnx"); - Ort::Status status(CreateModelWithTopKWhichContainsGraphOutput(model_path)); - ASSERT_TRUE(status.IsOK()); - - Ort::Session session(env, model_path, session_options); + auto model_path = ORT_TSTR("testdata/topk_and_multiple_graph_outputs.onnx"); + Ort::Session session(*ort_env, model_path, session_options); size_t output_count = session.GetOutputCount(); ASSERT_TRUE(output_count == 4); @@ -238,15 +234,11 @@ TEST(NvExecutionProviderTest, TestSessionOutputs) { * */ { - Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"}; Ort::SessionOptions session_options; session_options.AppendExecutionProvider(kNvTensorRTRTXExecutionProvider, {}); - auto model_path = ORT_TSTR("model_with_node_output_not_used.onnx"); - Ort::Status status(CreateModelWithNodeOutputNotUsed(model_path)); - ASSERT_TRUE(status.IsOK()); - - Ort::Session session(env, model_path, session_options); + auto model_path = ORT_TSTR("testdata/node_output_not_used.onnx"); + Ort::Session session(*ort_env, model_path, session_options); size_t output_count = session.GetOutputCount(); ASSERT_TRUE(output_count == 1); diff --git a/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.cc b/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.cc index 79cc2fef42666..3a91fc1ba09bb 100644 --- a/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.cc +++ b/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.cc @@ -19,14 +19,6 @@ #include "test/common/trt_op_test_utils.h" #include "test/providers/provider_test_utils.h" #include "test/unittest_util/framework_test_utils.h" -#include -#include -#include -#include -#include - -#define ONNX_IR_VERSION 11 -#define OPSET_VERSION 23 namespace onnxruntime { namespace test { @@ -472,266 +464,5 @@ Ort::IoBinding generate_io_binding( return binding; } -// Helper: make ONNX_NAMESPACE::TensorProto -ONNX_NAMESPACE::TensorProto MakeTensor(const std::string& name, - ONNX_NAMESPACE::TensorProto::DataType dtype, - const std::vector& dims, - const std::vector& vals) { - ONNX_NAMESPACE::TensorProto t; - t.set_name(name); - t.set_data_type(dtype); - for (auto d : dims) t.add_dims(d); - for (auto v : vals) t.add_int64_data(v); - return t; -} - -ONNX_NAMESPACE::TensorProto MakeTensorFloat(const std::string& name, - const std::vector& dims, - const std::vector& vals) { - ONNX_NAMESPACE::TensorProto t; - t.set_name(name); - t.set_data_type(ONNX_NAMESPACE::TensorProto::FLOAT); - for (auto d : dims) t.add_dims(d); - for (auto v : vals) t.add_float_data(v); - return t; -} - -OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { - // -------------------- - // Create Model - // -------------------- - ONNX_NAMESPACE::ModelProto model; - model.set_ir_version(ONNX_IR_VERSION); - auto* opset = model.add_opset_import(); - opset->set_domain(""); // empty = default ONNX domain - opset->set_version(OPSET_VERSION); - - ONNX_NAMESPACE::GraphProto* graph = model.mutable_graph(); - graph->set_name("DropoutMatMulGraph"); - - // -------------------- - // Create Inputs - // X: [3, 2] - // W: [2, 3] - // -------------------- - { - auto* x = graph->add_input(); - x->set_name("X"); - - auto* type = x->mutable_type(); - auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); - - auto* shape = tt->mutable_shape(); - shape->add_dim()->set_dim_value(3); - shape->add_dim()->set_dim_value(2); - } - - { - auto* w = graph->add_input(); - w->set_name("W"); - - auto* type = w->mutable_type(); - auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); - - auto* shape = tt->mutable_shape(); - shape->add_dim()->set_dim_value(2); - shape->add_dim()->set_dim_value(3); - } - - // -------------------- - // Output Y: [2, 3] - // -------------------- - { - auto* x = graph->add_output(); - x->set_name("Y"); - - auto* type = x->mutable_type(); - auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); - - auto* shape = tt->mutable_shape(); - shape->add_dim()->set_dim_value(2); - shape->add_dim()->set_dim_value(3); - } - - // -------------------- - // Dropout Node - // -------------------- - { - ONNX_NAMESPACE::NodeProto* node = graph->add_node(); - node->set_name("DropoutNode"); - node->set_op_type("Dropout"); - - node->add_input("X"); - node->add_output("dropout_out"); - node->add_output("dropout_mask"); - } - - // -------------------- - // MatMul Node - // -------------------- - { - ONNX_NAMESPACE::NodeProto* node = graph->add_node(); - node->set_name("MatMulNode"); - node->set_op_type("MatMul"); - - node->add_input("dropout_out"); - node->add_input("W"); - node->add_output("Y"); - } - - // -------------------- - // Validate - // -------------------- - try { - onnx::checker::check_model(model); - } catch (const std::exception& ex) { - std::string error_msg = "Model validation failed: " + std::string(ex.what()); - const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); - return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, error_msg.c_str()); - } - - std::ofstream ofs(model_name, std::ios::binary); - if (!model.SerializeToOstream(&ofs)) { - const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); - return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, "Failed to write model"); - } - - return nullptr; -} - -OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_name) { - ONNX_NAMESPACE::ModelProto model; - model.set_ir_version(ONNX_IR_VERSION); - auto* opset = model.add_opset_import(); - opset->set_domain(""); // empty = default ONNX domain - opset->set_version(OPSET_VERSION); - - auto* graph = model.mutable_graph(); - graph->set_name("TopKGraph"); - - // ====================== - // ---- Model Input ---- - // ====================== - { - auto* inp = graph->add_input(); - inp->set_name("input"); - - auto* type = inp->mutable_type(); - auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); - - // Shape: ["N"] - auto* shape = tt->mutable_shape(); - shape->add_dim()->set_dim_param("N"); - } - - // ====================== - // ---- Initializers ---- - // ====================== - { - // K = [300] - ONNX_NAMESPACE::TensorProto K = MakeTensor("K", ONNX_NAMESPACE::TensorProto::INT64, {1}, {300}); - *graph->add_initializer() = K; - - // zero = 0.0 (scalar) - ONNX_NAMESPACE::TensorProto zero = MakeTensor("zero", ONNX_NAMESPACE::TensorProto::INT64, {}, {0}); - *graph->add_initializer() = zero; - - // twenty_six = 26 (scalar) - ONNX_NAMESPACE::TensorProto ts = MakeTensor("twenty_six", ONNX_NAMESPACE::TensorProto::INT64, {}, {26}); - *graph->add_initializer() = ts; - } - - // ====================== - // ---- TopK ---- - // ====================== - { - ONNX_NAMESPACE::NodeProto* n = graph->add_node(); - n->set_op_type("TopK"); - n->add_input("input"); - n->add_input("K"); - n->add_output("scores"); - n->add_output("topk_indices"); - n->set_name("TopK"); - } - - // ====================== - // ---- Less ---- - // ====================== - { - ONNX_NAMESPACE::NodeProto* n = graph->add_node(); - n->set_op_type("Less"); - n->add_input("topk_indices"); - n->add_input("zero"); - n->add_output("Less_output_0"); - n->set_name("Less"); - } - - // ====================== - // ---- Div ---- - // ====================== - { - ONNX_NAMESPACE::NodeProto* n = graph->add_node(); - n->set_op_type("Div"); - n->add_input("topk_indices"); - n->add_input("twenty_six"); - n->add_output("Div_17_output_0"); - n->set_name("Div"); - } - - // ====================== - // ---- Mod ---- - // ====================== - { - ONNX_NAMESPACE::NodeProto* n = graph->add_node(); - n->set_op_type("Mod"); - n->add_input("topk_indices"); - n->add_input("twenty_six"); - n->add_output("labels"); - n->set_name("Mod"); - } - - // ========================= - // ---- Graph Outputs ---- - // ========================= - auto add_output = [&](const std::string& name, ONNX_NAMESPACE::TensorProto::DataType type, const std::string& dim) { - auto* out = graph->add_output(); - out->set_name(name); - - auto* tt = out->mutable_type()->mutable_tensor_type(); - tt->set_elem_type(type); - - auto* shape = tt->mutable_shape(); - shape->add_dim()->set_dim_param(dim); - }; - - add_output("scores", ONNX_NAMESPACE::TensorProto::FLOAT, "K"); - add_output("Less_output_0", ONNX_NAMESPACE::TensorProto::BOOL, "K"); - add_output("Div_17_output_0", ONNX_NAMESPACE::TensorProto::INT64, "K"); - add_output("labels", ONNX_NAMESPACE::TensorProto::INT64, "K"); - - // ====================== - // Validate + Save - // ====================== - try { - onnx::checker::check_model(model); - } catch (const std::exception& e) { - std::string error_msg = "Model validation failed: " + std::string(e.what()); - const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); - return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, error_msg.c_str()); - } - - std::ofstream ofs(model_name, std::ios::binary); - if (!model.SerializeToOstream(&ofs)) { - const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); - return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, "Failed to write model"); - } - - return nullptr; -} - } // namespace test } // namespace onnxruntime diff --git a/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.h b/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.h index 11000a76ad2cd..0f011af8211ca 100644 --- a/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.h +++ b/onnxruntime/test/providers/nv_tensorrt_rtx/test_nv_trt_rtx_ep_util.h @@ -119,9 +119,6 @@ void CreateBaseModel(const PathString& model_name, void CreateLargeLLMModel(const PathString& model_path, const PathString& external_data_path); -OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_name); -OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name); - Ort::IoBinding generate_io_binding( Ort::Session& session, std::map> shape_overwrites = {}, diff --git a/onnxruntime/test/providers/tensorrt/tensorrt_basic_test.cc b/onnxruntime/test/providers/tensorrt/tensorrt_basic_test.cc index a0149613c21c3..ac5f974c4a14f 100644 --- a/onnxruntime/test/providers/tensorrt/tensorrt_basic_test.cc +++ b/onnxruntime/test/providers/tensorrt/tensorrt_basic_test.cc @@ -20,6 +20,8 @@ using namespace std; using namespace ONNX_NAMESPACE; using namespace ::onnxruntime::logging; +extern std::unique_ptr ort_env; + namespace onnxruntime { namespace test { @@ -1372,16 +1374,12 @@ TEST(TensorrtExecutionProviderTest, TestSessionOutputs) { * |--- Mod ---> "labels" */ { - Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"}; OrtTensorRTProviderOptionsV2 provider_options; Ort::SessionOptions session_options; session_options.AppendExecutionProvider_TensorRT_V2(provider_options); - auto model_path = ORT_TSTR("model_with_topk_and_multiple_graph_outputs.onnx"); - Ort::Status status(CreateModelWithTopKWhichContainsGraphOutput(model_path)); - ASSERT_TRUE(status.IsOK()); - - Ort::Session session(env, model_path, session_options); + auto model_path = ORT_TSTR("testdata/topk_and_multiple_graph_outputs.onnx"); + Ort::Session session(*ort_env, model_path, session_options); size_t output_count = session.GetOutputCount(); ASSERT_TRUE(output_count == 4); @@ -1397,16 +1395,12 @@ TEST(TensorrtExecutionProviderTest, TestSessionOutputs) { * */ { - Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "test"}; OrtTensorRTProviderOptionsV2 provider_options; Ort::SessionOptions session_options; session_options.AppendExecutionProvider_TensorRT_V2(provider_options); - auto model_path = ORT_TSTR("model_with_node_output_not_used.onnx"); - Ort::Status status(CreateModelWithNodeOutputNotUsed(model_path)); - ASSERT_TRUE(status.IsOK()); - - Ort::Session session(env, model_path, session_options); + auto model_path = ORT_TSTR("testdata/node_output_not_used.onnx"); + Ort::Session session(*ort_env, model_path, session_options); size_t output_count = session.GetOutputCount(); ASSERT_TRUE(output_count == 1); diff --git a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc deleted file mode 100644 index 51738342c6cb0..0000000000000 --- a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.cc +++ /dev/null @@ -1,281 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -#include "onnxruntime_cxx_api.h" -#include "core/common/path_string.h" - -#include -#include - -#include -#include -#include - -#define ONNX_IR_VERSION 11 -#define OPSET_VERSION 23 - -namespace onnxruntime { -namespace test { - -// Helper: make ONNX_NAMESPACE::TensorProto -ONNX_NAMESPACE::TensorProto MakeTensor(const std::string& name, - ONNX_NAMESPACE::TensorProto::DataType dtype, - const std::vector& dims, - const std::vector& vals) { - ONNX_NAMESPACE::TensorProto t; - t.set_name(name); - t.set_data_type(dtype); - for (auto d : dims) t.add_dims(d); - for (auto v : vals) t.add_int64_data(v); - return t; -} - -ONNX_NAMESPACE::TensorProto MakeTensorFloat(const std::string& name, - const std::vector& dims, - const std::vector& vals) { - ONNX_NAMESPACE::TensorProto t; - t.set_name(name); - t.set_data_type(ONNX_NAMESPACE::TensorProto::FLOAT); - for (auto d : dims) t.add_dims(d); - for (auto v : vals) t.add_float_data(v); - return t; -} - -OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name) { - // -------------------- - // Create Model - // -------------------- - ONNX_NAMESPACE::ModelProto model; - model.set_ir_version(ONNX_IR_VERSION); - auto* opset = model.add_opset_import(); - opset->set_domain(""); // empty = default ONNX domain - opset->set_version(OPSET_VERSION); - - ONNX_NAMESPACE::GraphProto* graph = model.mutable_graph(); - graph->set_name("DropoutMatMulGraph"); - - // -------------------- - // Create Inputs - // X: [3, 2] - // W: [2, 3] - // -------------------- - { - auto* x = graph->add_input(); - x->set_name("X"); - - auto* type = x->mutable_type(); - auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); - - auto* shape = tt->mutable_shape(); - shape->add_dim()->set_dim_value(3); - shape->add_dim()->set_dim_value(2); - } - - { - auto* w = graph->add_input(); - w->set_name("W"); - - auto* type = w->mutable_type(); - auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); - - auto* shape = tt->mutable_shape(); - shape->add_dim()->set_dim_value(2); - shape->add_dim()->set_dim_value(3); - } - - // -------------------- - // Output Y: [2, 3] - // -------------------- - { - auto* x = graph->add_output(); - x->set_name("Y"); - - auto* type = x->mutable_type(); - auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); - - auto* shape = tt->mutable_shape(); - shape->add_dim()->set_dim_value(2); - shape->add_dim()->set_dim_value(3); - } - - // -------------------- - // Dropout Node - // -------------------- - { - ONNX_NAMESPACE::NodeProto* node = graph->add_node(); - node->set_name("DropoutNode"); - node->set_op_type("Dropout"); - - node->add_input("X"); - node->add_output("dropout_out"); - node->add_output("dropout_mask"); - } - - // -------------------- - // MatMul Node - // -------------------- - { - ONNX_NAMESPACE::NodeProto* node = graph->add_node(); - node->set_name("MatMulNode"); - node->set_op_type("MatMul"); - - node->add_input("dropout_out"); - node->add_input("W"); - node->add_output("Y"); - } - - // -------------------- - // Validate - // -------------------- - try { - onnx::checker::check_model(model); - } catch (const std::exception& ex) { - std::string error_msg = "Model validation failed: " + std::string(ex.what()); - const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); - return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, error_msg.c_str()); - } - - std::ofstream ofs(model_name, std::ios::binary); - if (!model.SerializeToOstream(&ofs)) { - const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); - return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, "Failed to write model"); - } - - return nullptr; -} - -OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_name) { - ONNX_NAMESPACE::ModelProto model; - model.set_ir_version(ONNX_IR_VERSION); - auto* opset = model.add_opset_import(); - opset->set_domain(""); // empty = default ONNX domain - opset->set_version(OPSET_VERSION); - - auto* graph = model.mutable_graph(); - graph->set_name("TopKGraph"); - - // ====================== - // ---- Model Input ---- - // ====================== - { - auto* inp = graph->add_input(); - inp->set_name("input"); - - auto* type = inp->mutable_type(); - auto* tt = type->mutable_tensor_type(); - tt->set_elem_type(ONNX_NAMESPACE::TensorProto::FLOAT); - - // Shape: ["N"] - auto* shape = tt->mutable_shape(); - shape->add_dim()->set_dim_param("N"); - } - - // ====================== - // ---- Initializers ---- - // ====================== - { - // K = [300] - ONNX_NAMESPACE::TensorProto K = MakeTensor("K", ONNX_NAMESPACE::TensorProto::INT64, {1}, {300}); - *graph->add_initializer() = K; - - // zero = 0.0 (scalar) - ONNX_NAMESPACE::TensorProto zero = MakeTensor("zero", ONNX_NAMESPACE::TensorProto::INT64, {}, {0}); - *graph->add_initializer() = zero; - - // twenty_six = 26 (scalar) - ONNX_NAMESPACE::TensorProto ts = MakeTensor("twenty_six", ONNX_NAMESPACE::TensorProto::INT64, {}, {26}); - *graph->add_initializer() = ts; - } - - // ====================== - // ---- TopK ---- - // ====================== - { - ONNX_NAMESPACE::NodeProto* n = graph->add_node(); - n->set_op_type("TopK"); - n->add_input("input"); - n->add_input("K"); - n->add_output("scores"); - n->add_output("topk_indices"); - n->set_name("TopK"); - } - - // ====================== - // ---- Less ---- - // ====================== - { - ONNX_NAMESPACE::NodeProto* n = graph->add_node(); - n->set_op_type("Less"); - n->add_input("topk_indices"); - n->add_input("zero"); - n->add_output("Less_output_0"); - n->set_name("Less"); - } - - // ====================== - // ---- Div ---- - // ====================== - { - ONNX_NAMESPACE::NodeProto* n = graph->add_node(); - n->set_op_type("Div"); - n->add_input("topk_indices"); - n->add_input("twenty_six"); - n->add_output("Div_17_output_0"); - n->set_name("Div"); - } - - // ====================== - // ---- Mod ---- - // ====================== - { - ONNX_NAMESPACE::NodeProto* n = graph->add_node(); - n->set_op_type("Mod"); - n->add_input("topk_indices"); - n->add_input("twenty_six"); - n->add_output("labels"); - n->set_name("Mod"); - } - - // ========================= - // ---- Graph Outputs ---- - // ========================= - auto add_output = [&](const std::string& name, ONNX_NAMESPACE::TensorProto::DataType type, const std::string& dim) { - auto* out = graph->add_output(); - out->set_name(name); - - auto* tt = out->mutable_type()->mutable_tensor_type(); - tt->set_elem_type(type); - - auto* shape = tt->mutable_shape(); - shape->add_dim()->set_dim_param(dim); - }; - - add_output("scores", ONNX_NAMESPACE::TensorProto::FLOAT, "K"); - add_output("Less_output_0", ONNX_NAMESPACE::TensorProto::BOOL, "K"); - add_output("Div_17_output_0", ONNX_NAMESPACE::TensorProto::INT64, "K"); - add_output("labels", ONNX_NAMESPACE::TensorProto::INT64, "K"); - - // ====================== - // Validate + Save - // ====================== - try { - onnx::checker::check_model(model); - } catch (const std::exception& e) { - std::string error_msg = "Model validation failed: " + std::string(e.what()); - const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); - return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, error_msg.c_str()); - } - - std::ofstream ofs(model_name, std::ios::binary); - if (!model.SerializeToOstream(&ofs)) { - const OrtApi* ort_api = OrtGetApiBase()->GetApi(ORT_API_VERSION); - return ort_api->CreateStatus(OrtErrorCode::ORT_EP_FAIL, "Failed to write model"); - } - - return nullptr; -} -} // namespace test -} // namespace onnxruntime diff --git a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h b/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h deleted file mode 100644 index 3857d8ee80131..0000000000000 --- a/onnxruntime/test/providers/tensorrt/tensorrt_test_utils.h +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -#include "onnxruntime_cxx_api.h" -#include "core/common/path_string.h" - -namespace onnxruntime { -namespace test { -OrtStatus* CreateModelWithTopKWhichContainsGraphOutput(const PathString& model_name); -OrtStatus* CreateModelWithNodeOutputNotUsed(const PathString& model_name); -} // namespace test -} // namespace onnxruntime diff --git a/onnxruntime/test/testdata/node_output_not_used.onnx b/onnxruntime/test/testdata/node_output_not_used.onnx new file mode 100644 index 0000000000000000000000000000000000000000..e2726182fddc2c265752e46346735c26e33add4b GIT binary patch literal 189 zcmd=lo3kgAWK)CKji3J%^!XPX8xOg}ig*dpFIGBN$2_zVfB*+Ak RNCFB*q6<2)a4`t*0ss-ID|-L{ literal 0 HcmV?d00001 diff --git a/onnxruntime/test/testdata/node_output_not_used.py b/onnxruntime/test/testdata/node_output_not_used.py new file mode 100644 index 0000000000000..3bacc1783c42d --- /dev/null +++ b/onnxruntime/test/testdata/node_output_not_used.py @@ -0,0 +1,42 @@ +import onnx +from onnx import helper, TensorProto + +def create_model_with_node_output_not_used(model_path): + # Create graph + X = helper.make_tensor_value_info("X", TensorProto.FLOAT, [3, 2]) + W = helper.make_tensor_value_info("W", TensorProto.FLOAT, [2, 3]) + Y = helper.make_tensor_value_info("Y", TensorProto.FLOAT, [2, 3]) + + # Dropout node (two outputs) + dropout_node = helper.make_node( + "Dropout", + inputs=["X"], + outputs=["dropout_out", "dropout_mask"], + name="DropoutNode", + ) + + # MatMul node + matmul_node = helper.make_node( + "MatMul", + inputs=["dropout_out", "W"], + outputs=["Y"], + name="MatMulNode", + ) + + graph = helper.make_graph( + nodes=[dropout_node, matmul_node], + name="DropoutMatMulGraph", + inputs=[X, W], + outputs=[Y], + ) + + model = helper.make_model(graph, opset_imports=[helper.make_operatorsetid("", 13)]) + + onnx.checker.check_model(model) + onnx.save(model, model_path) + + print(f"Model saved to: {model_path}") + + +if __name__ == "__main__": + create_model_with_node_output_not_used("node_output_not_used.onnx") diff --git a/onnxruntime/test/testdata/topk_and_multiple_graph_outputs.onnx b/onnxruntime/test/testdata/topk_and_multiple_graph_outputs.onnx new file mode 100644 index 0000000000000000000000000000000000000000..340c3d420d5746844be0bd3769a174b4e69de801 GIT binary patch literal 393 zcmdW?8(U zIYJ{dP(TSp09}P@53)A4oW!KmoMI_v-~1FM5Fx|~a-n-sVnK!$HwU8tyA{(KCMQO3 zEp8x_k--V Date: Thu, 20 Nov 2025 11:30:38 -0800 Subject: [PATCH 10/12] lintrunner -a --- .../test/testdata/node_output_not_used.py | 3 ++- .../topk_and_multiple_graph_outputs.py | 20 ++++++------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/onnxruntime/test/testdata/node_output_not_used.py b/onnxruntime/test/testdata/node_output_not_used.py index 3bacc1783c42d..e1423ba8f38dc 100644 --- a/onnxruntime/test/testdata/node_output_not_used.py +++ b/onnxruntime/test/testdata/node_output_not_used.py @@ -1,5 +1,6 @@ import onnx -from onnx import helper, TensorProto +from onnx import TensorProto, helper + def create_model_with_node_output_not_used(model_path): # Create graph diff --git a/onnxruntime/test/testdata/topk_and_multiple_graph_outputs.py b/onnxruntime/test/testdata/topk_and_multiple_graph_outputs.py index cca9d7bd63034..caf2140d427c5 100644 --- a/onnxruntime/test/testdata/topk_and_multiple_graph_outputs.py +++ b/onnxruntime/test/testdata/topk_and_multiple_graph_outputs.py @@ -1,27 +1,19 @@ import onnx -from onnx import helper, TensorProto +from onnx import TensorProto, helper -def create_model_with_topk_graph_output(model_path): +def create_model_with_topk_graph_output(model_path): # ====================== # ---- Inputs ---- # ====================== - input_tensor = helper.make_tensor_value_info( - "input", TensorProto.FLOAT, ["N"] - ) + input_tensor = helper.make_tensor_value_info("input", TensorProto.FLOAT, ["N"]) # ====================== # ---- Initializers ---- # ====================== - K = helper.make_tensor( - "K", TensorProto.INT64, dims=[1], vals=[300] - ) - zero = helper.make_tensor( - "zero", TensorProto.INT64, dims=[], vals=[0] - ) - twenty_six = helper.make_tensor( - "twenty_six", TensorProto.INT64, dims=[], vals=[26] - ) + K = helper.make_tensor("K", TensorProto.INT64, dims=[1], vals=[300]) + zero = helper.make_tensor("zero", TensorProto.INT64, dims=[], vals=[0]) + twenty_six = helper.make_tensor("twenty_six", TensorProto.INT64, dims=[], vals=[26]) # ====================== # ---- Nodes ---- From accf540b2b94210378afc5340ba05b0a2fb505a3 Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Thu, 20 Nov 2025 11:53:00 -0800 Subject: [PATCH 11/12] update --- onnxruntime/test/providers/tensorrt/tensorrt_basic_test.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/onnxruntime/test/providers/tensorrt/tensorrt_basic_test.cc b/onnxruntime/test/providers/tensorrt/tensorrt_basic_test.cc index ac5f974c4a14f..c7062245ba746 100644 --- a/onnxruntime/test/providers/tensorrt/tensorrt_basic_test.cc +++ b/onnxruntime/test/providers/tensorrt/tensorrt_basic_test.cc @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. #include "onnxruntime_cxx_api.h" -#include "tensorrt_test_utils.h" #include "core/graph/onnx_protobuf.h" #include "core/session/inference_session.h" #include "test/providers/provider_test_utils.h" From bf87f39ac4b59156718bb64110965ff42668be2c Mon Sep 17 00:00:00 2001 From: Chi Lo Date: Mon, 1 Dec 2025 10:18:15 -0800 Subject: [PATCH 12/12] lintrunner -a --- onnxruntime/test/testdata/node_output_not_used.py | 10 +++++----- .../test/testdata/topk_and_multiple_graph_outputs.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/onnxruntime/test/testdata/node_output_not_used.py b/onnxruntime/test/testdata/node_output_not_used.py index e1423ba8f38dc..d36d5e9cfd2f8 100644 --- a/onnxruntime/test/testdata/node_output_not_used.py +++ b/onnxruntime/test/testdata/node_output_not_used.py @@ -4,9 +4,9 @@ def create_model_with_node_output_not_used(model_path): # Create graph - X = helper.make_tensor_value_info("X", TensorProto.FLOAT, [3, 2]) - W = helper.make_tensor_value_info("W", TensorProto.FLOAT, [2, 3]) - Y = helper.make_tensor_value_info("Y", TensorProto.FLOAT, [2, 3]) + x = helper.make_tensor_value_info("X", TensorProto.FLOAT, [3, 2]) + w = helper.make_tensor_value_info("W", TensorProto.FLOAT, [2, 3]) + y = helper.make_tensor_value_info("Y", TensorProto.FLOAT, [2, 3]) # Dropout node (two outputs) dropout_node = helper.make_node( @@ -27,8 +27,8 @@ def create_model_with_node_output_not_used(model_path): graph = helper.make_graph( nodes=[dropout_node, matmul_node], name="DropoutMatMulGraph", - inputs=[X, W], - outputs=[Y], + inputs=[x, w], + outputs=[y], ) model = helper.make_model(graph, opset_imports=[helper.make_operatorsetid("", 13)]) diff --git a/onnxruntime/test/testdata/topk_and_multiple_graph_outputs.py b/onnxruntime/test/testdata/topk_and_multiple_graph_outputs.py index caf2140d427c5..232abb2ed9163 100644 --- a/onnxruntime/test/testdata/topk_and_multiple_graph_outputs.py +++ b/onnxruntime/test/testdata/topk_and_multiple_graph_outputs.py @@ -11,7 +11,7 @@ def create_model_with_topk_graph_output(model_path): # ====================== # ---- Initializers ---- # ====================== - K = helper.make_tensor("K", TensorProto.INT64, dims=[1], vals=[300]) + k = helper.make_tensor("K", TensorProto.INT64, dims=[1], vals=[300]) zero = helper.make_tensor("zero", TensorProto.INT64, dims=[], vals=[0]) twenty_six = helper.make_tensor("twenty_six", TensorProto.INT64, dims=[], vals=[26]) @@ -62,7 +62,7 @@ def create_model_with_topk_graph_output(model_path): name="TopKGraph", inputs=[input_tensor], outputs=[scores_out, less_out, div_out, labels_out], - initializer=[K, zero, twenty_six], + initializer=[k, zero, twenty_six], ) model = helper.make_model(graph, opset_imports=[helper.make_operatorsetid("", 13)])