Skip to content

Commit b6d914b

Browse files
authored
[VitisAI] Add support compiled model compatibility information retrieval and validation (#26699)
### Description Adds support for compiled model compatibility information retrieval and validation in the VitisAI EP. This enables runtime validation of compiled models against the execution environment to prevent failures and provide clear compatibility feedback. **Key Changes:** - Implemented `GetCompiledModelCompatibilityInfo` to collect and serialize compatibility metadata during model compilation - Added `ValidateCompiledModelCompatibilityInfo` to validate compatibility at runtime against the current environment ### Motivation and Context Compiled models may fail at runtime due to missing backend plugins, version mismatches, or hardware platform differences. The ONNXRuntime add 2 API for support compiled model compatibility validation system . Ref PRs: #25841 #25749 This PR implements a compatibility validation system for Vitis AI EP that: - Detects incompatibilities before model loading to prevent runtime failures - Enables cross-version compatibility checking between different EP versions - Provides clear feedback through specific compatibility status codes - Maintains backward compatibility with legacy EPs
1 parent 0318be2 commit b6d914b

File tree

4 files changed

+96
-0
lines changed

4 files changed

+96
-0
lines changed

onnxruntime/core/providers/vitisai/imp/global_api.cc

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,15 @@ struct OrtVitisAIEpAPI {
9797
void (*profiler_collect)(
9898
std::vector<EventInfo>& api_events,
9999
std::vector<EventInfo>& kernel_events);
100+
const char* (*get_compiled_model_compatibility_info)(
101+
const std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>* eps,
102+
const void* graph_viewer) = nullptr;
103+
int (*validate_compiled_model_compatibility_info)(
104+
const std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>* eps,
105+
const char* compatibility_info,
106+
const void* const* devices,
107+
size_t num_devices,
108+
int* model_compatibility) = nullptr;
100109
void (*deinitialize_onnxruntime_vitisai_ep)();
101110
void Ensure() {
102111
if (handle_)
@@ -137,6 +146,8 @@ struct OrtVitisAIEpAPI {
137146
std::ignore = env.GetSymbolFromLibrary(handle_, "vaip_get_version",
138147
(void**)&vaip_get_version);
139148
std::ignore = env.GetSymbolFromLibrary(handle_, "profiler_collect", (void**)&profiler_collect);
149+
std::ignore = env.GetSymbolFromLibrary(handle_, "get_compiled_model_compatibility_info", (void**)&get_compiled_model_compatibility_info);
150+
std::ignore = env.GetSymbolFromLibrary(handle_, "validate_compiled_model_compatibility_info", (void**)&validate_compiled_model_compatibility_info);
140151
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "create_ep_context_nodes", (void**)&create_ep_context_nodes));
141152
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vitisai_ep_on_run_start", (void**)&vitisai_ep_on_run_start));
142153
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vitisai_ep_set_ep_dynamic_options", (void**)&vitisai_ep_set_ep_dynamic_options));
@@ -179,6 +190,42 @@ void profiler_collect(
179190
}
180191
}
181192

193+
std::string get_compiled_model_compatibility_info(
194+
const std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>& eps,
195+
const onnxruntime::GraphViewer& graph_viewer) {
196+
std::string result_str;
197+
if (s_library_vitisaiep.get_compiled_model_compatibility_info) {
198+
const char* result = s_library_vitisaiep.get_compiled_model_compatibility_info(&eps, &graph_viewer);
199+
if (result && result[0] != '\0') {
200+
result_str = result;
201+
}
202+
}
203+
return result_str;
204+
}
205+
206+
Status validate_compiled_model_compatibility_info(
207+
const std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>& eps,
208+
const std::string& compatibility_info,
209+
OrtCompiledModelCompatibility& model_compatibility) {
210+
if (s_library_vitisaiep.validate_compiled_model_compatibility_info) {
211+
// Call with nullptr devices since ORT provider doesn't have device information
212+
int ret_model_compatibility = 0;
213+
int status = s_library_vitisaiep.validate_compiled_model_compatibility_info(
214+
&eps,
215+
compatibility_info.c_str(),
216+
nullptr, // devices - not available
217+
0, // num_devices
218+
&ret_model_compatibility);
219+
if (status == 0) {
220+
model_compatibility = static_cast<OrtCompiledModelCompatibility>(ret_model_compatibility);
221+
return Status::OK();
222+
}
223+
}
224+
// Default to NOT_APPLICABLE
225+
model_compatibility = OrtCompiledModelCompatibility_EP_NOT_APPLICABLE;
226+
return Status::OK();
227+
}
228+
182229
void change_status_with_error(void* status_ptr, int error_code, const char* error_msg) {
183230
auto status = reinterpret_cast<Status*>(status_ptr);
184231
*status = Status(onnxruntime::common::ONNXRUNTIME, error_code, error_msg);

onnxruntime/core/providers/vitisai/include/vaip/global_api.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,20 @@ void profiler_collect(
4545
std::unique_ptr<onnxruntime::IExecutionProvider>
4646
CreateExecutionProviderFromAnotherEp(const std::string& lib, const OrtSessionOptions& session_options,
4747
std::unordered_map<std::string, std::string>& provider_options);
48+
49+
/**
50+
* Get compiled model compatibility information from execution providers.
51+
* Returns a JSON string containing compatibility metadata, or an empty string if unavailable.
52+
*/
53+
std::string get_compiled_model_compatibility_info(
54+
const std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>& eps,
55+
const onnxruntime::GraphViewer& graph_viewer);
56+
57+
/**
58+
* Validate compiled model compatibility information against current runtime environment.
59+
* The model_compatibility is output parameter for the compatibility result.
60+
*/
61+
Status validate_compiled_model_compatibility_info(
62+
const std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>& eps,
63+
const std::string& compatibility_info,
64+
OrtCompiledModelCompatibility& model_compatibility);

onnxruntime/core/providers/vitisai/vitisai_execution_provider.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,24 @@ std::unique_ptr<profiling::EpProfiler> VitisAIExecutionProvider::GetProfiler() {
145145
return std::make_unique<profiling::VitisaiProfiler>();
146146
}
147147

148+
std::string VitisAIExecutionProvider::GetCompiledModelCompatibilityInfo(
149+
const onnxruntime::GraphViewer& graph_viewer) const {
150+
if (!execution_providers_) {
151+
return {};
152+
}
153+
return get_compiled_model_compatibility_info(**execution_providers_, graph_viewer);
154+
}
155+
156+
common::Status VitisAIExecutionProvider::ValidateCompiledModelCompatibilityInfo(
157+
const std::string& compatibility_info,
158+
OrtCompiledModelCompatibility& model_compatibility) const {
159+
if (!execution_providers_) {
160+
model_compatibility = OrtCompiledModelCompatibility_EP_NOT_APPLICABLE;
161+
return Status::OK();
162+
}
163+
return validate_compiled_model_compatibility_info(**execution_providers_, compatibility_info, model_compatibility);
164+
}
165+
148166
std::vector<AllocatorPtr> VitisAIExecutionProvider::CreatePreferredAllocators() {
149167
std::vector<AllocatorPtr> result;
150168
// We do not want arena for 4k alignment, as it would not respect alignment.

onnxruntime/core/providers/vitisai/vitisai_execution_provider.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,20 @@ class VitisAIExecutionProvider : public IExecutionProvider {
4848

4949
std::vector<AllocatorPtr> CreatePreferredAllocators() override;
5050

51+
/**
52+
* Get compiled model compatibility information.
53+
* This method collects compatibility info from all vaip_core execution providers
54+
* and returns it as a JSON string.
55+
*/
56+
std::string GetCompiledModelCompatibilityInfo(const onnxruntime::GraphViewer& graph_viewer) const override;
57+
58+
/**
59+
* Validate compiled model compatibility information.
60+
* This method validates the compatibility info against the current runtime environment.
61+
*/
62+
common::Status ValidateCompiledModelCompatibilityInfo(const std::string& compatibility_info,
63+
OrtCompiledModelCompatibility& model_compatibility) const override;
64+
5165
private:
5266
using my_ep_t = vaip_core::DllSafe<std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>>;
5367
using my_ep_uptr_t = std::shared_ptr<my_ep_t>;

0 commit comments

Comments
 (0)