Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/tensorflow/python/debug/lib/profiling.py: 34%
38 statements
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-03 07:57 +0000
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-03 07:57 +0000
1# Copyright 2017 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"""Data structures and algorithms for profiling information."""
17import os
20class ProfileDatum(object):
21 """Profile data point."""
23 def __init__(self,
24 device_name,
25 node_exec_stats,
26 file_path,
27 line_number,
28 func_name,
29 op_type):
30 """Constructor.
32 Args:
33 device_name: (string) name of the device.
34 node_exec_stats: `NodeExecStats` proto.
35 file_path: path to the source file involved in creating the op.
36 line_number: line number in the file involved in creating the op.
37 func_name: name of the function that the line belongs to.
38 op_type: (string) Operation type.
39 """
40 self.device_name = device_name
41 self.node_exec_stats = node_exec_stats
42 self.file_path = file_path
43 self.line_number = line_number
44 self.func_name = func_name
45 if self.file_path:
46 self.file_line_func = "%s:%d(%s)" % (
47 os.path.basename(self.file_path), self.line_number, self.func_name)
48 else:
49 self.file_line_func = ""
50 self.op_type = op_type
51 self.start_time = self.node_exec_stats.all_start_micros
52 self.op_time = (self.node_exec_stats.op_end_rel_micros -
53 self.node_exec_stats.op_start_rel_micros)
55 @property
56 def exec_time(self):
57 """Op execution time plus pre- and post-processing."""
58 return self.node_exec_stats.all_end_rel_micros
61class AggregateProfile(object):
62 """Profile summary data for aggregating a number of ProfileDatum."""
64 def __init__(self, profile_datum):
65 """Constructor.
67 Args:
68 profile_datum: (`ProfileDatum`) an instance of `ProfileDatum` to
69 initialize this object with.
70 """
72 self.total_op_time = profile_datum.op_time
73 self.total_exec_time = profile_datum.exec_time
74 device_and_node = "%s:%s" % (profile_datum.device_name,
75 profile_datum.node_exec_stats.node_name)
76 self._node_to_exec_count = {device_and_node: 1}
78 def add(self, profile_datum):
79 """Accumulate a new instance of ProfileDatum.
81 Args:
82 profile_datum: (`ProfileDatum`) an instance of `ProfileDatum` to
83 accumulate to this object.
84 """
86 self.total_op_time += profile_datum.op_time
87 self.total_exec_time += profile_datum.exec_time
88 device_and_node = "%s:%s" % (profile_datum.device_name,
89 profile_datum.node_exec_stats.node_name)
91 device_and_node = "%s:%s" % (profile_datum.device_name,
92 profile_datum.node_exec_stats.node_name)
93 if device_and_node in self._node_to_exec_count:
94 self._node_to_exec_count[device_and_node] += 1
95 else:
96 self._node_to_exec_count[device_and_node] = 1
98 @property
99 def node_count(self):
100 return len(self._node_to_exec_count)
102 @property
103 def node_exec_count(self):
104 return sum(self._node_to_exec_count.values())