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:
Jiho Choi 2020-03-25 09:15:23 -07:00 committed by TensorFlower Gardener
parent aab9efbcec
commit 2faa541d42
5 changed files with 23 additions and 9 deletions

View File

@ -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",

View File

@ -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);

View File

@ -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());
} }

View File

@ -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);
} }
} }

View File

@ -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);