Home | History | Annotate | Download | only in internal
      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