@@ -99,9 +99,23 @@ struct TensorMetadata {
9999 std::string producer;
100100 std::string consumer;
101101 std::string device_type;
102+ std::string ep_type;
102103 size_t step;
103104};
104105
106+ std::string GetCleanedEpType (const Node& node) {
107+ std::string ep_type = node.GetExecutionProviderType ();
108+
109+ // Remove "ExecutionProvider" suffix from ep type to reduce length.
110+ const std::string suffix_to_remove = " ExecutionProvider" ;
111+ size_t pos = ep_type.find (suffix_to_remove);
112+ if (pos != std::string::npos) {
113+ ep_type.erase (pos, suffix_to_remove.length ());
114+ }
115+
116+ return ep_type;
117+ }
118+
105119bool FilterNode (const NodeDumpOptions& dump_options, const Node& node) {
106120 auto match_pattern =
107121 [](const std::string& value, const std::string& delimited_patterns) {
@@ -139,14 +153,18 @@ void DumpTensorToStdOut(const Tensor& tensor, const NodeDumpOptions& dump_option
139153 }
140154}
141155
142- PathString MakeTensorFileName (const std::string& tensor_name , const NodeDumpOptions& dump_options) {
156+ PathString MakeTensorFileName (const TensorMetadata& tensor_metadata , const NodeDumpOptions& dump_options) {
143157 auto make_valid_name = [](std::string name) {
144158 std::replace_if (
145159 name.begin (), name.end (), [](char c) { return !std::isalnum (c); }, ' _' );
146160 return name;
147161 };
148162
149- return path_utils::MakePathString (make_valid_name (tensor_name), dump_options.file_suffix , " .tensorproto" );
163+ if (dump_options.prepend_ep_to_file_name ) {
164+ return path_utils::MakePathString (make_valid_name (tensor_metadata.ep_type + " _" + tensor_metadata.name ), dump_options.file_suffix , " .tensorproto" );
165+ } else {
166+ return path_utils::MakePathString (make_valid_name (tensor_metadata.name ), dump_options.file_suffix , " .tensorproto" );
167+ }
150168}
151169
152170void DumpTensorToFile (const Tensor& tensor, const std::string& tensor_name, const std::filesystem::path& file_path) {
@@ -375,7 +393,7 @@ void DumpCpuTensor(
375393 break ;
376394 }
377395 case NodeDumpOptions::DataDestination::TensorProtoFiles: {
378- const std::filesystem::path tensor_file = dump_options.output_dir / MakeTensorFileName (tensor_metadata. name , dump_options);
396+ const std::filesystem::path tensor_file = dump_options.output_dir / MakeTensorFileName (tensor_metadata, dump_options);
379397 DumpTensorToFile (tensor, tensor_metadata.name , tensor_file);
380398 break ;
381399 }
@@ -485,6 +503,8 @@ const NodeDumpOptions& NodeDumpOptionsFromEnvironmentVariables() {
485503 debug_node_inputs_outputs_env_vars::kHalfOverflowThreshold , " shall be a positive integer <= " , kMaxHalfThreshold );
486504 opts.half_overflow_threshold = static_cast <float >(threshold);
487505
506+ opts.prepend_ep_to_file_name = ParseEnvironmentVariableWithDefault<bool >(env_vars::kPrependEpToFileName , false );
507+
488508 if (ParseEnvironmentVariableWithDefault<bool >(env_vars::kAppendRankToFileName , false )) {
489509 std::string rank = Env::Default ().GetEnvironmentVar (" OMPI_COMM_WORLD_RANK" );
490510 if (rank.empty ()) {
@@ -582,6 +602,7 @@ void DumpNodeInputs(
582602 tensor_metadata.name = input_defs[i]->Name ();
583603 tensor_metadata.step = dump_context.iteration ;
584604 tensor_metadata.consumer = node.Name () + " :" + std::to_string (i);
605+ tensor_metadata.ep_type = GetCleanedEpType (node);
585606
586607 TensorStatisticsData tensor_statistics;
587608 DumpTensor (dump_options, *tensor, tensor_metadata, tensor_statistics, session_state);
@@ -678,6 +699,7 @@ void DumpNodeOutputs(
678699 tensor_metadata.name = output_defs[i]->Name ();
679700 tensor_metadata.step = dump_context.iteration ;
680701 tensor_metadata.producer = node.Name () + " :" + std::to_string (i);
702+ tensor_metadata.ep_type = GetCleanedEpType (node);
681703
682704 TensorStatisticsData tensor_statistics;
683705 DumpTensor (dump_options, *tensor, tensor_metadata, tensor_statistics, session_state);
0 commit comments