Add a const string for the idle op's name and set the idle op's occurrences to 0.
PiperOrigin-RevId: 302903407 Change-Id: Id59e1013d229827feb6f429450f603620b7b30d0
This commit is contained in:
parent
aab9efbcec
commit
2faa541d42
|
@ -37,6 +37,7 @@ tf_cc_test(
|
||||||
"//tensorflow/core:test",
|
"//tensorflow/core:test",
|
||||||
"//tensorflow/core:test_main",
|
"//tensorflow/core:test_main",
|
||||||
"//tensorflow/core/profiler/protobuf:op_metrics_proto_cc",
|
"//tensorflow/core/profiler/protobuf:op_metrics_proto_cc",
|
||||||
|
"//tensorflow/core/profiler/utils:op_metrics_db_utils",
|
||||||
"//tensorflow/core/profiler/utils:time_utils",
|
"//tensorflow/core/profiler/utils:time_utils",
|
||||||
"//tensorflow/core/profiler/utils:xplane_builder",
|
"//tensorflow/core/profiler/utils:xplane_builder",
|
||||||
"//tensorflow/core/profiler/utils:xplane_schema",
|
"//tensorflow/core/profiler/utils:xplane_schema",
|
||||||
|
|
|
@ -57,7 +57,7 @@ TfStatsTable GenerateTfStatsTable(const OpMetricsDb& host_tf_metrics_db,
|
||||||
}
|
}
|
||||||
double total_device_time_us = PicosToMicros(total_device_time_ps);
|
double total_device_time_us = PicosToMicros(total_device_time_ps);
|
||||||
for (const OpMetrics* metrics : SortedOpMetricsDb(device_tf_metrics_db)) {
|
for (const OpMetrics* metrics : SortedOpMetricsDb(device_tf_metrics_db)) {
|
||||||
if (exclude_idle && metrics->category() == "IDLE") continue;
|
if (exclude_idle && IsIdleOp(*metrics)) continue;
|
||||||
TfStatsRecord* record = tf_stats_table.add_tf_stats_record();
|
TfStatsRecord* record = tf_stats_table.add_tf_stats_record();
|
||||||
*record = ConvertOpMetricsToTfStatsRecord(
|
*record = ConvertOpMetricsToTfStatsRecord(
|
||||||
/*on_device=*/true, *metrics, ridge_point);
|
/*on_device=*/true, *metrics, ridge_point);
|
||||||
|
@ -73,7 +73,7 @@ TfStatsTable GenerateTfStatsTable(const OpMetricsDb& host_tf_metrics_db,
|
||||||
double total_host_time_us = PicosToMicros(total_host_time_ps);
|
double total_host_time_us = PicosToMicros(total_host_time_ps);
|
||||||
for (const OpMetrics* metrics :
|
for (const OpMetrics* metrics :
|
||||||
tensorflow::profiler::SortedOpMetricsDb(host_tf_metrics_db)) {
|
tensorflow::profiler::SortedOpMetricsDb(host_tf_metrics_db)) {
|
||||||
if (exclude_idle && metrics->category() == "IDLE") continue;
|
if (exclude_idle && IsIdleOp(*metrics)) continue;
|
||||||
TfStatsRecord* record = tf_stats_table.add_tf_stats_record();
|
TfStatsRecord* record = tf_stats_table.add_tf_stats_record();
|
||||||
*record = ConvertOpMetricsToTfStatsRecord(
|
*record = ConvertOpMetricsToTfStatsRecord(
|
||||||
/*on_device=*/false, *metrics, ridge_point);
|
/*on_device=*/false, *metrics, ridge_point);
|
||||||
|
|
|
@ -17,6 +17,7 @@ limitations under the License.
|
||||||
|
|
||||||
#include "tensorflow/core/platform/test.h"
|
#include "tensorflow/core/platform/test.h"
|
||||||
#include "tensorflow/core/profiler/protobuf/op_metrics.pb.h"
|
#include "tensorflow/core/profiler/protobuf/op_metrics.pb.h"
|
||||||
|
#include "tensorflow/core/profiler/utils/op_metrics_db_utils.h"
|
||||||
#include "tensorflow/core/profiler/utils/time_utils.h"
|
#include "tensorflow/core/profiler/utils/time_utils.h"
|
||||||
#include "tensorflow/core/profiler/utils/xplane_builder.h"
|
#include "tensorflow/core/profiler/utils/xplane_builder.h"
|
||||||
#include "tensorflow/core/profiler/utils/xplane_schema.h"
|
#include "tensorflow/core/profiler/utils/xplane_schema.h"
|
||||||
|
@ -85,7 +86,7 @@ TEST(ConvertXPlaneToOpMetricsDb, HostOpMetricsDb) {
|
||||||
EXPECT_EQ(NanosToPicos(kTfOp1DurationNs) * 2, op_1.time_ps());
|
EXPECT_EQ(NanosToPicos(kTfOp1DurationNs) * 2, op_1.time_ps());
|
||||||
|
|
||||||
const OpMetrics& idle = op_metrics.metrics_db().at(1);
|
const OpMetrics& idle = op_metrics.metrics_db().at(1);
|
||||||
EXPECT_EQ("IDLE", idle.name());
|
EXPECT_EQ(kIdle, idle.name());
|
||||||
// Idle time is the gap between Op2 start and the end of Op1, which is 2000ns.
|
// Idle time is the gap between Op2 start and the end of Op1, which is 2000ns.
|
||||||
EXPECT_EQ(NanosToPicos(2000), idle.time_ps());
|
EXPECT_EQ(NanosToPicos(2000), idle.time_ps());
|
||||||
|
|
||||||
|
@ -149,7 +150,7 @@ TEST(ConvertXPlaneToOpMetricsDb, DeviceOpMetricsDb) {
|
||||||
EXPECT_EQ(NanosToPicos(kTfOp2DurationNs), op_2.time_ps());
|
EXPECT_EQ(NanosToPicos(kTfOp2DurationNs), op_2.time_ps());
|
||||||
|
|
||||||
const OpMetrics& idle = op_metrics.metrics_db().at(2);
|
const OpMetrics& idle = op_metrics.metrics_db().at(2);
|
||||||
EXPECT_EQ("IDLE", idle.name());
|
EXPECT_EQ(kIdle, idle.name());
|
||||||
// GPU is always busy in this example.
|
// GPU is always busy in this example.
|
||||||
EXPECT_EQ(NanosToPicos(0), idle.time_ps());
|
EXPECT_EQ(NanosToPicos(0), idle.time_ps());
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,9 @@ limitations under the License.
|
||||||
|
|
||||||
namespace tensorflow {
|
namespace tensorflow {
|
||||||
namespace profiler {
|
namespace profiler {
|
||||||
|
|
||||||
|
const absl::string_view kIdle = "IDLE";
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
class DeviceTfOpMetricsDbBuilder : public OpMetricsDbBuilder {
|
class DeviceTfOpMetricsDbBuilder : public OpMetricsDbBuilder {
|
||||||
|
@ -85,9 +88,9 @@ uint64 IdleTimePs(const OpMetricsDb& metrics_db) {
|
||||||
void AddIdleOp(OpMetricsDb* db) {
|
void AddIdleOp(OpMetricsDb* db) {
|
||||||
uint64 idle_time_ps = IdleTimePs(*db);
|
uint64 idle_time_ps = IdleTimePs(*db);
|
||||||
OpMetrics* metrics = db->add_metrics_db();
|
OpMetrics* metrics = db->add_metrics_db();
|
||||||
metrics->set_name("IDLE");
|
metrics->set_name(string(kIdle));
|
||||||
metrics->set_category("IDLE");
|
metrics->set_category(string(kIdle));
|
||||||
metrics->set_occurrences(1);
|
metrics->set_occurrences(0);
|
||||||
metrics->set_time_ps(idle_time_ps);
|
metrics->set_time_ps(idle_time_ps);
|
||||||
metrics->set_self_time_ps(idle_time_ps);
|
metrics->set_self_time_ps(idle_time_ps);
|
||||||
}
|
}
|
||||||
|
@ -102,9 +105,9 @@ OpMetricsDb CreateTfMetricsDbFromDeviceOpMetricsDb(
|
||||||
builder.UpdateTfOpMetricsWithDeviceOpMetrics(tf_op.name, tf_op.type,
|
builder.UpdateTfOpMetricsWithDeviceOpMetrics(tf_op.name, tf_op.type,
|
||||||
device_op_metrics);
|
device_op_metrics);
|
||||||
} else {
|
} else {
|
||||||
DCHECK_EQ(device_op_metrics.name(), "IDLE");
|
DCHECK(IsIdleOp(device_op_metrics));
|
||||||
if (with_idle) {
|
if (with_idle) {
|
||||||
builder.UpdateTfOpMetricsWithDeviceOpMetrics("IDLE", "IDLE",
|
builder.UpdateTfOpMetricsWithDeviceOpMetrics(kIdle, kIdle,
|
||||||
device_op_metrics);
|
device_op_metrics);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,10 @@ limitations under the License.
|
||||||
|
|
||||||
namespace tensorflow {
|
namespace tensorflow {
|
||||||
namespace profiler {
|
namespace profiler {
|
||||||
|
|
||||||
|
// The name of OpMetrics to represent the idle time.
|
||||||
|
ABSL_CONST_INIT extern const absl::string_view kIdle;
|
||||||
|
|
||||||
// Helps build an op metrics database (borrowed).
|
// Helps build an op metrics database (borrowed).
|
||||||
// Enables fast lookup of existing ops and prevents the creation of duplicate
|
// Enables fast lookup of existing ops and prevents the creation of duplicate
|
||||||
// ops. It is the user's responsibility to ensure an op metrics database
|
// ops. It is the user's responsibility to ensure an op metrics database
|
||||||
|
@ -67,6 +71,11 @@ uint64 IdleTimePs(const OpMetricsDb& metrics_db);
|
||||||
// must have been set.
|
// must have been set.
|
||||||
void AddIdleOp(OpMetricsDb* db);
|
void AddIdleOp(OpMetricsDb* db);
|
||||||
|
|
||||||
|
// Returns true if the given metrics represents idle time.
|
||||||
|
inline bool IsIdleOp(const OpMetrics& metrics) {
|
||||||
|
return metrics.name() == kIdle;
|
||||||
|
}
|
||||||
|
|
||||||
// Converts from the device op metrics to Tf-op metrics.
|
// Converts from the device op metrics to Tf-op metrics.
|
||||||
OpMetricsDb CreateTfMetricsDbFromDeviceOpMetricsDb(
|
OpMetricsDb CreateTfMetricsDbFromDeviceOpMetricsDb(
|
||||||
const OpMetricsDb& device_op_metrics_db, bool with_idle = true);
|
const OpMetricsDb& device_op_metrics_db, bool with_idle = true);
|
||||||
|
|
Loading…
Reference in New Issue