Skip to content

Commit c9ed016

Browse files
OVEP Dynamic WorkloadType support (microsoft#22779)
### Description Support to set EPdynamic options in OVEP ### Motivation and Context relate to microsoft#22282 --------- Co-authored-by: Javier E. Martinez <javier.e.martinez@intel.com>
1 parent 63cb532 commit c9ed016

File tree

7 files changed

+55
-9
lines changed

7 files changed

+55
-9
lines changed

onnxruntime/core/providers/openvino/backend_manager.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ GlobalContext& BackendManager::GetGlobalContext() {
2525
return global_context_;
2626
}
2727

28+
ov::CompiledModel& BackendManager::GetOVCompiledModel() {
29+
ov::CompiledModel& ov_ptr = concrete_backend_->GetOVCompiledModel();
30+
return (ov_ptr);
31+
}
32+
2833
BackendManager::BackendManager(const GlobalContext& global_context,
2934
const onnxruntime::Node& fused_node,
3035
const onnxruntime::GraphViewer& subgraph,
@@ -35,7 +40,7 @@ BackendManager::BackendManager(const GlobalContext& global_context,
3540
openvino_sdk_version_ = std::to_string(global_context_.OpenVINO_Version.at(0)) + "." +
3641
std::to_string(global_context_.OpenVINO_Version.at(1));
3742
if (ep_ctx_handle_.CheckForOVEPCtxNode(subgraph, openvino_sdk_version_)) {
38-
if (ep_ctx_handle_.ImportBlobFromEPCtxModel(subgraph) != Status::OK())
43+
if (ep_ctx_handle_.ImportBlobFromEPCtxModel(subgraph, global_context_.ep_context_embed_mode) != Status::OK())
3944
ORT_THROW("Import blob from model failed");
4045
}
4146

onnxruntime/core/providers/openvino/backend_manager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class BackendManager {
3030
GlobalContext& GetGlobalContext();
3131
Status ExportCompiledBlobAsEPCtxNode(const onnxruntime::GraphViewer& subgraph,
3232
const logging::Logger& logger);
33+
ov::CompiledModel& GetOVCompiledModel();
3334

3435
private:
3536
std::unique_ptr<ONNX_NAMESPACE::ModelProto> GetModelProtoFromFusedNode(

onnxruntime/core/providers/openvino/onnx_ctx_model_helper.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,12 @@ Status EPCtxHandler::ExportEPCtxModel(const GraphViewer& graph_viewer,
9494
return Status::OK();
9595
}
9696

97-
Status EPCtxHandler::ImportBlobFromEPCtxModel(const GraphViewer& graph_viewer) {
97+
Status EPCtxHandler::ImportBlobFromEPCtxModel(const GraphViewer& graph_viewer, bool& ep_context_embed_mode) {
9898
auto node = graph_viewer.GetNode(0);
9999
auto& attrs = node->GetAttributes();
100100
ORT_ENFORCE(attrs.count(EP_CACHE_CONTEXT) > 0);
101101
model_stream_ = std::make_shared<std::istringstream>(attrs.at(EP_CACHE_CONTEXT).s());
102+
ep_context_embed_mode = static_cast<bool>(attrs.at(EMBED_MODE).i());
102103
LOGS_DEFAULT(VERBOSE) << "[OpenVINO EP] Read blob from EPContext Node";
103104

104105
is_valid_ep_ctx_graph_ = true;

onnxruntime/core/providers/openvino/onnx_ctx_model_helper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class EPCtxHandler {
3030
const bool& ep_context_embed_mode,
3131
std::string&& model_blob_str,
3232
const std::string& openvino_sdk_version) const;
33-
Status ImportBlobFromEPCtxModel(const GraphViewer& graph_viewer);
33+
Status ImportBlobFromEPCtxModel(const GraphViewer& graph_viewer, bool& ep_context_embed_mode);
3434
bool CheckForOVEPCtxNode(const GraphViewer& graph_viewer, std::string openvino_sdk_version) const;
3535
bool IsValidOVEPCtxGraph() const { return is_valid_ep_ctx_graph_; }
3636
[[nodiscard]] const std::shared_ptr<std::istringstream> GetModelBlobStream() const { return model_stream_; }

onnxruntime/core/providers/openvino/openvino_execution_provider.cc

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
// Licensed under the MIT License
33
#include <filesystem>
44
#include <utility>
5-
5+
#include <string>
66
#include "core/providers/shared_library/provider_api.h"
77
#include "core/providers/openvino/openvino_execution_provider.h"
88
#include "core/providers/openvino/contexts.h"
99
#include "core/providers/openvino/backend_manager.h"
1010
#include "core/providers/openvino/onnx_ctx_model_helper.h"
1111
#include "core/providers/openvino/ov_versions/capability.h"
12+
#include "core/session/onnxruntime_session_options_config_keys.h"
1213
#include "openvino/core/version.hpp"
1314
#ifdef USE_OVEP_NPU_MEMORY
1415
#include "core/providers/openvino/ov_allocator.h"
@@ -150,7 +151,7 @@ common::Status OpenVINOExecutionProvider::Compile(
150151
graph_body_viewer,
151152
*GetLogger(),
152153
ep_ctx_handle_);
153-
154+
backend_manager_ = backend_manager;
154155
compute_info.create_state_func =
155156
[backend_manager](ComputeContext* context, FunctionState* state) {
156157
OpenVINOEPFunctionState* p = new OpenVINOEPFunctionState();
@@ -198,4 +199,37 @@ std::vector<AllocatorPtr> OpenVINOExecutionProvider::CreatePreferredAllocators()
198199
}
199200
#endif
200201

202+
common::Status OpenVINOExecutionProvider::SetEpDynamicOptions(gsl::span<const char* const> keys,
203+
gsl::span<const char* const> values) {
204+
std::string workload_type = "";
205+
// Ensure the number of keys and values match
206+
if (keys.size() != values.size()) {
207+
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "Mismatched keys and values sizes.");
208+
}
209+
210+
for (size_t i = 0; i < keys.size(); ++i) {
211+
std::string key = keys[i];
212+
std::string value = values[i];
213+
214+
if (key == kOrtEpDynamicOptionsWorkloadType) {
215+
if (value == "Efficient") {
216+
workload_type = "EFFICIENT";
217+
} else if (value == "Default") {
218+
workload_type = "DEFAULT";
219+
} else {
220+
LOGS_DEFAULT(WARNING) << "Unknown workload_type - ignoring " << key << "/" << value;
221+
LOGS_DEFAULT(WARNING) << "Supported types are 'Efficient' and 'Default' \n";
222+
}
223+
if (workload_type != "") {
224+
LOGS_DEFAULT(INFO) << "SetEpDynamicOptions - modifying: " << key << "/" << value;
225+
ov::CompiledModel& ov_compiled_model = backend_manager_->GetOVCompiledModel();
226+
ov_compiled_model.set_property(ov::workload_type(workload_type));
227+
}
228+
} else {
229+
// Handle unknown options
230+
LOGS_DEFAULT(WARNING) << "Unknown key/value pair - ignoring " << key << "/" << value;
231+
}
232+
}
233+
return Status::OK();
234+
}
201235
} // namespace onnxruntime

onnxruntime/core/providers/openvino/openvino_execution_provider.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ class OpenVINOExecutionProvider : public IExecutionProvider {
188188
Status Compile(const std::vector<FusedNodeAndGraph>& fused_nodes,
189189
std::vector<NodeComputeInfo>& node_compute_funcs) override;
190190

191+
Status SetEpDynamicOptions(gsl::span<const char* const> /*keys*/,
192+
gsl::span<const char* const> /*values*/) override;
193+
191194
const void* GetExecutionHandle() const noexcept override {
192195
return nullptr;
193196
}
@@ -197,6 +200,7 @@ class OpenVINOExecutionProvider : public IExecutionProvider {
197200
private:
198201
std::unique_ptr<openvino_ep::GlobalContext> global_context_;
199202
openvino_ep::EPCtxHandler ep_ctx_handle_{};
203+
std::shared_ptr<openvino_ep::BackendManager> backend_manager_;
200204
};
201205

202206
} // namespace onnxruntime

onnxruntime/core/providers/openvino/openvino_provider_factory.cc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "core/providers/openvino/openvino_provider_factory.h"
88
#include "core/providers/openvino/openvino_execution_provider.h"
99
#include "core/providers/openvino/openvino_provider_factory_creator.h"
10+
#include "core/session/onnxruntime_session_options_config_keys.h"
1011
#include "nlohmann/json.hpp"
1112

1213
namespace onnxruntime {
@@ -50,10 +51,10 @@ struct OpenVINOProviderFactory : IExecutionProviderFactory {
5051
};
5152

5253
std::unique_ptr<IExecutionProvider> OpenVINOProviderFactory::CreateProvider() {
53-
bool so_disable_cpu_fallback = config_options_.GetConfigOrDefault("session.disable_cpu_ep_fallback", "0") == "1";
54-
bool so_export_ep_ctx_blob = config_options_.GetConfigOrDefault("ep.context_enable", "0") == "1";
55-
bool so_epctx_embed_mode = config_options_.GetConfigOrDefault("ep.context_embed_mode", "1") == "1";
56-
std::string so_cache_path = config_options_.GetConfigOrDefault("ep.context_file_path", "").c_str();
54+
bool so_disable_cpu_fallback = config_options_.GetConfigOrDefault(kOrtSessionOptionsDisableCPUEPFallback, "0") == "1";
55+
bool so_export_ep_ctx_blob = config_options_.GetConfigOrDefault(kOrtSessionOptionEpContextEnable, "0") == "1";
56+
bool so_epctx_embed_mode = config_options_.GetConfigOrDefault(kOrtSessionOptionEpContextEmbedMode, "1") == "1";
57+
std::string so_cache_path = config_options_.GetConfigOrDefault(kOrtSessionOptionEpContextFilePath, "").c_str();
5758

5859
if (so_export_ep_ctx_blob && !so_cache_path.empty()) {
5960
cache_dir_ = so_cache_path;

0 commit comments

Comments
 (0)