Skip to content

Commit 480bcdf

Browse files
wonchung-microsoftwcy123Liu Minyue
authored
[VitisAI] Add vaip Integration Using FetchContent (Cherry-pick of PR#22038 to win-ort-main branch) (#23608)
### Description Integrating the VitisAI EP implement repository into ONNXRuntime using FetchContent. Statically linking core EP functionality and limiting dynamic links to C-style ABI functions. **This is a cherry-pick of PR#22038** ### Motivation and Context Addressing ABI and build compatibility ensures smoother integration and broader applicability of the VitisAI EP. **While PR#22038 is waiting to be merged to main branch, we want to utilize Vitis AI EP in win-ort-main branch. This cherry-pick was ok-ed by AMD.** --------- Co-authored-by: Chunye Wang <[email protected]> Co-authored-by: Liu Minyue <[email protected]>
1 parent 4b5b5f7 commit 480bcdf

File tree

4 files changed

+88
-18
lines changed

4 files changed

+88
-18
lines changed

cmake/deps.txt

+1
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,4 @@ directx_headers;https://github.com/microsoft/DirectX-Headers/archive/refs/tags/v
6060
cudnn_frontend;https://github.com/NVIDIA/cudnn-frontend/archive/refs/tags/v1.7.0.zip;d0753d8d5b39947ca0729d7773cb84653a129eb1
6161
dawn;https://github.com/google/dawn/archive/12a3b24c456cebd9fd11f23ac0164f78129b00c6.zip;ad428f6dc16f1336d584f7bad5714e1097dafc43
6262
kleidiai;https://gitlab.arm.com/kleidi/kleidiai/-/archive/d15722976120710080ca098fe8ddabf4556cb40f/kleidiai-d15722976120710080ca098fe8ddabf4556cb40f.zip;d6c840d00c3b05aedf06e957ddaece1013d1f40b
63+
vaip;https://github.com/amd/vaip/archive/refs/tags/v1.0.0-rc0.zip;e084b71c0277e2e3263179a4682300d427ff83e7

cmake/onnxruntime_providers_vitisai.cmake

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Copyright (c) Microsoft Corporation. All rights reserved.
22
# Licensed under the MIT License.
3+
FetchContent_Declare(
4+
vaip
5+
URL ${DEP_URL_vaip}
6+
URL_HASH SHA1=${DEP_SHA1_vaip}
7+
OVERRIDE_FIND_PACKAGE
8+
)
9+
find_package(vaip)
310

411
if ("${GIT_COMMIT_ID}" STREQUAL "")
512
execute_process(
@@ -21,10 +28,11 @@
2128
source_group(TREE ${ONNXRUNTIME_ROOT}/core FILES ${onnxruntime_providers_vitisai_cc_srcs})
2229
onnxruntime_add_shared_library(onnxruntime_providers_vitisai ${onnxruntime_providers_vitisai_cc_srcs})
2330
onnxruntime_add_include_to_target(onnxruntime_providers_vitisai ${ONNXRUNTIME_PROVIDERS_SHARED} ${GSL_TARGET} safeint_interface flatbuffers::flatbuffers)
24-
target_link_libraries(onnxruntime_providers_vitisai PRIVATE ${ONNXRUNTIME_PROVIDERS_SHARED})
31+
target_link_libraries(onnxruntime_providers_vitisai PRIVATE ${ONNXRUNTIME_PROVIDERS_SHARED} onnxruntime_vitisai_ep::onnxruntime_vitisai_ep)
2532
if(MSVC)
2633
onnxruntime_add_include_to_target(onnxruntime_providers_vitisai dbghelp)
2734
set_property(TARGET onnxruntime_providers_vitisai APPEND_STRING PROPERTY LINK_FLAGS "-DEF:${ONNXRUNTIME_ROOT}/core/providers/vitisai/symbols.def")
35+
target_sources(onnxruntime_providers_vitisai PRIVATE ${vaip_BINARY_DIR}/onnxruntime_vitisai_ep/onnxruntime_vitisai_ep.def)
2836
else(MSVC)
2937
set_property(TARGET onnxruntime_providers_vitisai APPEND_STRING PROPERTY LINK_FLAGS "-Xlinker --version-script=${ONNXRUNTIME_ROOT}/core/providers/vitisai/version_script.lds -Xlinker --gc-sections")
3038
endif(MSVC)
@@ -43,6 +51,10 @@
4351
target_compile_options(onnxruntime_providers_vitisai PRIVATE -Wno-unused-parameter)
4452
endif(MSVC)
4553

54+
if(MSVC)
55+
target_link_options(onnxruntime_providers_vitisai PRIVATE "/NODEFAULTLIB:libucrt.lib" "/DEFAULTLIB:ucrt.lib")
56+
endif(MSVC)
57+
4658
set_target_properties(onnxruntime_providers_vitisai PROPERTIES FOLDER "ONNXRuntime")
4759
set_target_properties(onnxruntime_providers_vitisai PROPERTIES LINKER_LANGUAGE CXX)
4860

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

+63-16
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,27 @@ using namespace onnxruntime;
4141
#define LIBRARY_PREFIX "lib"
4242
#define LIBRARY_EXTENSION ".so"
4343
#endif
44-
44+
extern "C" {
45+
void initialize_onnxruntime_vitisai_ep_c(vaip_core::OrtApiForVaip* api, std::vector<OrtCustomOpDomain*>& ret_domain);
46+
uint32_t vaip_get_version_c();
47+
int create_ep_context_nodes_c(
48+
const std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>& eps,
49+
vaip_core::DllSafe<std::vector<Node*>>* ret_value);
50+
std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>* compile_onnx_model_with_options_c(
51+
const std::string& model_path, const onnxruntime::Graph& graph, const onnxruntime::ProviderOptions& options);
52+
std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>* compile_onnx_model_vitisai_ep_with_error_handling_c(
53+
const std::string& model_path, const onnxruntime::Graph& graph, const onnxruntime::ProviderOptions& options, void* status, vaip_core::error_report_func func);
54+
int vitisai_ep_on_run_start_c(
55+
const std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>& eps, const void* state,
56+
vaip_core::DllSafe<std::string> (*get_config_entry)(const void* state, const char* entry_name));
57+
int vitisai_ep_set_ep_dynamic_options_c(
58+
const std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>& eps,
59+
const char* const* keys,
60+
const char* const* values, size_t kv_len);
61+
void profiler_collect_c(
62+
std::vector<EventInfo>& api_events,
63+
std::vector<EventInfo>& kernel_events);
64+
};
4565
vaip_core::OrtApiForVaip* create_org_api_hook();
4666
struct OrtVitisAIEpAPI {
4767
void (*initialize_onnxruntime_vitisai_ep)(vaip_core::OrtApiForVaip* api, std::vector<OrtCustomOpDomain*>& ret_domain);
@@ -50,7 +70,7 @@ struct OrtVitisAIEpAPI {
5070
std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>* (*compile_onnx_model_vitisai_ep_with_error_handling)(
5171
const std::string& model_path, const onnxruntime::Graph& graph, const onnxruntime::ProviderOptions& options, void* status, vaip_core::error_report_func func);
5272
uint32_t (*vaip_get_version)();
53-
void (*create_ep_context_nodes)(
73+
int (*create_ep_context_nodes)(
5474
const std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>& eps,
5575
vaip_core::DllSafe<std::vector<Node*>>* ret_value) = nullptr;
5676
int (*vitisai_ep_on_run_start)(
@@ -63,34 +83,54 @@ struct OrtVitisAIEpAPI {
6383
void (*profiler_collect)(
6484
std::vector<EventInfo>& api_events,
6585
std::vector<EventInfo>& kernel_events);
86+
int (*vaip_xcompiler_compile)(const char* input_xmodel,
87+
size_t input_xmodel_size,
88+
const char* config_xmodel,
89+
size_t config_xmodel_size, void* state,
90+
void (*k)(void*, void*, size_t)) = nullptr;
91+
const char* (*vaip_get_default_config)() = nullptr;
92+
int (*vaip_get_pattern_as_binary)(const char* name, void* state, void (*k)(void*, void*, size_t)) = nullptr;
93+
void (*vaip_get_pattern_list)(void* state, void (*k)(void*, void*, size_t)) = nullptr;
94+
int (*vaip_get_mem_xclbin)(const char* name, void* state, void (*k)(void*, void*, size_t)) = nullptr;
95+
bool (*vaip_has_mem_xclbin)(const char* name) = nullptr;
6696
void Ensure() {
6797
if (handle_)
6898
return;
99+
100+
this->initialize_onnxruntime_vitisai_ep = initialize_onnxruntime_vitisai_ep_c;
101+
this->compile_onnx_model_with_options = compile_onnx_model_with_options_c;
102+
this->compile_onnx_model_vitisai_ep_with_error_handling = compile_onnx_model_vitisai_ep_with_error_handling_c;
103+
this->create_ep_context_nodes = create_ep_context_nodes_c;
104+
this->vitisai_ep_on_run_start = vitisai_ep_on_run_start_c;
105+
this->vitisai_ep_set_ep_dynamic_options = vitisai_ep_set_ep_dynamic_options_c;
106+
this->vaip_get_version = vaip_get_version_c;
107+
this->profiler_collect = profiler_collect_c;
108+
69109
auto& env = Provider_GetHost()->Env__Default();
110+
auto& logger = *Provider_GetHost()->LoggingManager_GetDefaultLogger();
111+
70112
#ifdef _WIN32
71113
// this dll is already linked to the executable, normally a test program
72114
handle_ = reinterpret_cast<void*>(GetModuleHandle(TEXT("onnxruntime_vitisai_ep.dll")));
115+
auto status = Status::OK();
73116
if (!handle_) {
74117
auto full_path = env.GetRuntimePath() + PathString(LIBRARY_PREFIX ORT_TSTR("onnxruntime_vitisai_ep") LIBRARY_EXTENSION);
75-
ORT_THROW_IF_ERROR(env.LoadDynamicLibrary(full_path, true, &handle_));
118+
status = env.LoadDynamicLibrary(full_path, true, &handle_);
119+
if (!status.IsOK()) {
120+
LOGS(logger, VERBOSE) << "cannot load onnxruntime_vitisai_ep.dll, can only deploy ep_context onnx model.";
121+
return;
122+
}
76123
}
77124
#else
78125
auto full_path = env.GetRuntimePath() + PathString(LIBRARY_PREFIX ORT_TSTR("onnxruntime_vitisai_ep") LIBRARY_EXTENSION);
79126
ORT_THROW_IF_ERROR(env.LoadDynamicLibrary(full_path, true, &handle_));
80127
#endif
81-
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "initialize_onnxruntime_vitisai_ep", (void**)&initialize_onnxruntime_vitisai_ep));
82-
auto status1 = env.GetSymbolFromLibrary(handle_, "compile_onnx_model_vitisai_ep_with_error_handling", (void**)&compile_onnx_model_vitisai_ep_with_error_handling);
83-
auto status2 = env.GetSymbolFromLibrary(handle_, "compile_onnx_model_vitisai_ep_with_options", (void**)&compile_onnx_model_with_options);
84-
if ((!status1.IsOK()) && (!status2.IsOK())) {
85-
::onnxruntime::LogRuntimeError(0, status2, __FILE__, static_cast<const char*>(__FUNCTION__), __LINE__);
86-
ORT_THROW(status2);
87-
}
88-
std::ignore = env.GetSymbolFromLibrary(handle_, "vaip_get_version",
89-
(void**)&vaip_get_version);
90-
std::ignore = env.GetSymbolFromLibrary(handle_, "profiler_collect", (void**)&profiler_collect);
91-
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "create_ep_context_nodes", (void**)&create_ep_context_nodes));
92-
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vitisai_ep_on_run_start", (void**)&vitisai_ep_on_run_start));
93-
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vitisai_ep_set_ep_dynamic_options", (void**)&vitisai_ep_set_ep_dynamic_options));
128+
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vaip_xcompiler_compile", (void**)&vaip_xcompiler_compile));
129+
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vaip_get_default_config", (void**)&vaip_get_default_config));
130+
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vaip_get_pattern_as_binary", (void**)&vaip_get_pattern_as_binary));
131+
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vaip_get_pattern_list", (void**)&vaip_get_pattern_list));
132+
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vaip_get_mem_xclbin", (void**)&vaip_get_mem_xclbin));
133+
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vaip_has_mem_xclbin", (void**)&vaip_has_mem_xclbin));
94134
}
95135
void Clear() {
96136
if (handle_) {
@@ -484,6 +524,7 @@ vaip_core::OrtApiForVaip* create_org_api_hook() {
484524
}
485525
};
486526
the_global_api.node_arg_external_location = vaip::node_arg_external_location;
527+
487528
the_global_api.model_to_proto = [](onnxruntime::Model& model) { return model.ToProto().release(); };
488529
the_global_api.model_proto_serialize_as_string = [](ONNX_NAMESPACE::ModelProto& model_proto) {
489530
return vaip_core::DllSafe(model_proto.SerializeAsString());
@@ -503,6 +544,12 @@ vaip_core::OrtApiForVaip* create_org_api_hook() {
503544
the_global_api.graph_remove_initialized_tensor = [](Graph& graph, const std::string& tensor_name) {
504545
graph.RemoveInitializedTensor(tensor_name);
505546
};
547+
the_global_api.vaip_xcompiler_compile = s_library_vitisaiep.vaip_xcompiler_compile;
548+
the_global_api.vaip_get_default_config = s_library_vitisaiep.vaip_get_default_config;
549+
the_global_api.vaip_get_pattern_as_binary = s_library_vitisaiep.vaip_get_pattern_as_binary;
550+
the_global_api.vaip_get_pattern_list = s_library_vitisaiep.vaip_get_pattern_list;
551+
the_global_api.vaip_get_mem_xclbin = s_library_vitisaiep.vaip_get_mem_xclbin;
552+
the_global_api.vaip_has_mem_xclbin = s_library_vitisaiep.vaip_has_mem_xclbin;
506553
if (!s_library_vitisaiep.vaip_get_version) {
507554
return reinterpret_cast<vaip_core::OrtApiForVaip*>(&(the_global_api.host_));
508555
} else {

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

+11-1
Original file line numberDiff line numberDiff line change
@@ -235,14 +235,24 @@ struct OrtApiForVaip {
235235
DllSafe<std::string> (*model_proto_serialize_as_string)(ModelProto& model_proto); // [96]
236236
void (*model_proto_delete)(ModelProto* p); // [97]
237237
DllSafe<std::string> (*attr_proto_release_string)(AttributeProto* attr); // [98]
238-
bool (*is_profiling_enabled)(void* session_options); // [99] // [98]
238+
bool (*is_profiling_enabled)(void* session_options); // [99]
239239
TensorProto* (*tensor_proto_new_i4)(const std::string& name,
240240
const std::vector<int64_t>& shape,
241241
const std::vector<int8_t>& data); // [100]
242242
TensorProto* (*tensor_proto_new_u4)(const std::string& name,
243243
const std::vector<int64_t>& shape,
244244
const std::vector<uint8_t>& data); // [101]
245245
void (*graph_remove_initialized_tensor)(Graph& graph, const std::string& tensor_name); // [102]
246+
int (*vaip_xcompiler_compile)(const char* input_xmodel,
247+
size_t input_xmodel_size,
248+
const char* config_xmodel,
249+
size_t config_xmodel_size, void* state,
250+
void (*k)(void*, void*, size_t)); // [103]
251+
const char* (*vaip_get_default_config)(); // [104]
252+
int (*vaip_get_pattern_as_binary)(const char* name, void* state, void (*k)(void*, void*, size_t)); // [105]
253+
void (*vaip_get_pattern_list)(void* state, void (*k)(void*, void*, size_t)); // [106]
254+
int (*vaip_get_mem_xclbin)(const char* name, void* state, void (*k)(void*, void*, size_t)); // [107]
255+
bool (*vaip_has_mem_xclbin)(const char* name); // [108]
246256
};
247257

248258
#ifndef USE_VITISAI

0 commit comments

Comments
 (0)