• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright 2018 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 #include "tensorflow/lite/profiling/profile_summary_formatter.h"
16 
17 #include <memory>
18 #include <string>
19 
20 #include <gmock/gmock.h>
21 #include <gtest/gtest.h>
22 #include "absl/strings/match.h"
23 
24 namespace tflite {
25 namespace profiling {
26 
27 namespace {
28 
TEST(SummaryWriterTest,SummaryOptionStdOut)29 TEST(SummaryWriterTest, SummaryOptionStdOut) {
30   ProfileSummaryDefaultFormatter writer;
31   tensorflow::StatSummarizerOptions options = writer.GetStatSummarizerOptions();
32   EXPECT_EQ(options.show_summary, false);
33   EXPECT_EQ(options.show_memory, false);
34   EXPECT_EQ(options.format_as_csv, false);
35 }
36 
TEST(SummaryWriterTest,SummaryOptionCSV)37 TEST(SummaryWriterTest, SummaryOptionCSV) {
38   ProfileSummaryCSVFormatter writer;
39   tensorflow::StatSummarizerOptions options = writer.GetStatSummarizerOptions();
40   EXPECT_EQ(options.show_summary, false);
41   EXPECT_EQ(options.show_memory, false);
42   EXPECT_EQ(options.format_as_csv, true);
43 }
TEST(SummaryWriterTest,EmptyOutputString)44 TEST(SummaryWriterTest, EmptyOutputString) {
45   ProfileSummaryDefaultFormatter writer;
46   std::string output = writer.GetOutputString(
47       std::map<uint32_t, std::unique_ptr<tensorflow::StatsCalculator>>(),
48       tensorflow::StatsCalculator(writer.GetStatSummarizerOptions()));
49   EXPECT_EQ(output.size(), 0);
50 }
51 
TEST(SummaryWriterTest,EmptyShortSummary)52 TEST(SummaryWriterTest, EmptyShortSummary) {
53   ProfileSummaryDefaultFormatter writer;
54   std::string output = writer.GetShortSummary(
55       std::map<uint32_t, std::unique_ptr<tensorflow::StatsCalculator>>(),
56       tensorflow::StatsCalculator(writer.GetStatSummarizerOptions()));
57   EXPECT_EQ(output.size(), 0);
58 }
59 
TEST(SummaryWriterTest,SingleSubgraphOutputString)60 TEST(SummaryWriterTest, SingleSubgraphOutputString) {
61   ProfileSummaryDefaultFormatter writer;
62   std::map<uint32_t, std::unique_ptr<tensorflow::StatsCalculator>>
63       stats_calculator_map;
64   stats_calculator_map[0] = std::make_unique<tensorflow::StatsCalculator>(
65       writer.GetStatSummarizerOptions());
66   std::string output = writer.GetOutputString(
67       stats_calculator_map,
68       tensorflow::StatsCalculator(writer.GetStatSummarizerOptions()));
69   ASSERT_TRUE(absl::StrContains(output, "Run Order"));
70   ASSERT_TRUE(absl::StrContains(output, "Top by Computation Time"));
71   ASSERT_TRUE(!absl::StrContains(output, "Top by Memory Use"));
72   ASSERT_TRUE(absl::StrContains(output, "Summary by node type"));
73   ASSERT_TRUE(absl::StrContains(output, "nodes observed"));
74   ASSERT_TRUE(!absl::StrContains(output, "Primary graph"));
75   ASSERT_TRUE(!absl::StrContains(output, "Subgraph"));
76   ASSERT_TRUE(!absl::StrContains(output, "Delegate internal"));
77 }
78 
TEST(SummaryWriterTest,SingleSubgraphShortSummary)79 TEST(SummaryWriterTest, SingleSubgraphShortSummary) {
80   ProfileSummaryDefaultFormatter writer;
81   std::map<uint32_t, std::unique_ptr<tensorflow::StatsCalculator>>
82       stats_calculator_map;
83   stats_calculator_map[0] = std::make_unique<tensorflow::StatsCalculator>(
84       writer.GetStatSummarizerOptions());
85   std::string output = writer.GetShortSummary(
86       stats_calculator_map,
87       tensorflow::StatsCalculator(writer.GetStatSummarizerOptions()));
88   ASSERT_TRUE(!absl::StrContains(output, "Run Order"));
89   ASSERT_TRUE(!absl::StrContains(output, "Top by Computation Time"));
90   ASSERT_TRUE(!absl::StrContains(output, "Top by Memory Use"));
91   ASSERT_TRUE(!absl::StrContains(output, "Summary by node type"));
92   ASSERT_TRUE(absl::StrContains(output, "nodes observed"));
93   ASSERT_TRUE(!absl::StrContains(output, "Primary graph"));
94   ASSERT_TRUE(!absl::StrContains(output, "Subgraph"));
95   ASSERT_TRUE(!absl::StrContains(output, "Delegate internal"));
96 }
97 
TEST(SummaryWriterTest,MultiSubgraphOutputString)98 TEST(SummaryWriterTest, MultiSubgraphOutputString) {
99   ProfileSummaryDefaultFormatter writer;
100   std::map<uint32_t, std::unique_ptr<tensorflow::StatsCalculator>>
101       stats_calculator_map;
102   stats_calculator_map[0] = std::make_unique<tensorflow::StatsCalculator>(
103       writer.GetStatSummarizerOptions());
104   stats_calculator_map[1] = std::make_unique<tensorflow::StatsCalculator>(
105       writer.GetStatSummarizerOptions());
106   std::string output = writer.GetOutputString(
107       stats_calculator_map,
108       tensorflow::StatsCalculator(writer.GetStatSummarizerOptions()));
109   ASSERT_TRUE(absl::StrContains(output, "Primary graph"));
110   ASSERT_TRUE(absl::StrContains(output, "Subgraph"));
111   ASSERT_TRUE(!absl::StrContains(output, "Delegate internal"));
112 }
113 
TEST(SummaryWriterTest,MultiSubgraphShortSummary)114 TEST(SummaryWriterTest, MultiSubgraphShortSummary) {
115   ProfileSummaryDefaultFormatter writer;
116   std::map<uint32_t, std::unique_ptr<tensorflow::StatsCalculator>>
117       stats_calculator_map;
118   stats_calculator_map[0] = std::make_unique<tensorflow::StatsCalculator>(
119       writer.GetStatSummarizerOptions());
120   stats_calculator_map[1] = std::make_unique<tensorflow::StatsCalculator>(
121       writer.GetStatSummarizerOptions());
122   std::string output = writer.GetShortSummary(
123       stats_calculator_map,
124       tensorflow::StatsCalculator(writer.GetStatSummarizerOptions()));
125   ASSERT_TRUE(absl::StrContains(output, "Primary graph"));
126   ASSERT_TRUE(absl::StrContains(output, "Subgraph"));
127   ASSERT_TRUE(!absl::StrContains(output, "Delegate internal"));
128 }
129 
TEST(SummaryWriterTest,DelegationOutputString)130 TEST(SummaryWriterTest, DelegationOutputString) {
131   ProfileSummaryDefaultFormatter writer;
132   auto delegate_stats_calculator =
133       tensorflow::StatsCalculator(writer.GetStatSummarizerOptions());
134   delegate_stats_calculator.UpdateRunTotalUs(1);
135   std::string output = writer.GetOutputString(
136       std::map<uint32_t, std::unique_ptr<tensorflow::StatsCalculator>>(),
137       delegate_stats_calculator);
138   ASSERT_TRUE(!absl::StrContains(output, "Primary graph"));
139   ASSERT_TRUE(!absl::StrContains(output, "Subgraph"));
140   ASSERT_TRUE(absl::StrContains(output, "Delegate internal"));
141 }
142 
TEST(SummaryWriterTest,DelegationShortSummary)143 TEST(SummaryWriterTest, DelegationShortSummary) {
144   ProfileSummaryDefaultFormatter writer;
145   auto delegate_stats_calculator =
146       tensorflow::StatsCalculator(writer.GetStatSummarizerOptions());
147   delegate_stats_calculator.UpdateRunTotalUs(1);
148   std::string output = writer.GetShortSummary(
149       std::map<uint32_t, std::unique_ptr<tensorflow::StatsCalculator>>(),
150       delegate_stats_calculator);
151   ASSERT_TRUE(!absl::StrContains(output, "Primary graph"));
152   ASSERT_TRUE(!absl::StrContains(output, "Subgraph"));
153   ASSERT_TRUE(absl::StrContains(output, "Delegate internal"));
154 }
155 
156 }  // namespace
157 }  // namespace profiling
158 }  // namespace tflite
159