Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 3 additions & 23 deletions xprof/convert/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -2414,8 +2414,10 @@ cc_library(
":xplane_to_step_events",
"@com_google_absl//absl/container:btree",
"@com_google_absl//absl/container:flat_hash_map",
"@com_google_absl//absl/container:flat_hash_set",
"@com_google_absl//absl/status:statusor",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/types:span",
"@com_google_protobuf//:protobuf",
"@org_xprof//plugin/xprof/protobuf:event_time_fraction_analyzer_proto_cc",
"@org_xprof//xprof/utils:event_span",
Expand All @@ -2441,41 +2443,19 @@ cc_library(
":xspace_to_event_time_fraction_analyzer",
"@com_google_absl//absl/status",
"@com_google_absl//absl/status:statusor",
"@com_google_absl//absl/time",
"@com_google_absl//absl/strings",
"@com_google_protobuf//:protobuf",
"@org_xprof//plugin/xprof/protobuf:event_time_fraction_analyzer_proto_cc",
"@tsl//tsl/profiler/protobuf:xplane_proto_cc",
"@xla//xla/tsl/platform:errors",
"@xla//xla/tsl/platform:statusor",
],
alwayslink = 1,
)

cc_library(
name = "multi_xspace_to_event_time_fraction_analyzer",
srcs = ["multi_xspace_to_event_time_fraction_analyzer.cc"],
hdrs = ["xspace_to_event_time_fraction_analyzer.h"],
deps = [
":event_time_fraction_analyzer_processor",
":repository",
":tool_options",
":xplane_to_tools_data_with_profile_processor",
":xspace_to_event_time_fraction_analyzer",
"@com_google_absl//absl/status",
"@com_google_absl//absl/status:statusor",
"@com_google_absl//absl/strings",
"@org_xprof//plugin/xprof/protobuf:event_time_fraction_analyzer_proto_cc",
"@tsl//tsl/profiler/protobuf:xplane_proto_cc",
"@xla//xla/tsl/platform:errors",
"@xla//xla/tsl/platform:statusor",
],
)

cc_test(
name = "xspace_to_event_time_fraction_analyzer_test",
srcs = ["xspace_to_event_time_fraction_analyzer_test.cc"],
deps = [
":multi_xspace_to_event_time_fraction_analyzer",
":repository",
":xspace_to_event_time_fraction_analyzer",
"@com_google_absl//absl/status:statusor",
Expand Down
105 changes: 57 additions & 48 deletions xprof/convert/event_time_fraction_analyzer_processor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,18 @@ See the License for the specific language governing permissions and
limitations under the License.
==============================================================================*/

#include "xprof/convert/event_time_fraction_analyzer_processor.h"

#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <variant>
#include <vector>
#include <optional>

#include "xprof/convert/event_time_fraction_analyzer_processor.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_split.h"
#include "google/protobuf/arena.h"
#include "xla/tsl/platform/statusor.h"
#include "tsl/profiler/protobuf/xplane.pb.h"
Expand All @@ -37,20 +39,21 @@ limitations under the License.
namespace xprof {
namespace {

using ::tensorflow::profiler::ConvertXSpaceToEventTimeFractionAnalyzerResult;
using ::tensorflow::profiler::ConvertXSpaceToEventTimeFractionAnalyzerResults;
using ::tensorflow::profiler::EventTimeFractionAnalyzerResult;
using ::tensorflow::profiler::EventTimeFractionAnalyzerResults;
using ::tensorflow::profiler::PreprocessSingleHostXSpace;
using ::tensorflow::profiler::SessionSnapshot;
using ::tensorflow::profiler::ToolOptions;
using ::tensorflow::profiler::XSpace;

std::string GetTargetEventName(const ToolOptions& options) {
std::vector<std::string> GetTargetEventNames(const ToolOptions& options) {
for (const auto& [key, value] : options) {
if (key == "event_name" && std::holds_alternative<std::string>(value)) {
return std::get<std::string>(value);
return absl::StrSplit(std::get<std::string>(value), ',');
}
}
return "";
return {};
}

std::unique_ptr<ProfileProcessor> CreateEventTimeFractionAnalyzerProcessor(
Expand All @@ -61,24 +64,30 @@ std::unique_ptr<ProfileProcessor> CreateEventTimeFractionAnalyzerProcessor(
RegisterProfileProcessor event_time_fraction_analyzer_processor_registration(
"event_time_fraction_analyzer", CreateEventTimeFractionAnalyzerProcessor);

void AccumulateEventTimeFractionAnalyzerResult(
const EventTimeFractionAnalyzerResult& result,
EventTimeFractionAnalyzerResult& combined_result) {
for (const auto& [chip_id, fractions] : result.chip_event_time_fractions()) {
if (combined_result.chip_event_time_fractions().contains(chip_id)) {
auto& existing_fractions =
(*combined_result.mutable_chip_event_time_fractions())[chip_id];
existing_fractions.mutable_event_time_fractions()->Add(
void AccumulateEventTimeFractionAnalyzerResults(
const EventTimeFractionAnalyzerResults& results,
EventTimeFractionAnalyzerResults& combined_results) {
for (const auto& [target_event_name, result] : results.results()) {
auto* combined_result =
&(*combined_results.mutable_results())[target_event_name];
for (const auto& [chip_id, fractions] :
result.chip_event_time_fractions()) {
auto& combined_fractions =
(*combined_result->mutable_chip_event_time_fractions())[chip_id];
combined_fractions.set_id(chip_id);
combined_fractions.mutable_event_time_fractions()->Add(
fractions.event_time_fractions().begin(),
fractions.event_time_fractions().end());
}
for (const auto& [host_name, fractions] :
result.host_event_time_fractions()) {
auto& combined_fractions =
(*combined_result->mutable_host_event_time_fractions())[host_name];
combined_fractions.set_hostname(host_name);
combined_fractions.mutable_event_time_fractions()->Add(
fractions.event_time_fractions().begin(),
fractions.event_time_fractions().end());
} else {
combined_result.mutable_chip_event_time_fractions()->insert(
{chip_id, fractions});
}
}
for (const auto& [hostname, fractions] : result.host_event_time_fractions()) {
combined_result.mutable_host_event_time_fractions()->insert(
{hostname, fractions});
}
}

Expand All @@ -94,11 +103,11 @@ absl::StatusOr<std::string> EventTimeFractionAnalyzerProcessor::Map(
}
PreprocessSingleHostXSpace(&xspace_copy, /*step_grouping=*/true,
/*derived_timeline=*/true);
std::string target_event_name = GetTargetEventName(options_);
TF_ASSIGN_OR_RETURN(EventTimeFractionAnalyzerResult result,
ConvertXSpaceToEventTimeFractionAnalyzerResult(
xspace_copy, target_event_name));
return result.SerializeAsString();
std::vector<std::string> target_event_names = GetTargetEventNames(options_);
TF_ASSIGN_OR_RETURN(EventTimeFractionAnalyzerResults results,
ConvertXSpaceToEventTimeFractionAnalyzerResults(
xspace_copy, target_event_names));
return results.SerializeAsString();
}

absl::StatusOr<std::string> EventTimeFractionAnalyzerProcessor::Map(
Expand All @@ -108,63 +117,63 @@ absl::StatusOr<std::string> EventTimeFractionAnalyzerProcessor::Map(
SessionSnapshot session_snapshot,
SessionSnapshot::Create(xspace_paths, /*xspaces=*/std::nullopt));

EventTimeFractionAnalyzerResult combined_result;
EventTimeFractionAnalyzerResults combined_results;
for (int i = 0; i < session_snapshot.XSpaceSize(); ++i) {
google::protobuf::Arena arena;
TF_ASSIGN_OR_RETURN(XSpace * xspace, session_snapshot.GetXSpace(i, &arena));
std::string hostname = session_snapshot.GetHostname(i);
TF_ASSIGN_OR_RETURN(std::string serialized_result,
TF_ASSIGN_OR_RETURN(std::string serialized_results,
Map(session_snapshot, hostname, *xspace));
EventTimeFractionAnalyzerResult result;
if (!result.ParseFromString(serialized_result)) {
EventTimeFractionAnalyzerResults results;
if (!results.ParseFromString(serialized_results)) {
return absl::InternalError(
"Failed to parse EventTimeFractionAnalyzerResult from map output");
"Failed to parse EventTimeFractionAnalyzerResults from map output");
}
AccumulateEventTimeFractionAnalyzerResult(result, combined_result);
AccumulateEventTimeFractionAnalyzerResults(results, combined_results);
}

if (combined_result.SerializeAsString().empty()) {
if (combined_results.SerializeAsString().empty()) {
return absl::InternalError(
"Failed to serialize EventTimeFractionAnalyzerResult");
"Failed to serialize EventTimeFractionAnalyzerResults");
}
return combined_result.SerializeAsString();
return combined_results.SerializeAsString();
}

absl::Status EventTimeFractionAnalyzerProcessor::Reduce(
const SessionSnapshot& session_snapshot,
const std::vector<std::string>& map_output_files) {
EventTimeFractionAnalyzerResult combined_result;
EventTimeFractionAnalyzerResults combined_results;

for (const auto& map_output_file : map_output_files) {
EventTimeFractionAnalyzerResult result;
if (!result.ParseFromString(map_output_file)) {
EventTimeFractionAnalyzerResults results;
if (!results.ParseFromString(map_output_file)) {
return absl::InternalError(
"Failed to parse EventTimeFractionAnalyzerResult from map output");
"Failed to parse EventTimeFractionAnalyzerResults from map output");
}
AccumulateEventTimeFractionAnalyzerResult(result, combined_result);
AccumulateEventTimeFractionAnalyzerResults(results, combined_results);
}

data_ = combined_result.SerializeAsString();
data_ = combined_results.SerializeAsString();
return absl::OkStatus();
}

absl::Status EventTimeFractionAnalyzerProcessor::ProcessSession(
const SessionSnapshot& session_snapshot, const ToolOptions& options) {
EventTimeFractionAnalyzerResult combined_result;
EventTimeFractionAnalyzerResults combined_results;
for (int i = 0; i < session_snapshot.XSpaceSize(); i++) {
google::protobuf::Arena arena;
TF_ASSIGN_OR_RETURN(XSpace * xspace, session_snapshot.GetXSpace(i, &arena));
std::string hostname = session_snapshot.GetHostname(i);
TF_ASSIGN_OR_RETURN(std::string serialized_result,
TF_ASSIGN_OR_RETURN(std::string serialized_results,
Map(session_snapshot, hostname, *xspace));
EventTimeFractionAnalyzerResult result;
if (!result.ParseFromString(serialized_result)) {
EventTimeFractionAnalyzerResults results;
if (!results.ParseFromString(serialized_results)) {
return absl::InternalError(
"Failed to parse EventTimeFractionAnalyzerResult from map output");
"Failed to parse EventTimeFractionAnalyzerResults from map output");
}
AccumulateEventTimeFractionAnalyzerResult(result, combined_result);
AccumulateEventTimeFractionAnalyzerResults(results, combined_results);
}
data_ = combined_result.SerializeAsString();
data_ = combined_results.SerializeAsString();
return absl::OkStatus();
}

Expand Down
53 changes: 0 additions & 53 deletions xprof/convert/multi_xspace_to_event_time_fraction_analyzer.cc

This file was deleted.

5 changes: 2 additions & 3 deletions xprof/convert/smart_suggestion/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -66,29 +66,28 @@ cc_library(
name = "tool_data_provider_impl",
hdrs = ["tool_data_provider_impl.h"],
deps = [
":constants",
":tool_data_provider",
"@com_google_absl//absl/base:core_headers",
"@com_google_absl//absl/container:flat_hash_map",
"@com_google_absl//absl/status",
"@com_google_absl//absl/status:statusor",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/strings:string_view",
"@com_google_absl//absl/synchronization",
"@com_google_protobuf//:json",
"@org_xprof//plugin/xprof/protobuf:event_time_fraction_analyzer_proto_cc",
"@org_xprof//plugin/xprof/protobuf:input_pipeline_proto_cc",
"@org_xprof//plugin/xprof/protobuf:memory_profile_proto_cc",
"@org_xprof//plugin/xprof/protobuf:op_profile_proto_cc",
"@org_xprof//plugin/xprof/protobuf:op_stats_proto_cc",
"@org_xprof//plugin/xprof/protobuf:overview_page_proto_cc",
"@org_xprof//xprof/convert:multi_xplanes_to_op_stats",
"@org_xprof//xprof/convert:multi_xspace_to_event_time_fraction_analyzer",
"@org_xprof//xprof/convert:op_stats_to_input_pipeline_analysis",
"@org_xprof//xprof/convert:op_stats_to_op_profile",
"@org_xprof//xprof/convert:op_stats_to_overview_page",
"@org_xprof//xprof/convert:repository",
"@org_xprof//xprof/convert:tool_options",
"@org_xprof//xprof/convert:xplane_to_tools_data_with_profile_processor",
"@org_xprof//xprof/convert:xspace_to_event_time_fraction_analyzer",
"@xla//xla/tsl/platform:errors",
"@xla//xla/tsl/platform:statusor",
],
Expand Down
5 changes: 5 additions & 0 deletions xprof/convert/smart_suggestion/constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@ inline constexpr double kMemoryUtilizationHighThreshold = 50;
// A small number to compare floating point numbers with zero.
inline constexpr double kZeroEpsilon = 1e-6;

// The events to be parsed by EventTimeFractionAnalyzer for smart suggestion.
// Currently it includes barrier-cores and debug_print.
inline constexpr char kEventTimeFractionAnalyzerEvents[] =
"barrier-cores,debug_print";

} // namespace profiler
} // namespace tensorflow

Expand Down
Loading
Loading