From 59b13b7bbdd9888cfdfe52ebb87dd969f41e747e Mon Sep 17 00:00:00 2001 From: Yueqing Zhang Date: Thu, 30 May 2024 22:36:53 +0800 Subject: [PATCH] [VitisAI] update version and api & bug fix (#20851) ### Description 1. Use macro defined to check version number 2. Add a new api 3. Fix bug at attr_proto ### Motivation and Context These are some problems we need to address for the final delivery to Microsoft. --- .../providers/shared_library/provider_interfaces.h | 1 + .../providers/shared_library/provider_wrappedtypes.h | 1 + onnxruntime/core/providers/vitisai/imp/attr_proto.cc | 2 +- onnxruntime/core/providers/vitisai/imp/global_api.cc | 11 ++++++++--- .../providers/vitisai/include/vaip/vaip_ort_api.h | 9 +++++++-- onnxruntime/core/session/provider_bridge_ort.cc | 1 + 6 files changed, 19 insertions(+), 6 deletions(-) diff --git a/onnxruntime/core/providers/shared_library/provider_interfaces.h b/onnxruntime/core/providers/shared_library/provider_interfaces.h index 1adce5c25b..597ebe98ba 100644 --- a/onnxruntime/core/providers/shared_library/provider_interfaces.h +++ b/onnxruntime/core/providers/shared_library/provider_interfaces.h @@ -370,6 +370,7 @@ struct ProviderHost { virtual void AttributeProto__set_s(ONNX_NAMESPACE::AttributeProto* p, const ::std::string& value) = 0; virtual void AttributeProto__set_f(ONNX_NAMESPACE::AttributeProto* p, const float& value) = 0; virtual void AttributeProto__set_i(ONNX_NAMESPACE::AttributeProto* p, int64_t value) = 0; + virtual void AttributeProto__set_t(ONNX_NAMESPACE::AttributeProto* p, const ONNX_NAMESPACE::TensorProto& tensor) = 0; virtual const ::std::string& AttributeProto__s(const ONNX_NAMESPACE::AttributeProto* p) = 0; virtual void AttributeProto__set_name(ONNX_NAMESPACE::AttributeProto* p, const ::std::string& value) = 0; virtual void AttributeProto__set_type(ONNX_NAMESPACE::AttributeProto* p, ONNX_NAMESPACE::AttributeProto_AttributeType value) = 0; diff --git a/onnxruntime/core/providers/shared_library/provider_wrappedtypes.h b/onnxruntime/core/providers/shared_library/provider_wrappedtypes.h index 96aea7a0e0..125cd8fd92 100644 --- a/onnxruntime/core/providers/shared_library/provider_wrappedtypes.h +++ b/onnxruntime/core/providers/shared_library/provider_wrappedtypes.h @@ -107,6 +107,7 @@ struct AttributeProto final { void set_s(const ::std::string& value) { return g_host->AttributeProto__set_s(this, value); } void set_f(const float& value) { return g_host->AttributeProto__set_f(this, value); } void set_i(int64_t value) { return g_host->AttributeProto__set_i(this, value); } + void set_t(const TensorProto& value) { return g_host->AttributeProto__set_t(this, value); } const ::std::string& s() const { return g_host->AttributeProto__s(this); } void set_name(const ::std::string& value) { return g_host->AttributeProto__set_name(this, value); } void set_type(AttributeProto_AttributeType value) { return g_host->AttributeProto__set_type(this, value); } diff --git a/onnxruntime/core/providers/vitisai/imp/attr_proto.cc b/onnxruntime/core/providers/vitisai/imp/attr_proto.cc index 1392ecef1b..a9275b24ce 100644 --- a/onnxruntime/core/providers/vitisai/imp/attr_proto.cc +++ b/onnxruntime/core/providers/vitisai/imp/attr_proto.cc @@ -38,7 +38,7 @@ ONNX_NAMESPACE::AttributeProto* attr_proto_new_tensor( auto ret = ONNX_NAMESPACE::AttributeProto::Create(); ret->set_name(name); ret->set_type(ONNX_NAMESPACE::AttributeProto_AttributeType_TENSOR); - *ret->add_tensors() = value; + ret->set_t(value); return ret.release(); } ONNX_NAMESPACE::AttributeProto* attr_proto_new_ints(const std::string& name, const std::vector& value) { diff --git a/onnxruntime/core/providers/vitisai/imp/global_api.cc b/onnxruntime/core/providers/vitisai/imp/global_api.cc index ef08566b06..00fb8c1578 100644 --- a/onnxruntime/core/providers/vitisai/imp/global_api.cc +++ b/onnxruntime/core/providers/vitisai/imp/global_api.cc @@ -183,9 +183,9 @@ void initialize_vitisai_ep() { static void set_version_info(vaip_core::OrtApiForVaip& api) { const char* magic = "VAIP"; std::memcpy(reinterpret_cast(&api.magic), magic, sizeof(api.magic)); - api.major = 1u; - api.minor = 0u; - api.patch = 0u; + api.major = VAIP_ORT_API_MAJOR; + api.minor = VAIP_ORT_API_MINOR; + api.patch = VAIP_ORT_API_PATCH; } vaip_core::OrtApiForVaip* create_org_api_hook() { @@ -371,6 +371,11 @@ vaip_core::OrtApiForVaip* create_org_api_hook() { the_global_api.get_lib_id = []() -> vaip_core::DllSafe { return vaip_core::DllSafe(std::string(GIT_COMMIT_ID)); }; + + the_global_api.graph_add_initialized_tensor = [](Graph& graph, const ONNX_NAMESPACE::TensorProto& tensor) { + graph.AddInitializedTensor(tensor); + }; + if (!s_library_vitisaiep.vaip_get_version) { return reinterpret_cast(&(the_global_api.host_)); } else { 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 51de58fbdd..2c12d26fd2 100644 --- a/onnxruntime/core/providers/vitisai/include/vaip/vaip_ort_api.h +++ b/onnxruntime/core/providers/vitisai/include/vaip/vaip_ort_api.h @@ -12,6 +12,9 @@ struct OrtApi; namespace vaip_core { +#define VAIP_ORT_API_MAJOR (2u) +#define VAIP_ORT_API_MINOR (0u) +#define VAIP_ORT_API_PATCH (0u) struct OrtApiForVaip { uint32_t magic; // 'VAIP' or something else to make sure the following field // are not garbage. @@ -191,8 +194,10 @@ struct OrtApiForVaip { gsl::span (*tensor_proto_as_raw)( const TensorProto& tensor); // [79] - DllSafe (*get_lib_id)(); // [80] - DllSafe (*get_lib_name)(); // [81] + DllSafe (*get_lib_id)(); // [80] + DllSafe (*get_lib_name)(); // [81] + /** new API after 2.0 */ + void (*graph_add_initialized_tensor)(Graph& graph, const TensorProto& tensor); // [82] }; #ifndef USE_VITISAI diff --git a/onnxruntime/core/session/provider_bridge_ort.cc b/onnxruntime/core/session/provider_bridge_ort.cc index 3e5ec3662f..a27eb880da 100644 --- a/onnxruntime/core/session/provider_bridge_ort.cc +++ b/onnxruntime/core/session/provider_bridge_ort.cc @@ -472,6 +472,7 @@ struct ProviderHostImpl : ProviderHost { void AttributeProto__set_s(ONNX_NAMESPACE::AttributeProto* p, const ::std::string& value) override { return p->set_s(value); } void AttributeProto__set_f(ONNX_NAMESPACE::AttributeProto* p, const float& value) override { return p->set_f(value); } void AttributeProto__set_i(ONNX_NAMESPACE::AttributeProto* p, int64_t value) override { return p->set_i(value); } + void AttributeProto__set_t(ONNX_NAMESPACE::AttributeProto* p, const ONNX_NAMESPACE::TensorProto& value) override { *p->mutable_t() = value; } const ::std::string& AttributeProto__s(const ONNX_NAMESPACE::AttributeProto* p) override { return p->s(); } void AttributeProto__set_name(ONNX_NAMESPACE::AttributeProto* p, const ::std::string& value) override { return p->set_name(value); } void AttributeProto__set_type(ONNX_NAMESPACE::AttributeProto* p, ONNX_NAMESPACE::AttributeProto_AttributeType value) override { return p->set_type(value); }