1 /* Copyright 2016 The TensorFlow Authors All Rights Reserved. 2 3 Licensed under the Apache License, Version 2.0 (the "License"); 4 you may not use this file except in compliance with the License. 5 You may obtain a copy of the License at 6 7 http://www.apache.org/licenses/LICENSE-2.0 8 9 Unless required by applicable law or agreed to in writing, software 10 distributed under the License is distributed on an "AS IS" BASIS, 11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 See the License for the specific language governing permissions and 13 limitations under the License. 14 ==============================================================================*/ 15 16 #include "tensorflow/core/profiler/internal/tfprof_stats.h" 17 18 #include <utility> 19 20 #include "tensorflow/c/checkpoint_reader.h" 21 #include "tensorflow/core/framework/graph.pb.h" 22 #include "tensorflow/core/lib/io/path.h" 23 #include "tensorflow/core/platform/env.h" 24 #include "tensorflow/core/platform/protobuf.h" 25 #include "tensorflow/core/platform/test.h" 26 #include "tensorflow/core/profiler/internal/tfprof_constants.h" 27 #include "tensorflow/core/profiler/internal/tfprof_utils.h" 28 #include "tensorflow/core/profiler/tfprof_log.pb.h" 29 #include "tensorflow/core/profiler/tfprof_options.h" 30 #include "tensorflow/core/profiler/tfprof_output.pb.h" 31 #include "tensorflow/core/protobuf/config.pb.h" 32 33 namespace tensorflow { 34 namespace tfprof { 35 class TFProfStatsTest : public ::testing::Test { 36 protected: 37 TFProfStatsTest() { 38 string graph_path = 39 io::JoinPath(testing::TensorFlowSrcRoot(), 40 "core/profiler/internal/testdata/graph.pbtxt"); 41 std::unique_ptr<tensorflow::GraphDef> graph_pb(new tensorflow::GraphDef()); 42 TF_CHECK_OK( 43 ReadProtoFile(Env::Default(), graph_path, graph_pb.get(), false)); 44 45 std::unique_ptr<tensorflow::RunMetadata> run_meta_pb( 46 new tensorflow::RunMetadata()); 47 string run_meta_path = 48 io::JoinPath(testing::TensorFlowSrcRoot(), 49 "core/profiler/internal/testdata/run_meta"); 50 TF_CHECK_OK( 51 ReadProtoFile(Env::Default(), run_meta_path, run_meta_pb.get(), true)); 52 53 std::unique_ptr<OpLogProto> op_log_pb(new OpLogProto()); 54 string op_log_path = 55 io::JoinPath(testing::TensorFlowSrcRoot(), 56 "core/profiler/internal/testdata/tfprof_log"); 57 TF_CHECK_OK(ReadBinaryProto(Env::Default(), op_log_path, op_log_pb.get())); 58 59 string ckpt_path = io::JoinPath(testing::TensorFlowSrcRoot(), 60 "core/profiler/internal/testdata/ckpt"); 61 TF_Status* status = TF_NewStatus(); 62 std::unique_ptr<checkpoint::CheckpointReader> ckpt_reader( 63 new checkpoint::CheckpointReader(ckpt_path, status)); 64 CHECK(TF_GetCode(status) == TF_OK); 65 TF_DeleteStatus(status); 66 67 tf_stats_.reset(new TFStats(std::move(graph_pb), std::move(run_meta_pb), 68 std::move(op_log_pb), std::move(ckpt_reader))); 69 tf_stats_->BuildAllViews(); 70 } 71 72 string TestToFromProto(const string& cmd, const Options& opts) { 73 string profile_file = io::JoinPath(testing::TmpDir(), "profile"); 74 tf_stats_->WriteProfile(profile_file); 75 TFStats new_stats(profile_file, nullptr); 76 new_stats.BuildAllViews(); 77 return new_stats.ShowGraphNode(cmd, opts).DebugString(); 78 } 79 80 std::unique_ptr<TFStats> tf_stats_; 81 }; 82 83 TEST_F(TFProfStatsTest, CustomOpType) { 84 Options opts(3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, "name", 85 {kTrainableVarType}, // accout_type_regexes 86 {".*"}, {""}, {".*"}, {""}, false, 87 {"params", "bytes", "micros", "float_ops"}, "", {}); 88 const GraphNodeProto& root = tf_stats_->ShowGraphNode("scope", opts); 89 90 GraphNodeProto expected; 91 CHECK(protobuf::TextFormat::ParseFromString( 92 "name: \"_TFProfRoot\"\ntotal_exec_micros: 13\ntotal_requested_bytes: " 93 "2560\ntotal_parameters: 451\nchildren {\n name: \"DW\"\n exec_micros: " 94 "2\n requested_bytes: 1280\n parameters: 162\n total_exec_micros: 2\n " 95 " total_requested_bytes: 1280\n total_parameters: 162\n devices: " 96 "\"/job:localhost/replica:0/task:0/gpu:0\"\n cpu_exec_micros: 2\n " 97 "total_cpu_exec_micros: 2\n run_count: 1\n total_run_count: 1\n " 98 "total_definition_count: 1\n peak_bytes: 1280\n residual_bytes: 1280\n " 99 " output_bytes: 1280\n total_peak_bytes: 1280\n total_residual_bytes: " 100 "1280\n total_output_bytes: 1280\n}\nchildren {\n name: \"DW2\"\n " 101 "exec_micros: 11\n requested_bytes: 1280\n parameters: 288\n " 102 "total_exec_micros: 11\n total_requested_bytes: 1280\n " 103 "total_parameters: 288\n devices: " 104 "\"/job:localhost/replica:0/task:0/gpu:0\"\n cpu_exec_micros: 11\n " 105 "total_cpu_exec_micros: 11\n run_count: 1\n total_run_count: 1\n " 106 "total_definition_count: 1\n peak_bytes: 1280\n residual_bytes: 1280\n " 107 " output_bytes: 1280\n total_peak_bytes: 1280\n total_residual_bytes: " 108 "1280\n total_output_bytes: 1280\n}\nchildren {\n name: \"ScalarW\"\n " 109 "parameters: 1\n total_parameters: 1\n total_definition_count: " 110 "1\n}\ntotal_cpu_exec_micros: 13\ntotal_run_count: " 111 "2\ntotal_definition_count: 3\ntotal_peak_bytes: " 112 "2560\ntotal_residual_bytes: 2560\ntotal_output_bytes: 2560\n", 113 &expected)); 114 EXPECT_EQ(expected.DebugString(), root.DebugString()); 115 116 EXPECT_EQ(root.DebugString(), TestToFromProto("scope", opts)); 117 } 118 119 TEST_F(TFProfStatsTest, CheckPointOpType) { 120 Options opts(3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, "name", 121 {kCkptVarType}, // accout_type_regexes 122 {".*"}, {""}, {".*"}, {""}, false, 123 {"params", "bytes", "micros", "float_ops"}, "", {}); 124 const GraphNodeProto& root = tf_stats_->ShowGraphNode("scope", opts); 125 126 GraphNodeProto expected; 127 CHECK(protobuf::TextFormat::ParseFromString( 128 "name: \"_TFProfRoot\"\ntotal_exec_micros: 13\ntotal_requested_bytes: " 129 "2560\ntotal_parameters: 451\nchildren {\n name: \"DW\"\n exec_micros: " 130 "2\n requested_bytes: 1280\n parameters: 162\n total_exec_micros: 2\n " 131 " total_requested_bytes: 1280\n total_parameters: 162\n devices: " 132 "\"/job:localhost/replica:0/task:0/gpu:0\"\n cpu_exec_micros: 2\n " 133 "total_cpu_exec_micros: 2\n run_count: 1\n total_run_count: 1\n " 134 "total_definition_count: 1\n peak_bytes: 1280\n residual_bytes: 1280\n " 135 " output_bytes: 1280\n total_peak_bytes: 1280\n total_residual_bytes: " 136 "1280\n total_output_bytes: 1280\n}\nchildren {\n name: \"DW2\"\n " 137 "exec_micros: 11\n requested_bytes: 1280\n parameters: 288\n " 138 "total_exec_micros: 11\n total_requested_bytes: 1280\n " 139 "total_parameters: 288\n devices: " 140 "\"/job:localhost/replica:0/task:0/gpu:0\"\n cpu_exec_micros: 11\n " 141 "total_cpu_exec_micros: 11\n run_count: 1\n total_run_count: 1\n " 142 "total_definition_count: 1\n peak_bytes: 1280\n residual_bytes: 1280\n " 143 " output_bytes: 1280\n total_peak_bytes: 1280\n total_residual_bytes: " 144 "1280\n total_output_bytes: 1280\n}\nchildren {\n name: \"ScalarW\"\n " 145 "parameters: 1\n total_parameters: 1\n total_definition_count: " 146 "1\n}\ntotal_cpu_exec_micros: 13\ntotal_run_count: " 147 "2\ntotal_definition_count: 3\ntotal_peak_bytes: " 148 "2560\ntotal_residual_bytes: 2560\ntotal_output_bytes: 2560\n", 149 &expected)); 150 EXPECT_EQ(expected.DebugString(), root.DebugString()); 151 152 EXPECT_EQ(root.DebugString(), TestToFromProto("scope", opts)); 153 } 154 155 TEST_F(TFProfStatsTest, TestGraph) { 156 Options opts(100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, "name", {".*"}, 157 {"DW/Initializer/random_normal/mul"}, // start_name_regexes 158 {""}, {".*"}, {""}, false, 159 {"params", "bytes", "micros", "float_ops"}, "", {}); 160 const GraphNodeProto& root = tf_stats_->ShowGraphNode("graph", opts); 161 162 GraphNodeProto expected; 163 CHECK(protobuf::TextFormat::ParseFromString( 164 "name: \"_TFProfRoot\"\ntotal_exec_micros: 4945\ntotal_requested_bytes: " 165 "30464\ntotal_parameters: 451\nchildren {\n name: " 166 "\"DW/Initializer/random_normal/mul\"\n children {\n name: " 167 "\"DW/Initializer/random_normal/RandomStandardNormal\"\n children {\n " 168 " name: \"DW/Initializer/random_normal/shape\"\n " 169 "total_definition_count: 1\n }\n input_shapes {\n key: 0\n " 170 " value {\n dim {\n size: 4\n }\n }\n " 171 "}\n total_definition_count: 2\n }\n children {\n name: " 172 "\"DW/Initializer/random_normal/stddev\"\n total_definition_count: " 173 "1\n }\n input_shapes {\n key: 0\n value {\n dim {\n " 174 "size: 3\n }\n dim {\n size: 3\n }\n dim {\n " 175 " size: 3\n }\n dim {\n size: 6\n }\n }\n " 176 "}\n input_shapes {\n key: 1\n value {\n dim {\n " 177 "size: 1\n }\n }\n }\n total_definition_count: " 178 "4\n}\ntotal_float_ops: 10440\ntotal_accelerator_exec_micros: " 179 "404\ntotal_cpu_exec_micros: 4541\ntotal_run_count: " 180 "6\ntotal_definition_count: 32\ntotal_peak_bytes: " 181 "25856\ntotal_residual_bytes: 3840\ntotal_output_bytes: 4864\n", 182 &expected)); 183 EXPECT_EQ(expected.DebugString(), root.DebugString()); 184 185 EXPECT_EQ(root.DebugString(), TestToFromProto("graph", opts)); 186 } 187 188 TEST_F(TFProfStatsTest, TestFloatOps) { 189 Options opts(10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, "name", {".*"}, {".*"}, 190 {""}, {".*"}, {""}, false, {"float_ops"}, "", {}); 191 const GraphNodeProto& root = tf_stats_->ShowGraphNode("scope", opts); 192 193 GraphNodeProto expected; 194 CHECK(protobuf::TextFormat::ParseFromString( 195 "name: \"_TFProfRoot\"\ntotal_exec_micros: 4945\ntotal_requested_bytes: " 196 "30464\ntotal_parameters: 451\nchildren {\n name: \"Conv2D\"\n " 197 "exec_micros: 4292\n requested_bytes: 18176\n total_exec_micros: " 198 "4292\n total_requested_bytes: 18176\n devices: " 199 "\"/job:localhost/replica:0/task:0/gpu:0\"\n float_ops: 5832\n " 200 "total_float_ops: 5832\n input_shapes {\n key: 0\n value {\n " 201 "dim {\n size: 2\n }\n dim {\n size: 6\n " 202 "}\n dim {\n size: 6\n }\n dim {\n size: " 203 "3\n }\n }\n }\n input_shapes {\n key: 1\n value {\n " 204 " dim {\n size: 3\n }\n dim {\n size: 3\n " 205 "}\n dim {\n size: 3\n }\n dim {\n size: " 206 "6\n }\n }\n }\n accelerator_exec_micros: 226\n " 207 "cpu_exec_micros: 4066\n total_accelerator_exec_micros: 226\n " 208 "total_cpu_exec_micros: 4066\n run_count: 1\n total_run_count: 1\n " 209 "total_definition_count: 1\n peak_bytes: 14592\n residual_bytes: 768\n " 210 " output_bytes: 768\n total_peak_bytes: 14592\n total_residual_bytes: " 211 "768\n total_output_bytes: 768\n}\nchildren {\n name: \"Conv2D_1\"\n " 212 "exec_micros: 597\n requested_bytes: 9728\n total_exec_micros: 597\n " 213 "total_requested_bytes: 9728\n devices: " 214 "\"/job:localhost/replica:0/task:0/gpu:0\"\n float_ops: 4608\n " 215 "total_float_ops: 4608\n input_shapes {\n key: 0\n value {\n " 216 "dim {\n size: 2\n }\n dim {\n size: 3\n " 217 "}\n dim {\n size: 3\n }\n dim {\n size: " 218 "6\n }\n }\n }\n input_shapes {\n key: 1\n value {\n " 219 " dim {\n size: 2\n }\n dim {\n size: 2\n " 220 "}\n dim {\n size: 6\n }\n dim {\n size: " 221 "12\n }\n }\n }\n accelerator_exec_micros: 178\n " 222 "cpu_exec_micros: 419\n total_accelerator_exec_micros: 178\n " 223 "total_cpu_exec_micros: 419\n run_count: 1\n total_run_count: 1\n " 224 "total_definition_count: 1\n peak_bytes: 8704\n residual_bytes: 512\n " 225 "output_bytes: 512\n total_peak_bytes: 8704\n total_residual_bytes: " 226 "512\n total_output_bytes: 512\n}\ntotal_float_ops: " 227 "10440\ntotal_accelerator_exec_micros: 404\ntotal_cpu_exec_micros: " 228 "4541\ntotal_run_count: 6\ntotal_definition_count: 35\ntotal_peak_bytes: " 229 "25856\ntotal_residual_bytes: 3840\ntotal_output_bytes: 4864\n", 230 &expected)); 231 EXPECT_EQ(expected.DebugString(), root.DebugString()); 232 233 EXPECT_EQ(root.DebugString(), TestToFromProto("scope", opts)); 234 } 235 236 TEST_F(TFProfStatsTest, TestAccountShownNameOnly) { 237 Options opts(100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, "name", {".*"}, {".*"}, 238 {""}, {"Conv2D_1"}, // show_name_regexes. 239 {""}, true, // account_displayed_op_only. 240 {"params"}, "", {}); 241 const GraphNodeProto& root = tf_stats_->ShowGraphNode("scope", opts); 242 243 GraphNodeProto expected; 244 CHECK(protobuf::TextFormat::ParseFromString( 245 "name: \"_TFProfRoot\"\ntotal_exec_micros: 597\ntotal_requested_bytes: " 246 "9728\nchildren {\n name: \"Conv2D_1\"\n exec_micros: 597\n " 247 "requested_bytes: 9728\n total_exec_micros: 597\n " 248 "total_requested_bytes: 9728\n devices: " 249 "\"/job:localhost/replica:0/task:0/gpu:0\"\n float_ops: 4608\n " 250 "total_float_ops: 4608\n input_shapes {\n key: 0\n value {\n " 251 "dim {\n size: 2\n }\n dim {\n size: 3\n " 252 "}\n dim {\n size: 3\n }\n dim {\n size: " 253 "6\n }\n }\n }\n input_shapes {\n key: 1\n value {\n " 254 " dim {\n size: 2\n }\n dim {\n size: 2\n " 255 "}\n dim {\n size: 6\n }\n dim {\n size: " 256 "12\n }\n }\n }\n accelerator_exec_micros: 178\n " 257 "cpu_exec_micros: 419\n total_accelerator_exec_micros: 178\n " 258 "total_cpu_exec_micros: 419\n run_count: 1\n total_run_count: 1\n " 259 "total_definition_count: 1\n peak_bytes: 8704\n residual_bytes: 512\n " 260 "output_bytes: 512\n total_peak_bytes: 8704\n total_residual_bytes: " 261 "512\n total_output_bytes: 512\n}\ntotal_float_ops: " 262 "4608\ntotal_accelerator_exec_micros: 178\ntotal_cpu_exec_micros: " 263 "419\ntotal_run_count: 1\ntotal_definition_count: 2\ntotal_peak_bytes: " 264 "8704\ntotal_residual_bytes: 512\ntotal_output_bytes: 512\n", 265 &expected)); 266 EXPECT_EQ(expected.DebugString(), root.DebugString()); 267 268 EXPECT_EQ(root.DebugString(), TestToFromProto("scope", opts)); 269 } 270 271 TEST_F(TFProfStatsTest, TestShowTensorValue) { 272 Options opts(10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, "name", {".*"}, {".*"}, 273 {""}, {"DW"}, {""}, false, 274 {"tensor_value"}, // Show tensor value from checkpoint. 275 "", {}); 276 const GraphNodeProto& root = tf_stats_->ShowGraphNode("scope", opts); 277 GraphNodeProto expected; 278 CHECK(protobuf::TextFormat::ParseFromString( 279 "name: \"_TFProfRoot\"\ntotal_exec_micros: 4945\ntotal_requested_bytes: " 280 "30464\ntotal_parameters: 451\nchildren {\n name: \"DW\"\n " 281 "exec_micros: 2\n requested_bytes: 1280\n parameters: 162\n " 282 "total_exec_micros: 2\n total_requested_bytes: 1280\n " 283 "total_parameters: 162\n devices: " 284 "\"/job:localhost/replica:0/task:0/gpu:0\"\n tensor_value {\n dtype: " 285 "DT_FLOAT\n value_double: -0.000534315\n value_double: " 286 "-0.00089602\n value_double: -0.000417239\n value_double: " 287 "0.00041444\n value_double: 0.000780691\n value_double: " 288 "-0.000559057\n value_double: -0.000234623\n value_double: " 289 "0.00013393\n value_double: -0.00187574\n value_double: " 290 "0.000785666\n value_double: 0.000673294\n value_double: " 291 "0.000653368\n value_double: 0.000924489\n value_double: " 292 "-0.000318373\n value_double: -0.000385202\n value_double: " 293 "-7.92661e-05\n value_double: 2.70287e-05\n value_double: " 294 "0.00152302\n value_double: 8.04435e-05\n value_double: " 295 "-0.00058102\n value_double: 0.000244291\n value_double: " 296 "-0.000438045\n value_double: -0.000110199\n value_double: " 297 "0.000731663\n value_double: -0.0012326\n value_double: " 298 "0.00064065\n value_double: -0.00135203\n value_double: " 299 "-6.42784e-05\n value_double: -0.0011857\n value_double: " 300 "-0.000487383\n value_double: 3.41493e-05\n value_double: " 301 "-0.00158447\n value_double: 0.00168448\n value_double: " 302 "0.00160946\n value_double: -0.000600483\n value_double: " 303 "0.000650259\n value_double: -0.00109938\n value_double: " 304 "-0.000842166\n value_double: -0.0022673\n value_double: " 305 "-0.00101941\n value_double: -0.0011169\n value_double: " 306 "-0.0013557\n value_double: -1.46354e-05\n value_double: " 307 "-1.05487e-05\n value_double: -0.00092014\n value_double: " 308 "0.00272874\n value_double: 5.13942e-05\n value_double: " 309 "-0.00223472\n value_double: -0.000250875\n value_double: " 310 "-0.00180747\n value_double: -0.00234714\n value_double: " 311 "-0.00113523\n value_double: -0.00112635\n value_double: " 312 "-0.000843118\n value_double: -6.84256e-05\n value_double: " 313 "0.000243336\n value_double: 0.00119151\n value_double: " 314 "0.00131022\n value_double: 0.000768038\n value_double: " 315 "-8.90095e-05\n value_double: -0.000626427\n value_double: " 316 "-7.0617e-05\n value_double: -0.0021988\n value_double: " 317 "-0.00221544\n value_double: -0.000393118\n value_double: " 318 "0.000159464\n value_double: -0.000874746\n value_double: " 319 "-0.00131239\n value_double: -0.00135747\n value_double: " 320 "-0.00179753\n value_double: -0.00101005\n value_double: " 321 "-0.000107518\n value_double: -0.000616882\n value_double: " 322 "-0.000360923\n value_double: -0.00026896\n value_double: " 323 "-0.000142548\n value_double: 0.000577227\n value_double: " 324 "0.000536027\n value_double: 0.00126907\n value_double: " 325 "-0.00122712\n value_double: -3.60499e-05\n value_double: " 326 "0.000151026\n value_double: 0.00107658\n value_double: " 327 "0.00116475\n value_double: -0.00145312\n value_double: " 328 "0.000233326\n value_double: -0.00020198\n value_double: " 329 "0.00179029\n value_double: 0.00150048\n value_double: " 330 "-0.000884775\n value_double: 0.000409188\n value_double: " 331 "2.97176e-05\n value_double: -0.000506118\n value_double: " 332 "-2.33992e-05\n value_double: -0.00037212\n value_double: " 333 "0.000862773\n value_double: 0.00174046\n value_double: " 334 "-0.000240207\n value_double: 0.000663976\n value_double: " 335 "-0.00134747\n value_double: 0.00115585\n value_double: " 336 "0.000555869\n value_double: 0.00176722\n value_double: " 337 "-0.000518409\n value_double: 0.00101051\n value_double: " 338 "0.000129399\n value_double: -0.000916389\n value_double: " 339 "-0.00137693\n value_double: -0.00152412\n value_double: " 340 "7.32515e-05\n value_double: -0.000190811\n value_double: " 341 "-0.000158692\n value_double: -5.7791e-05\n value_double: " 342 "0.000671785\n value_double: -0.00152924\n value_double: " 343 "0.00117314\n value_double: -0.000384202\n value_double: " 344 "0.00176709\n value_double: -0.000181703\n value_double: " 345 "-0.000460994\n value_double: 0.000643716\n value_double: " 346 "4.76719e-05\n value_double: -0.00101037\n value_double: " 347 "0.00159621\n value_double: 0.00186758\n value_double: " 348 "0.00100001\n value_double: -0.00121831\n value_double: " 349 "0.00132231\n value_double: 0.0013511\n value_double: 0.00106659\n " 350 " value_double: 0.00018091\n value_double: 0.00155925\n " 351 "value_double: 4.26087e-05\n value_double: 0.000243264\n " 352 "value_double: -0.0017202\n value_double: -0.000218897\n " 353 "value_double: 0.00118693\n value_double: 0.00258909\n " 354 "value_double: 0.000641913\n value_double: -0.0013211\n " 355 "value_double: -0.00171943\n value_double: 0.00089151\n " 356 "value_double: -0.00114969\n value_double: -0.000196331\n " 357 "value_double: 0.00109994\n value_double: 0.000302616\n " 358 "value_double: 0.000675812\n value_double: 0.00112222\n " 359 "value_double: 0.000516456\n value_double: 0.00133357\n " 360 "value_double: 0.000298491\n value_double: 0.00145934\n " 361 "value_double: -0.00159102\n value_double: -0.000819061\n " 362 "value_double: 0.000120583\n value_double: 0.0006108\n " 363 "value_double: 0.00124132\n value_double: 0.000764859\n " 364 "value_double: 0.000374641\n value_double: -0.00149603\n " 365 "value_double: -0.000317367\n value_double: -0.000417829\n }\n " 366 "cpu_exec_micros: 2\n total_cpu_exec_micros: 2\n run_count: 1\n " 367 "total_run_count: 1\n total_definition_count: 10\n peak_bytes: 1280\n " 368 "residual_bytes: 1280\n output_bytes: 1280\n total_peak_bytes: 1280\n " 369 "total_residual_bytes: 1280\n total_output_bytes: " 370 "1280\n}\ntotal_float_ops: 10440\ntotal_accelerator_exec_micros: " 371 "404\ntotal_cpu_exec_micros: 4541\ntotal_run_count: " 372 "6\ntotal_definition_count: 35\ntotal_peak_bytes: " 373 "25856\ntotal_residual_bytes: 3840\ntotal_output_bytes: 4864\n", 374 &expected)); 375 EXPECT_EQ(expected.DebugString(), root.DebugString()); 376 } 377 378 } // namespace tfprof 379 } // namespace tensorflow 380