[EP ABI] Initial support for kernel-based EPs - #26206
Merged
Adrian Lizarraga (adrianlizarraga) merged 79 commits intoDec 5, 2025
Merged
Conversation
Contributor
There was a problem hiding this comment.
Pull Request Overview
This draft PR implements support for kernel-based execution providers (EPs) within the ONNX Runtime EP plugin architecture. The changes enable plugin EPs to register custom kernels directly with the ORT runtime, expanding beyond the current node-based computation model.
- Adds comprehensive kernel registration infrastructure for plugin EPs
- Implements memory copy kernels as examples (MemcpyFromHost/MemcpyToHost)
- Extends the EP API with kernel definition and creation functionality
Reviewed Changes
Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
onnxruntime/test/framework/ep_plugin_provider_test.cc |
Updates test to pass kernel registry parameter |
onnxruntime/test/autoep/library/kernels/utils.h |
Defines kernel creation utilities and macros |
onnxruntime/test/autoep/library/kernels/memcpy.h |
Declares example Memcpy kernel interface |
onnxruntime/test/autoep/library/kernels/memcpy.cc |
Implements example Memcpy kernel with registration |
onnxruntime/test/autoep/library/kernels/data_types.h |
Declares MLDataTypes singleton for type management |
onnxruntime/test/autoep/library/kernels/data_types.cc |
Implements MLDataTypes for tensor type retrieval |
onnxruntime/test/autoep/library/ep_kernel_registration.h |
Declares kernel registration functions |
onnxruntime/test/autoep/library/ep_kernel_registration.cc |
Implements kernel registration logic |
onnxruntime/test/autoep/library/ep.h |
Adds kernel creation method declarations to EP |
onnxruntime/test/autoep/library/ep.cc |
Implements kernel creation methods in example EP |
onnxruntime/core/session/utils.h |
Declares CopyTensors utility function |
onnxruntime/core/session/utils.cc |
Implements CopyTensors utility function |
onnxruntime/core/session/provider_policy_context.cc |
Updates EP creation to use new factory method |
onnxruntime/core/session/plugin_ep/ep_plugin_provider_interfaces.h |
Extends PluginExecutionProvider with kernel registry support |
onnxruntime/core/session/plugin_ep/ep_plugin_provider_interfaces.cc |
Implements kernel registry initialization in plugin EP |
onnxruntime/core/session/plugin_ep/ep_kernel_registration.h |
Declares kernel registration infrastructure |
onnxruntime/core/session/plugin_ep/ep_kernel_registration.cc |
Implements plugin EP kernel wrapper and registration |
onnxruntime/core/session/plugin_ep/ep_api.h |
Declares new EP API functions for kernel support |
onnxruntime/core/session/plugin_ep/ep_api.cc |
Implements new EP API functions for kernel support |
onnxruntime/core/session/onnxruntime_c_api.cc |
Refactors CopyTensors to use shared utility |
include/onnxruntime/core/session/onnxruntime_ep_c_api.h |
Adds kernel-related types and API declarations |
include/onnxruntime/core/session/onnxruntime_cxx_inline.h |
Implements C++ wrapper methods for kernel APIs |
include/onnxruntime/core/session/onnxruntime_cxx_api.h |
Declares C++ KernelDefBuilder class |
cmake/onnxruntime_unittests.cmake |
Updates build to include kernel source files |
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Contributor
There was a problem hiding this comment.
Pull Request Overview
Copilot reviewed 25 out of 25 changed files in this pull request and generated 3 comments.
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
This was referenced Mar 17, 2026
This was referenced May 4, 2026
This was referenced May 11, 2026
This was referenced Jul 1, 2026
This was referenced Jul 8, 2026
This was referenced Jul 22, 2026
This was referenced Aug 1, 2026
This was referenced Aug 8, 2026
This was referenced Aug 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
This PR adds an initial set of C APIs necessary to support kernel registration for plugin EPs.
Example use
The example plugin EP implementation now registers
MemcpyFromHostandMemcpyToHostoperator kernels using the new APIs. New utilities in the example implementation make the process of defining operator kernels very similar to the existing process used by provider-bridge EPs.First, the operator kernel class is defined:
Then, a macro defines a function that can be called to register the operator with the EP's kernel registry:
Lastly, the functions defined by the above macro are entered into a table:
The example EP processes the entries in the above table to add information about the supported operator kernels to the EP's kernel registry (
OrtKernelRegistry).Additionally, during the call to
OrtEp::GetCapability, an EP can now lookup registered kernel definitions via the new APIEpGraphSupportInfo_LookUpKernel. Note that an EP would not normally lookup kernels forMemcpy**Host, which are inserted by ORT. Instead, it would be used to look up other registered operator kernels likeConv, for example.EP implementation details
An EP instance (i.e.,
OrtEp) that needs to register operator kernels with ONNX Runtime must implement the followingOrtEp::GetKernelRegistry()function:Returns:
OrtStatus*Parameters:
OrtEp* this_ptr: The OrtEp instance.const OrtKernelRegistry** kernel_registry: Output parameter set to the EP's kernel registry, which must remain valid throughout the lifetime of the EP.Remarks: A kernel registry contains kernel creation information for operator kernels supported by an EP.
Note: Implementation of this function is optional. If set to NULL, ORT assumes the EP compiles nodes.
If defined by the EP, the
OrtEp::GetKernelRegistry()function is called by ONNX Runtime after creating an instance of theOrtEpin order to retrieve the EP's kernel registry.APIs used by EP to add entries to kernel registry
An EP's kernel registry (
OrtKernelRegistry) contains information necessary for the (later) creation of operator kernels supported by an EP. Conceptually, a kernel registry contains an array of "kernel creation information" elements, one per operator. Each such element consists of:OrtKernelDef), which specifies operator type, supported versions, type constraints, I/O memory types, etc.OrtKernelCreateFuncthat ORT calls to create an instance of the kernel (OrtKernelImpl).OrtEp) that is passed to theOrtKernelCreateFunc.An EP uses the following
OrtEpApi::KernelRegistry_AddKernel()function to add an entry for one supported operator.Returns:
OrtStatus*Parameters:
OrtKernelRegistry* kernel_registry: The OrtKernelRegistry instance.const OrtKernelDef* kernel_def: The kernel definition, which includes operator type, version, EP name, type constraints, etc.OrtKernelCreateFunc kernel_create_func: Function that creates an instance of the operator kernel as a OrtKernelImpl instance.void* kernel_create_func_state: Custom state passed to the kernel creation function. Can be null.Remarks: Refer to OrtEp::GetKernelRegistry, which returns an EP's kernel registry to ORT.
Building a kernel definition
An EP uses a kernel definition builder (
OrtKernelDefBuilder) to create a kernel definition (OrtKernelDef). The following table lists some of the C APIs related to building a kernel definition. The aboveONNX_OPERATOR_KERNEL_EXmacro uses these APIs.Returns:
OrtStatus*Parameters:
OrtKernelDefBuilder* kernel_def_builder: The OrtKernelDefBuilder instance.const char* op_type: A null-terminated string representing the operator type.Returns:
OrtStatus*Parameters:
OrtKernelDefBuilder* kernel_def_builder: The OrtKernelDefBuilder instance.const char* domain: A null-terminated string representing the operator's domain.Returns:
OrtStatus*Parameters:
OrtKernelDefBuilder* kernel_def_builder: The OrtKernelDefBuilder instance.OrtKernelDef** kernel_def_out: The new OrtKernelDef instance.Defining a kernel implementation
An EP defines a kernel implementation by initializing an instance of
OrtKernelImpl(shown below) with function pointers for computation, release, etc.As shown previously, the example EP creates a
Memcpyclass that inherits fromOrtKernelImpland implements the above functions.Defining a kernel creation function
An EP must provide a function of type
OrtKernelCreateFuncthat ORT can later call to create an instance of a kernel (OrtKernelImpl). The signature of theOrtKernelCreateFuncis shown below.The example EP declares kernel creation functions via use of the previously mentioned
ONNX_OPERATOR_KERNEL_EXmacro. If one were to expand the macro call, the kernel creation function forMemcpyFromHostwould look similar to the following snippet:Motivation and Context