Skip to content

Commit 573d395

Browse files
adrastogiAditya Rastogi
andauthored
Proposed changes to model compilation telemetry (#26804)
### Description <!-- Describe your changes. --> This change adjusts the compilation telemetry to span the start and stop of the operation, with additional recording of various facets of the compilation session and information about the result. ### Motivation and Context <!-- - Why is this change required? What problem does it solve? - If it fixes an open issue, please link to the issue here. --> These changes enable deeper understanding of compilation usage and health, which in turn can help prioritize more investments in making compilation better overall for users of the platform (e.g., more reliable, performant, better tuned options / defaults, etc.). --------- Co-authored-by: Aditya Rastogi <adityar@ntdev.microsoft.com>
1 parent ed89ce7 commit 573d395

File tree

7 files changed

+237
-17
lines changed

7 files changed

+237
-17
lines changed

onnxruntime/core/platform/telemetry.cc

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,34 @@ void Telemetry::LogSessionCreation(uint32_t session_id, int64_t ir_version, cons
8181
ORT_UNUSED_PARAMETER(captureState);
8282
}
8383

84-
void Telemetry::LogCompileModel(uint32_t session_id) const {
84+
void Telemetry::LogCompileModelStart(uint32_t session_id,
85+
const std::string& input_source,
86+
const std::string& output_target,
87+
uint32_t flags,
88+
int graph_optimization_level,
89+
bool embed_ep_context,
90+
bool has_external_initializers_file,
91+
const std::vector<std::string>& execution_provider_ids) const {
8592
ORT_UNUSED_PARAMETER(session_id);
93+
ORT_UNUSED_PARAMETER(input_source);
94+
ORT_UNUSED_PARAMETER(output_target);
95+
ORT_UNUSED_PARAMETER(flags);
96+
ORT_UNUSED_PARAMETER(graph_optimization_level);
97+
ORT_UNUSED_PARAMETER(embed_ep_context);
98+
ORT_UNUSED_PARAMETER(has_external_initializers_file);
99+
ORT_UNUSED_PARAMETER(execution_provider_ids);
100+
}
101+
102+
void Telemetry::LogCompileModelComplete(uint32_t session_id,
103+
bool success,
104+
uint32_t error_code,
105+
uint32_t error_category,
106+
const std::string& error_message) const {
107+
ORT_UNUSED_PARAMETER(session_id);
108+
ORT_UNUSED_PARAMETER(success);
109+
ORT_UNUSED_PARAMETER(error_code);
110+
ORT_UNUSED_PARAMETER(error_category);
111+
ORT_UNUSED_PARAMETER(error_message);
86112
}
87113

88114
void Telemetry::LogRuntimeError(uint32_t session_id, const common::Status& status, const char* file,

onnxruntime/core/platform/telemetry.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,20 @@ class Telemetry {
6666
const std::string& loadedFrom, const std::vector<std::string>& execution_provider_ids,
6767
bool use_fp16, bool captureState) const;
6868

69-
virtual void LogCompileModel(uint32_t session_id) const;
69+
virtual void LogCompileModelStart(uint32_t session_id,
70+
const std::string& input_source,
71+
const std::string& output_target,
72+
uint32_t flags,
73+
int graph_optimization_level,
74+
bool embed_ep_context,
75+
bool has_external_initializers_file,
76+
const std::vector<std::string>& execution_provider_ids) const;
77+
78+
virtual void LogCompileModelComplete(uint32_t session_id,
79+
bool success,
80+
uint32_t error_code,
81+
uint32_t error_category,
82+
const std::string& error_message) const;
7083

7184
virtual void LogRuntimeError(uint32_t session_id, const common::Status& status, const char* file,
7285
const char* function, uint32_t line) const;

onnxruntime/core/platform/windows/telemetry.cc

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -334,18 +334,67 @@ void WindowsTelemetry::LogSessionCreation(uint32_t session_id, int64_t ir_versio
334334
}
335335
}
336336

337-
void WindowsTelemetry::LogCompileModel(uint32_t session_id) const {
337+
void WindowsTelemetry::LogCompileModelStart(uint32_t session_id,
338+
const std::string& input_source,
339+
const std::string& output_target,
340+
uint32_t flags,
341+
int graph_optimization_level,
342+
bool embed_ep_context,
343+
bool has_external_initializers_file,
344+
const std::vector<std::string>& execution_provider_ids) const {
338345
if (global_register_count_ == 0 || enabled_ == false)
339346
return;
340347

348+
std::string execution_provider_string;
349+
bool first = true;
350+
for (const auto& ep_id : execution_provider_ids) {
351+
if (first) {
352+
first = false;
353+
} else {
354+
execution_provider_string += ',';
355+
}
356+
execution_provider_string += ep_id;
357+
}
358+
341359
TraceLoggingWrite(telemetry_provider_handle,
342-
"CompileModel",
360+
"CompileModelStart",
343361
TraceLoggingBool(true, "UTCReplace_AppSessionGuid"),
344362
TelemetryPrivacyDataTag(PDT_ProductAndServiceUsage),
345363
TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES),
364+
TraceLoggingLevel(WINEVENT_LEVEL_INFO),
346365
// Telemetry info
347366
TraceLoggingUInt8(0, "schemaVersion"),
348-
TraceLoggingUInt32(session_id, "sessionId"));
367+
TraceLoggingUInt32(session_id, "sessionId"),
368+
TraceLoggingString(input_source.c_str(), "inputSource"),
369+
TraceLoggingString(output_target.c_str(), "outputTarget"),
370+
TraceLoggingUInt32(flags, "flags"),
371+
TraceLoggingInt32(graph_optimization_level, "graphOptimizationLevel"),
372+
TraceLoggingBool(embed_ep_context, "embedEpContext"),
373+
TraceLoggingBool(has_external_initializers_file, "hasExternalInitializersFile"),
374+
TraceLoggingString(execution_provider_string.c_str(), "executionProviderIds"));
375+
}
376+
377+
void WindowsTelemetry::LogCompileModelComplete(uint32_t session_id,
378+
bool success,
379+
uint32_t error_code,
380+
uint32_t error_category,
381+
const std::string& error_message) const {
382+
if (global_register_count_ == 0 || enabled_ == false)
383+
return;
384+
385+
TraceLoggingWrite(telemetry_provider_handle,
386+
"CompileModelComplete",
387+
TraceLoggingBool(true, "UTCReplace_AppSessionGuid"),
388+
TelemetryPrivacyDataTag(PDT_ProductAndServiceUsage),
389+
TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES),
390+
TraceLoggingLevel(WINEVENT_LEVEL_INFO),
391+
// Telemetry info
392+
TraceLoggingUInt8(0, "schemaVersion"),
393+
TraceLoggingUInt32(session_id, "sessionId"),
394+
TraceLoggingBool(success, "success"),
395+
TraceLoggingUInt32(error_code, "errorCode"),
396+
TraceLoggingUInt32(error_category, "errorCategory"),
397+
TraceLoggingString(error_message.c_str(), "errorMessage"));
349398
}
350399

351400
void WindowsTelemetry::LogRuntimeError(uint32_t session_id, const common::Status& status, const char* file,

onnxruntime/core/platform/windows/telemetry.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,20 @@ class WindowsTelemetry : public Telemetry {
5959
const std::string& loadedFrom, const std::vector<std::string>& execution_provider_ids,
6060
bool use_fp16, bool captureState) const override;
6161

62-
void LogCompileModel(uint32_t session_id) const override;
62+
void LogCompileModelStart(uint32_t session_id,
63+
const std::string& input_source,
64+
const std::string& output_target,
65+
uint32_t flags,
66+
int graph_optimization_level,
67+
bool embed_ep_context,
68+
bool has_external_initializers_file,
69+
const std::vector<std::string>& execution_provider_ids) const override;
70+
71+
void LogCompileModelComplete(uint32_t session_id,
72+
bool success,
73+
uint32_t error_code,
74+
uint32_t error_category,
75+
const std::string& error_message) const override;
6376

6477
void LogRuntimeError(uint32_t session_id, const common::Status& status, const char* file,
6578
const char* function, uint32_t line) const override;

onnxruntime/core/session/model_compilation_options.cc

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,5 +293,53 @@ Status ModelCompilationOptions::Check() const {
293293
return Status::OK();
294294
}
295295

296+
std::string ModelCompilationOptions::GetInputSourceForTelemetry() const {
297+
return InputModelComesFromFile() ? "file" : "buffer";
298+
}
299+
300+
std::string ModelCompilationOptions::GetOutputTargetForTelemetry() const {
301+
const epctx::ModelGenOptions& options = session_options_.value.ep_context_gen_options;
302+
303+
if (options.TryGetOutputModelPath() != nullptr) {
304+
return "file";
305+
}
306+
if (options.TryGetOutputModelBuffer() != nullptr) {
307+
return "buffer";
308+
}
309+
if (options.TryGetOutputModelWriteFunc() != nullptr) {
310+
return "callback";
311+
}
312+
313+
// Default: output path will be derived from input path
314+
return "file";
315+
}
316+
317+
uint32_t ModelCompilationOptions::GetFlagsForTelemetry() const {
318+
const epctx::ModelGenOptions& options = session_options_.value.ep_context_gen_options;
319+
uint32_t flags = OrtCompileApiFlags_NONE;
320+
321+
if (options.error_if_output_file_exists) {
322+
flags |= OrtCompileApiFlags_ERROR_IF_OUTPUT_FILE_EXISTS;
323+
}
324+
if (options.action_if_no_compiled_nodes == epctx::ModelGenOptions::ActionIfNoCompiledNodes::kReturnError) {
325+
flags |= OrtCompileApiFlags_ERROR_IF_NO_NODES_COMPILED;
326+
}
327+
328+
return flags;
329+
}
330+
331+
int ModelCompilationOptions::GetGraphOptimizationLevelForTelemetry() const {
332+
return static_cast<int>(session_options_.value.graph_optimization_level);
333+
}
334+
335+
bool ModelCompilationOptions::GetEmbedEpContextForTelemetry() const {
336+
return session_options_.value.ep_context_gen_options.embed_ep_context_in_model;
337+
}
338+
339+
bool ModelCompilationOptions::HasExternalInitializersFileForTelemetry() const {
340+
return session_options_.value.ep_context_gen_options.TryGetExternalInitializerFileInfo() != nullptr ||
341+
session_options_.value.ep_context_gen_options.TryGetInitializerHandler() != nullptr;
342+
}
343+
296344
} // namespace onnxruntime
297345
#endif // !defined(ORT_MINIMAL_BUILD)

onnxruntime/core/session/model_compilation_options.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,44 @@ class ModelCompilationOptions {
159159
/// <returns>An error status if the compilation options are invalid</returns>
160160
Status Check() const;
161161

162+
// Telemetry helper methods
163+
164+
/// <summary>
165+
/// Returns a string describing the input source type: "file" or "buffer".
166+
/// </summary>
167+
/// <returns>"file" or "buffer"</returns>
168+
std::string GetInputSourceForTelemetry() const;
169+
170+
/// <summary>
171+
/// Returns a string describing the output target type: "file", "buffer", or "callback".
172+
/// </summary>
173+
/// <returns>"file", "buffer", or "callback"</returns>
174+
std::string GetOutputTargetForTelemetry() const;
175+
176+
/// <summary>
177+
/// Returns the flags value for telemetry.
178+
/// </summary>
179+
/// <returns>The flags value</returns>
180+
uint32_t GetFlagsForTelemetry() const;
181+
182+
/// <summary>
183+
/// Returns the graph optimization level for telemetry.
184+
/// </summary>
185+
/// <returns>The graph optimization level as an integer</returns>
186+
int GetGraphOptimizationLevelForTelemetry() const;
187+
188+
/// <summary>
189+
/// Returns whether EP context embedding is enabled.
190+
/// </summary>
191+
/// <returns>True if EP context is embedded in model</returns>
192+
bool GetEmbedEpContextForTelemetry() const;
193+
194+
/// <summary>
195+
/// Returns whether external initializers file is configured.
196+
/// </summary>
197+
/// <returns>True if external initializers file is configured</returns>
198+
bool HasExternalInitializersFileForTelemetry() const;
199+
162200
private:
163201
void ResetInputModelSettings();
164202

onnxruntime/core/session/utils.cc

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#include "core/framework/error_code_helper.h"
1010
#include "core/framework/execution_provider.h"
1111
#include "core/framework/provider_options.h"
12+
#include "core/platform/env.h"
13+
#include "core/platform/telemetry.h"
1214
#include "core/session/abi_session_options_impl.h"
1315
#include "core/session/environment.h"
1416
#include "core/session/inference_session.h"
@@ -388,25 +390,56 @@ namespace onnxruntime {
388390
Status CompileModel(const Environment& env, const ModelCompilationOptions& model_compile_options) {
389391
ORT_RETURN_IF_ERROR(model_compile_options.Check());
390392

393+
const Telemetry& telemetry_provider = Env::Default().GetTelemetryProvider();
394+
391395
std::unique_ptr<onnxruntime::InferenceSession> session;
392396
const OrtSessionOptions* session_options = &model_compile_options.GetSessionOptions();
393397

398+
Status status;
399+
394400
if (model_compile_options.InputModelComesFromFile()) {
395401
const std::filesystem::path& input_model_path = model_compile_options.GetInputModelPath();
396-
ORT_RETURN_IF_ERROR(ToStatusAndRelease(CreateSessionAndLoadModelImpl(session_options, env,
397-
input_model_path.c_str(),
398-
nullptr, 0, session)));
402+
status = ToStatusAndRelease(CreateSessionAndLoadModelImpl(session_options, env,
403+
input_model_path.c_str(),
404+
nullptr, 0, session));
399405
} else {
400-
ORT_RETURN_IF_ERROR(
401-
ToStatusAndRelease(CreateSessionAndLoadModelImpl(session_options, env, nullptr,
402-
model_compile_options.GetInputModelData(),
403-
model_compile_options.GetInputModelDataSize(),
404-
session)));
406+
status = ToStatusAndRelease(CreateSessionAndLoadModelImpl(session_options, env, nullptr,
407+
model_compile_options.GetInputModelData(),
408+
model_compile_options.GetInputModelDataSize(),
409+
session));
405410
}
406411

407-
Env::Default().GetTelemetryProvider().LogCompileModel(session->GetCurrentSessionId());
408-
ORT_RETURN_IF_ERROR(ToStatusAndRelease(InitializeSession(session_options, *session)));
409-
return Status::OK();
412+
if (!status.IsOK()) {
413+
telemetry_provider.LogCompileModelComplete(
414+
0, // No session ID available
415+
false,
416+
static_cast<uint32_t>(status.Code()),
417+
static_cast<uint32_t>(status.Category()),
418+
status.ErrorMessage());
419+
return status;
420+
}
421+
422+
// Log start event now that we have the session ID and can get registered EP types
423+
telemetry_provider.LogCompileModelStart(
424+
session->GetCurrentSessionId(),
425+
model_compile_options.GetInputSourceForTelemetry(),
426+
model_compile_options.GetOutputTargetForTelemetry(),
427+
model_compile_options.GetFlagsForTelemetry(),
428+
model_compile_options.GetGraphOptimizationLevelForTelemetry(),
429+
model_compile_options.GetEmbedEpContextForTelemetry(),
430+
model_compile_options.HasExternalInitializersFileForTelemetry(),
431+
session->GetRegisteredProviderTypes());
432+
433+
status = ToStatusAndRelease(InitializeSession(session_options, *session));
434+
435+
telemetry_provider.LogCompileModelComplete(
436+
session->GetCurrentSessionId(),
437+
status.IsOK(),
438+
status.IsOK() ? 0 : static_cast<uint32_t>(status.Code()),
439+
status.IsOK() ? 0 : static_cast<uint32_t>(status.Category()),
440+
status.IsOK() ? "" : status.ErrorMessage());
441+
442+
return status;
410443
}
411444

412445
Status LoadPluginOrProviderBridge(const std::string& registration_name,

0 commit comments

Comments
 (0)