From 2b4465f1dd26eb2c7418f26aef802ea86cec51d0 Mon Sep 17 00:00:00 2001 From: adrianlizarraga Date: Tue, 27 Jan 2026 13:20:58 -0800 Subject: [PATCH 1/2] BaseTester: support plugin EPs with a mix of compiled nodes and registered kernels --- onnxruntime/test/unittest_util/base_tester.cc | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/onnxruntime/test/unittest_util/base_tester.cc b/onnxruntime/test/unittest_util/base_tester.cc index d8bfd425f1f1a..51c7d9e902a4b 100644 --- a/onnxruntime/test/unittest_util/base_tester.cc +++ b/onnxruntime/test/unittest_util/base_tester.cc @@ -424,7 +424,7 @@ void BaseTester::ExecuteModel(Model& model, SessionType& session, bool SetEpsForAllNodes(Graph& graph, const std::vector>& execution_providers, const std::vector>* custom_registries, - const std::function& ep_uses_kernel_registry_fn) { + const std::function& ep_only_uses_kernel_registry_fn) { const OpSchemaKernelTypeStrResolver kernel_type_str_resolver{}; const KernelRegistry::TypeConstraintMap type_constraint_map{}; @@ -440,7 +440,7 @@ bool SetEpsForAllNodes(Graph& graph, node.SetExecutionProviderType(provider_type); - if (!ep_uses_kernel_registry_fn(*ep)) { + if (!ep_only_uses_kernel_registry_fn(*ep)) { found = true; break; } @@ -830,12 +830,12 @@ void BaseTester::ExecuteModelForEps( ASSERT_TRUE(!execution_providers.empty()) << "Empty execution providers vector."; if (try_assign_ep_for_nodes) { - auto ep_uses_kernel_registry = [](const IExecutionProvider& ep) { + auto ep_only_uses_kernel_registry = [](const IExecutionProvider& ep) { const auto& provider_type = ep.Type(); - constexpr std::array kEpsThatDoNotUseKernelRegistry{ + constexpr std::array kEpsThatDoNotUseKernelRegistryForAllNodes{ kOpenVINOExecutionProvider, - kTensorrtExecutionProvider, + kTensorrtExecutionProvider, // uses kernel registry for Memcpy* nodes, but compiles all others. kNnapiExecutionProvider, kVSINPUExecutionProvider, kCoreMLExecutionProvider, @@ -844,24 +844,34 @@ void BaseTester::ExecuteModelForEps( kSnpeExecutionProvider, }; - // check list of known EPs that do not use a kernel registry - if (const auto ep_it = std::find(kEpsThatDoNotUseKernelRegistry.begin(), kEpsThatDoNotUseKernelRegistry.end(), + // check list of known EPs that do not use a kernel registry for all nodes + if (const auto ep_it = std::find(kEpsThatDoNotUseKernelRegistryForAllNodes.begin(), + kEpsThatDoNotUseKernelRegistryForAllNodes.end(), provider_type); - ep_it != kEpsThatDoNotUseKernelRegistry.end()) { + ep_it != kEpsThatDoNotUseKernelRegistryForAllNodes.end()) { return false; } - // assume that a dynamic plugin EP which does not return a kernel registry does not use one - if (provider_type == dynamic_plugin_ep_infra::GetEpName() && - ep.GetKernelRegistry() == nullptr) { - return false; + const OrtEp* ort_ep = ep.GetOrtEp(); + + if (ort_ep != nullptr) { // This is a plugin EP + + if (ep.GetKernelRegistry() == nullptr) { + // assume that a dynamic plugin EP which does not return a kernel registry does not use one + return false; + } + + if (ort_ep->Compile != nullptr) { + // assume that a plugin EP that compiles nodes does not use a kernel registry for all nodes + return false; + } } // otherwise, assume that the EP uses a kernel registry return true; }; - if (!SetEpsForAllNodes(model.MainGraph(), execution_providers, custom_registries, ep_uses_kernel_registry)) { + if (!SetEpsForAllNodes(model.MainGraph(), execution_providers, custom_registries, ep_only_uses_kernel_registry)) { std::string providers; for (const auto& ep : execution_providers) { providers.append(ep->Type() + " "); From 5c91f19a72f6a2ed9865aaa26faf350130e77686 Mon Sep 17 00:00:00 2001 From: adrianlizarraga Date: Tue, 27 Jan 2026 16:34:00 -0800 Subject: [PATCH 2/2] Rename variable --- onnxruntime/test/unittest_util/base_tester.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/onnxruntime/test/unittest_util/base_tester.cc b/onnxruntime/test/unittest_util/base_tester.cc index 51c7d9e902a4b..b0dfa0fc3d41e 100644 --- a/onnxruntime/test/unittest_util/base_tester.cc +++ b/onnxruntime/test/unittest_util/base_tester.cc @@ -833,7 +833,7 @@ void BaseTester::ExecuteModelForEps( auto ep_only_uses_kernel_registry = [](const IExecutionProvider& ep) { const auto& provider_type = ep.Type(); - constexpr std::array kEpsThatDoNotUseKernelRegistryForAllNodes{ + constexpr std::array kEpsThatCompileNodes{ kOpenVINOExecutionProvider, kTensorrtExecutionProvider, // uses kernel registry for Memcpy* nodes, but compiles all others. kNnapiExecutionProvider, @@ -844,11 +844,10 @@ void BaseTester::ExecuteModelForEps( kSnpeExecutionProvider, }; - // check list of known EPs that do not use a kernel registry for all nodes - if (const auto ep_it = std::find(kEpsThatDoNotUseKernelRegistryForAllNodes.begin(), - kEpsThatDoNotUseKernelRegistryForAllNodes.end(), + // check list of known EPs that compile nodes + if (const auto ep_it = std::find(kEpsThatCompileNodes.begin(), kEpsThatCompileNodes.end(), provider_type); - ep_it != kEpsThatDoNotUseKernelRegistryForAllNodes.end()) { + ep_it != kEpsThatCompileNodes.end()) { return false; }