From 6eeafca6e0ba186a64b13e527f541d5518671f33 Mon Sep 17 00:00:00 2001 From: Liu Minyue Date: Mon, 26 Aug 2024 03:28:08 -0600 Subject: [PATCH] Add some VitisAI EP C APIs fix compile error move configuration to vaip update vaip repo remote url add vaip_get_default_config API move pattern zoo to internal (#1) * move pattern zoo to internal * change external vaip --------- Co-authored-by: mingyue Co-authored-by: mingyue add get_patterrn_list API and change get_pattern API (#2) * add get_patterrn_list API and change get_pattern API * lintrunner -a --------- Co-authored-by: mingyue Co-authored-by: mingyue change xcompiler_compile API by CPS (#3) Co-authored-by: mingyue [deps] change vaip remote and branch Add vaip_get/has_mem_xclbin APIs (#4) * Add vaip_get/has_mem_xclbin APIs --------- Co-authored-by: mingyue vaip point to github/amd use main branch --- cmake/deps.txt | 2 +- .../external/onnxruntime_external_deps.cmake | 1 + cmake/onnxruntime_providers_vitisai.cmake | 12 ---- .../core/providers/vitisai/imp/global_api.cc | 55 +++++++++++++------ .../vitisai/include/vaip/vaip_ort_api.h | 7 ++- 5 files changed, 45 insertions(+), 32 deletions(-) diff --git a/cmake/deps.txt b/cmake/deps.txt index 2eb78d5756..d5ba9c48fe 100644 --- a/cmake/deps.txt +++ b/cmake/deps.txt @@ -60,4 +60,4 @@ directx_headers;https://github.com/microsoft/DirectX-Headers/archive/refs/tags/v cudnn_frontend;https://github.com/NVIDIA/cudnn-frontend/archive/refs/tags/v1.7.0.zip;d0753d8d5b39947ca0729d7773cb84653a129eb1 dawn;https://github.com/google/dawn/archive/12a3b24c456cebd9fd11f23ac0164f78129b00c6.zip;ad428f6dc16f1336d584f7bad5714e1097dafc43 kleidiai;https://gitlab.arm.com/kleidi/kleidiai/-/archive/d15722976120710080ca098fe8ddabf4556cb40f/kleidiai-d15722976120710080ca098fe8ddabf4556cb40f.zip;d6c840d00c3b05aedf06e957ddaece1013d1f40b -vaip;https://gitenterprise.xilinx.com/chunywan/vaip.git;refactor-vaip +vaip;https://github.com/amd/vaip.git;main diff --git a/cmake/external/onnxruntime_external_deps.cmake b/cmake/external/onnxruntime_external_deps.cmake index 773a5ee460..761ce47582 100644 --- a/cmake/external/onnxruntime_external_deps.cmake +++ b/cmake/external/onnxruntime_external_deps.cmake @@ -198,6 +198,7 @@ FetchContent_Declare( PATCH_COMMAND ${ONNXRUNTIME_PROTOBUF_PATCH_COMMAND} FIND_PACKAGE_ARGS NAMES Protobuf protobuf ) + set(protobuf_BUILD_TESTS OFF CACHE BOOL "Build protobuf tests" FORCE) #TODO: we'd better to turn the following option off. However, it will cause # ".\build.bat --config Debug --parallel --skip_submodule_sync --update" fail with an error message: diff --git a/cmake/onnxruntime_providers_vitisai.cmake b/cmake/onnxruntime_providers_vitisai.cmake index fa87cc4be3..3d7f631e42 100644 --- a/cmake/onnxruntime_providers_vitisai.cmake +++ b/cmake/onnxruntime_providers_vitisai.cmake @@ -8,18 +8,6 @@ GIT_SHALLOW TRUE OVERRIDE_FIND_PACKAGE ) - set(WITH_XCOMPILER ON CACHE BOOL "enable XCOMPILER") - set(WITH_OPENSSL OFF CACHE BOOL "enable open ssl") - set(WITH_CPURUNNER ON CACHE BOOL "enable cpu runner") - set(BUILD_PYTHON_EXT OFF CACHE BOOL "enable python ext") - set(EN_LLM_DOD_OPS OFF CACHE BOOL "enable dd flow") - set(EN_VAIML OFF CACHE BOOL "enable vaiml flow") - set(TRIM_CONFIG OFF CACHE BOOL "enable config trimming") - set(ENABLE_VITIS_AI_CUSTOM_OP OFF "enable vitis ai custom op") - set(PACK_XCLBIN_PATH "" CACHE STRING "list of xclbin files") - set(ENABLE_BUILD_VOE_WHEEL OFF CACHE BOOL "internal used only" FORCE) - set(INSTALL_USER ON CACHE BOOL "internal used only" FORCE) - set(ENABLE_XRT_SHARED_CONTEXT ON CACHE BOOL "internal used only" FORCE) find_package(vaip) if ("${GIT_COMMIT_ID}" STREQUAL "") diff --git a/onnxruntime/core/providers/vitisai/imp/global_api.cc b/onnxruntime/core/providers/vitisai/imp/global_api.cc index c017ce922d..bb9e306bcd 100644 --- a/onnxruntime/core/providers/vitisai/imp/global_api.cc +++ b/onnxruntime/core/providers/vitisai/imp/global_api.cc @@ -41,17 +41,15 @@ using namespace onnxruntime; #define LIBRARY_PREFIX "lib" #define LIBRARY_EXTENSION ".so" #endif - -namespace vaip_core { - -void initialize_onnxruntime_vitisai_ep(vaip_core::OrtApiForVaip* api, std::vector& ret_domain); -uint32_t vaip_get_version(); -extern "C" int create_ep_context_nodes( +extern "C" { +void initialize_onnxruntime_vitisai_ep_c(vaip_core::OrtApiForVaip* api, std::vector& ret_domain); +uint32_t vaip_get_version_c(); +int create_ep_context_nodes_c( const std::vector>& eps, vaip_core::DllSafe>* ret_value); -std::vector>* compile_onnx_model_with_options( +std::vector>* compile_onnx_model_with_options_c( const std::string& model_path, const onnxruntime::Graph& graph, const onnxruntime::ProviderOptions& options); -} // namespace vaip_core +}; vaip_core::OrtApiForVaip* create_org_api_hook(); struct OrtVitisAIEpAPI { void (*initialize_onnxruntime_vitisai_ep)(vaip_core::OrtApiForVaip* api, std::vector& ret_domain); @@ -77,13 +75,21 @@ struct OrtVitisAIEpAPI { size_t input_xmodel_size, const char* config_xmodel, size_t config_xmodel_size, void* state, - char* (*allocator)(void*, size_t)) = nullptr; + void (*k)(void*, void*, size_t)) = nullptr; + const char* (*vaip_get_default_config)() = nullptr; + int (*vaip_get_pattern_as_binary)(const char* name, void* state, void (*k)(void*, void*, size_t)) = nullptr; + void (*vaip_get_pattern_list)(void* state, void (*k)(void*, void*, size_t)) = nullptr; + int (*vaip_get_mem_xclbin)(const char* name, void* state, void (*k)(void*, void*, size_t)) = nullptr; + bool (*vaip_has_mem_xclbin)(const char* name) = nullptr; void Ensure() { - this->initialize_onnxruntime_vitisai_ep = vaip_core::initialize_onnxruntime_vitisai_ep; - this->compile_onnx_model_with_options = vaip_core::compile_onnx_model_with_options; - this->create_ep_context_nodes = vaip_core::create_ep_context_nodes; - this->vaip_get_version = vaip_core::vaip_get_version; - // + if (handle_) + return; + + this->initialize_onnxruntime_vitisai_ep = initialize_onnxruntime_vitisai_ep_c; + this->compile_onnx_model_with_options = compile_onnx_model_with_options_c; + this->create_ep_context_nodes = create_ep_context_nodes_c; + this->vaip_get_version = vaip_get_version_c; + auto& env = Provider_GetHost()->Env__Default(); auto& logger = *Provider_GetHost()->LoggingManager_GetDefaultLogger(); @@ -104,6 +110,11 @@ struct OrtVitisAIEpAPI { ORT_THROW_IF_ERROR(env.LoadDynamicLibrary(full_path, true, &handle_)); #endif ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vaip_xcompiler_compile", (void**)&vaip_xcompiler_compile)); + ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vaip_get_default_config", (void**)&vaip_get_default_config)); + ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vaip_get_pattern_as_binary", (void**)&vaip_get_pattern_as_binary)); + ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vaip_get_pattern_list", (void**)&vaip_get_pattern_list)); + ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vaip_get_mem_xclbin", (void**)&vaip_get_mem_xclbin)); + ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vaip_has_mem_xclbin", (void**)&vaip_has_mem_xclbin)); } void Clear() { if (handle_) { @@ -120,10 +131,9 @@ struct OrtVitisAIEpAPI { static OrtVitisAIEpAPI s_library_vitisaiep; static std::shared_ptr s_kernel_registry_vitisaiep; +static std::vector s_domains_vitisaiep; static vaip_core::OrtApiForVaip the_global_api; -g - std::shared_ptr - get_kernel_registry_vitisaiep() { return s_kernel_registry_vitisaiep; } +std::shared_ptr get_kernel_registry_vitisaiep() { return s_kernel_registry_vitisaiep; } const std::vector& get_domains_vitisaiep() { return s_domains_vitisaiep; } void profiler_collect( @@ -524,7 +534,16 @@ vaip_core::OrtApiForVaip* create_org_api_hook() { return &the_global_api; } the_global_api.vaip_xcompiler_compile = s_library_vitisaiep.vaip_xcompiler_compile; - return &the_global_api; + the_global_api.vaip_get_default_config = s_library_vitisaiep.vaip_get_default_config; + the_global_api.vaip_get_pattern_as_binary = s_library_vitisaiep.vaip_get_pattern_as_binary; + the_global_api.vaip_get_pattern_list = s_library_vitisaiep.vaip_get_pattern_list; + the_global_api.vaip_get_mem_xclbin = s_library_vitisaiep.vaip_get_mem_xclbin; + the_global_api.vaip_has_mem_xclbin = s_library_vitisaiep.vaip_has_mem_xclbin; + if (!s_library_vitisaiep.vaip_get_version) { + return reinterpret_cast(&(the_global_api.host_)); + } else { + return &the_global_api; + } } void deinitialize_vitisai_ep() { diff --git a/onnxruntime/core/providers/vitisai/include/vaip/vaip_ort_api.h b/onnxruntime/core/providers/vitisai/include/vaip/vaip_ort_api.h index 2494558b1a..9d999040c8 100644 --- a/onnxruntime/core/providers/vitisai/include/vaip/vaip_ort_api.h +++ b/onnxruntime/core/providers/vitisai/include/vaip/vaip_ort_api.h @@ -247,7 +247,12 @@ struct OrtApiForVaip { size_t input_xmodel_size, const char* config_xmodel, size_t config_xmodel_size, void* state, - char* (*allocator)(void*, size_t)); // [103] + void (*k)(void*, void*, size_t)); // [103] + const char* (*vaip_get_default_config)(); // [104] + int (*vaip_get_pattern_as_binary)(const char* name, void* state, void (*k)(void*, void*, size_t)); // [105] + void (*vaip_get_pattern_list)(void* state, void (*k)(void*, void*, size_t)); // [106] + int (*vaip_get_mem_xclbin)(const char* name, void* state, void (*k)(void*, void*, size_t)); // [107] + bool (*vaip_has_mem_xclbin)(const char* name); // [108] }; #ifndef USE_VITISAI