Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 98 additions & 0 deletions csharp/src/Microsoft.ML.OnnxRuntime/NativeMethods.shared.cs
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,88 @@ public struct OrtApi
public IntPtr EpDevice_Device;
public IntPtr GetEpApi;
public IntPtr GetTensorSizeInBytes;

public IntPtr AllocatorGetStats;

public IntPtr CreateMemoryInfo_V2;
public IntPtr MemoryInfoGetDeviceMemType;
public IntPtr MemoryInfoGetVendorId;

public IntPtr ValueInfo_GetValueProducer;
public IntPtr ValueInfo_GetValueNumConsumers;
public IntPtr ValueInfo_GetValueConsumers;
public IntPtr ValueInfo_GetInitializerValue;
public IntPtr ValueInfo_GetExternalInitializerInfo;
public IntPtr ValueInfo_IsRequiredGraphInput;
public IntPtr ValueInfo_IsOptionalGraphInput;
public IntPtr ValueInfo_IsGraphOutput;
public IntPtr ValueInfo_IsConstantInitializer;
public IntPtr ValueInfo_IsFromOuterScope;
public IntPtr Graph_GetName;
public IntPtr Graph_GetModelPath;
public IntPtr Graph_GetOnnxIRVersion;
public IntPtr Graph_GetNumOperatorSets;
public IntPtr Graph_GetOperatorSets;
public IntPtr Graph_GetNumInputs;
public IntPtr Graph_GetInputs;
public IntPtr Graph_GetNumOutputs;
public IntPtr Graph_GetOutputs;
public IntPtr Graph_GetNumInitializers;
public IntPtr Graph_GetInitializers;
public IntPtr Graph_GetNumNodes;
public IntPtr Graph_GetNodes;
public IntPtr Graph_GetParentNode;
public IntPtr Graph_GetGraphView;
public IntPtr Node_GetId;
public IntPtr Node_GetName;
public IntPtr Node_GetOperatorType;
public IntPtr Node_GetDomain;
public IntPtr Node_GetSinceVersion;
public IntPtr Node_GetNumInputs;
public IntPtr Node_GetInputs;
public IntPtr Node_GetNumOutputs;
public IntPtr Node_GetOutputs;
public IntPtr Node_GetNumImplicitInputs;
public IntPtr Node_GetImplicitInputs;
public IntPtr Node_GetNumAttributes;
public IntPtr Node_GetAttributes;
public IntPtr Node_GetAttributeByName;
public IntPtr Node_GetTensorAttributeAsOrtValue;
public IntPtr OpAttr_GetType;
public IntPtr OpAttr_GetName;
public IntPtr Node_GetNumSubgraphs;
public IntPtr Node_GetSubgraphs;
public IntPtr Node_GetGraph;
public IntPtr Node_GetEpName;
public IntPtr ReleaseExternalInitializerInfo;
public IntPtr ExternalInitializerInfo_GetFilePath;
public IntPtr ExternalInitializerInfo_GetFileOffset;
public IntPtr ExternalInitializerInfo_GetByteSize;

public IntPtr GetRunConfigEntry;

public IntPtr EpDevice_MemoryInfo;

public IntPtr CreateSharedAllocator;
public IntPtr GetSharedAllocator;
public IntPtr ReleaseSharedAllocator;

public IntPtr GetTensorData;

public IntPtr GetSessionOptionsConfigEntries;

public IntPtr SessionGetMemoryInfoForInputs;
public IntPtr SessionGetMemoryInfoForOutputs;
public IntPtr SessionGetEpDeviceForInputs;

public IntPtr CreateSyncStreamForEpDevice;
public IntPtr SyncStream_GetHandle;
public IntPtr ReleaseSyncStream;

public IntPtr CopyTensors;

public IntPtr Graph_GetModelMetadata;
public IntPtr GetModelCompatibilityForEpDevices;
}

internal static class NativeMethods
Expand Down Expand Up @@ -704,6 +786,10 @@ static NativeMethods()
(DSessionOptionsSetEpSelectionPolicyDelegate)Marshal.GetDelegateForFunctionPointer(
api_.SessionOptionsSetEpSelectionPolicyDelegate,
typeof(DSessionOptionsSetEpSelectionPolicyDelegate));

OrtGetModelCompatibilityForEpDevices = (DOrtGetModelCompatibilityForEpDevices)Marshal.GetDelegateForFunctionPointer(
api_.GetModelCompatibilityForEpDevices,
typeof(DOrtGetModelCompatibilityForEpDevices));
}

internal class NativeLib
Expand Down Expand Up @@ -2456,6 +2542,18 @@ public delegate void DOrtRemoveKeyValuePair(IntPtr /* OrtKeyValuePairs* */ kvps,

public static DOrtGetEpDevices OrtGetEpDevices;

/// <summary>
/// Validate compiled model compatibility for the provided EP devices.
/// </summary>
[UnmanagedFunctionPointer(CallingConvention.Winapi)]
public delegate IntPtr /* OrtStatus* */ DOrtGetModelCompatibilityForEpDevices(
IntPtr[] /* const OrtEpDevice* const* */ ep_devices,
UIntPtr /* size_t */ num_ep_devices,
byte[] /* const char* */ compatibility_info,
out int /* OrtCompiledModelCompatibility */ out_status);

public static DOrtGetModelCompatibilityForEpDevices OrtGetModelCompatibilityForEpDevices;

/// <summary>
/// Add execution provider devices to the session options.
/// Priority is based on the order of the OrtEpDevice instances. Highest priority first.
Expand Down
27 changes: 27 additions & 0 deletions csharp/src/Microsoft.ML.OnnxRuntime/OrtEnv.shared.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@

namespace Microsoft.ML.OnnxRuntime
{
public enum OrtCompiledModelCompatibility
{
EP_NOT_APPLICABLE = 0,
EP_SUPPORTED_OPTIMAL = 1,
EP_SUPPORTED_PREFER_RECOMPILATION = 2,
EP_UNSUPPORTED = 3,
}

/// <summary>
/// Delegate for logging function callback.
/// Supply your function and register it with the environment to receive logging callbacks via
Expand Down Expand Up @@ -361,6 +369,25 @@ public string[] GetAvailableProviders()
}
}

/// <summary>
/// Validate a compiled model's compatibility information for one or more EP devices.
/// </summary>
public OrtCompiledModelCompatibility GetModelCompatibilityForEpDevices(IReadOnlyList<OrtEpDevice> epDevices, string compatibilityInfo)
{
if (epDevices == null || epDevices.Count == 0)
throw new ArgumentException("epDevices must be non-empty", nameof(epDevices));

var devicePtrs = new IntPtr[epDevices.Count];
for (int i = 0; i < epDevices.Count; ++i)
{
devicePtrs[i] = epDevices[i].Handle;
}

var infoUtf8 = NativeOnnxValueHelper.StringToZeroTerminatedUtf8(compatibilityInfo);
NativeApiStatus.VerifySuccess(NativeMethods.OrtGetModelCompatibilityForEpDevices(devicePtrs, (UIntPtr)devicePtrs.Length, infoUtf8, out int status));
return (OrtCompiledModelCompatibility)status;
}


/// <summary>
/// Get/Set log level property of OrtEnv instance
Expand Down
8 changes: 8 additions & 0 deletions include/onnxruntime/core/session/onnxruntime_cxx_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,14 @@ struct EpDevice : detail::EpDeviceImpl<OrtEpDevice> {
ConstKeyValuePairs ep_metadata = {}, ConstKeyValuePairs ep_options = {});
};

/** \brief Validate a compiled model's compatibility for one or more EP devices.
*
* Throws on error. Returns the resulting compatibility status.
*/
OrtCompiledModelCompatibility GetModelCompatibilityForEpDevices(
const std::vector<ConstEpDevice>& ep_devices,
const char* compatibility_info);

/** \brief The Env (Environment)
*
* The Env holds the logging state used by all other objects.
Expand Down
20 changes: 20 additions & 0 deletions include/onnxruntime/core/session/onnxruntime_cxx_inline.h
Original file line number Diff line number Diff line change
Expand Up @@ -859,6 +859,26 @@ inline void CustomOpDomain::Add(const OrtCustomOp* op) {
ThrowOnError(GetApi().CustomOpDomain_Add(p_, op));
}

inline OrtCompiledModelCompatibility GetModelCompatibilityForEpDevices(
const std::vector<ConstEpDevice>& ep_devices,
const char* compatibility_info) {
if (ep_devices.empty()) {
ORT_CXX_API_THROW("ep_devices is empty", ORT_INVALID_ARGUMENT);
}

std::vector<const OrtEpDevice*> ptrs;
ptrs.reserve(ep_devices.size());
for (const auto& d : ep_devices) ptrs.push_back(d);

OrtCompiledModelCompatibility status = OrtCompiledModelCompatibility_EP_NOT_APPLICABLE;
ThrowOnError(GetApi().GetModelCompatibilityForEpDevices(
reinterpret_cast<const OrtEpDevice* const*>(ptrs.data()),
ptrs.size(),
compatibility_info,
&status));
return status;
}

inline LoraAdapter LoraAdapter::CreateLoraAdapter(const std::basic_string<ORTCHAR_T>& adapter_path,
OrtAllocator* allocator) {
OrtLoraAdapter* p;
Expand Down
17 changes: 17 additions & 0 deletions onnxruntime/python/onnxruntime_pybind_state.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1575,6 +1575,17 @@ void addGlobalMethods(py::module& m) {
R"pbdoc(Get the list of available OrtEpDevice instances.)pbdoc",
py::return_value_policy::reference);

m.def(
"get_model_compatibility_for_ep_devices",
[](const std::vector<const OrtEpDevice*>& ep_devices,
const std::string& compatibility_info) -> OrtCompiledModelCompatibility {
OrtCompiledModelCompatibility status = OrtCompiledModelCompatibility_EP_NOT_APPLICABLE;
Ort::ThrowOnError(Ort::GetApi().GetModelCompatibilityForEpDevices(
ep_devices.data(), ep_devices.size(), compatibility_info.c_str(), &status));
return status;
},
R"pbdoc("Validate a compiled model's compatibility information for one or more EP devices.)pbdoc");

#if defined(USE_OPENVINO) || defined(USE_OPENVINO_PROVIDER_INTERFACE)
m.def(
"get_available_openvino_device_ids", []() -> std::vector<std::string> {
Expand Down Expand Up @@ -1759,6 +1770,12 @@ void addObjectMethods(py::module& m, ExecutionProviderRegistrationFn ep_registra
.value("PRIORITY_BASED", ExecutionOrder::PRIORITY_BASED)
.value("MEMORY_EFFICIENT", ExecutionOrder::MEMORY_EFFICIENT);

py::enum_<OrtCompiledModelCompatibility>(m, "OrtCompiledModelCompatibility")
.value("EP_NOT_APPLICABLE", OrtCompiledModelCompatibility_EP_NOT_APPLICABLE)
.value("EP_SUPPORTED_OPTIMAL", OrtCompiledModelCompatibility_EP_SUPPORTED_OPTIMAL)
.value("EP_SUPPORTED_PREFER_RECOMPILATION", OrtCompiledModelCompatibility_EP_SUPPORTED_PREFER_RECOMPILATION)
.value("EP_UNSUPPORTED", OrtCompiledModelCompatibility_EP_UNSUPPORTED);

py::enum_<OrtAllocatorType>(m, "OrtAllocatorType")
.value("INVALID", OrtInvalidAllocator)
.value("ORT_DEVICE_ALLOCATOR", OrtDeviceAllocator)
Expand Down
Loading