blob: 7549662ba8c25397a7105fa25d0f345c9a85a749 [file] [log] [blame]
# Copyright 2021 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Script to whether the size exceeds a threshold and also plot size history as a graph.
"""
import argparse
import pandas as pd
from matplotlib import pyplot as plt
# Limit the size history check for the past 60 days
SIZE_HISTORY_DEPTH = 60
# If a section of size log exceeds the below threshold, an error will be raised
SIZE_THRESHOLD_SETTING = {
"text": 512,
"total": 512,
}
def _plot_and_detect_size_increase_for_binary(input_dir, output_dir,
binary_name, threshold):
csv_path = '%s/%s.csv' % (input_dir, binary_name)
size_log = pd.read_csv(csv_path, index_col=False).iloc[-SIZE_HISTORY_DEPTH:]
size_log.reset_index(drop=True, inplace=True)
start_date = size_log.iloc[0, 0][0:10]
end_date = size_log.iloc[-1, 0][0:10]
fig, axs = plt.subplots(3, 2)
fig.suptitle('Source: %s\n%s - %s' % (binary_name, start_date, end_date))
threshold_messages = []
for index, name in enumerate(['text', 'data', 'total']):
err_msg_or_none = _subplot_and_detect_size_increase(
axs, size_log, name, index, threshold)
if err_msg_or_none is not None:
threshold_messages.append('%s failure: %s' %
(binary_name, err_msg_or_none))
fig_path = '%s/%s.png' % (output_dir, binary_name)
fig.tight_layout()
plt.savefig(fig_path)
plt.clf()
return threshold_messages
def _subplot_and_detect_size_increase(subplot_axs, size_log, section_name, row,
threshold):
subplot_axs[row, 0].set_title(section_name)
subplot_axs[row, 0].plot(size_log[section_name], 'o-')
subplot_axs[row, 0].set_ylabel('Abs Sz(bytes)')
increased_size = size_log[section_name].diff()
subplot_axs[row, 1].plot(increased_size, 'o-')
subplot_axs[row, 1].set_ylabel('Incr Sz (bytes)')
if section_name in threshold and len(increased_size) > 1:
if increased_size[1] > threshold[section_name]:
return '%s size increases by %d and exceeds threshold %d' % (
section_name, increased_size[1], threshold[section_name])
# By default there is no size increase that exceeds the threshold
return None
def _detect_size_increase_and_plot_history(input_dir, output_dir, binary_list,
threshold_setting):
threshold_messages = []
for binary_name in binary_list:
threshold_messages += _plot_and_detect_size_increase_for_binary(
input_dir, output_dir, binary_name, threshold_setting)
if len(threshold_messages) != 0:
raise RuntimeError(str(threshold_messages))
if __name__ == '__main__':
parser = argparse.ArgumentParser()
default_binary_list_string = 'keyword_benchmark,baseline_memory_footprint,interpreter_memory_footprint'
parser.add_argument(
'--binary_list',
nargs='?',
const=default_binary_list_string,
default=default_binary_list_string,
help=
'binary list separated by comma (e.g. keyword_benchmark,baseline_memory_footprint)'
)
parser.add_argument('--input_dir',
help='Path to the size log file (e.g. ~/size_log')
parser.add_argument('--output_dir', help='Path to save plot to (e.g. /tmp/)')
args = parser.parse_args()
binary_names = args.binary_list.split(',')
_detect_size_increase_and_plot_history(args.input_dir, args.output_dir,
binary_names, SIZE_THRESHOLD_SETTING)