diff --git a/bin/radical-analytics-plot.py b/bin/radical-analytics-plot.py index 0a5a3ca..5d07219 100755 --- a/bin/radical-analytics-plot.py +++ b/bin/radical-analytics-plot.py @@ -1,6 +1,6 @@ #!/usr/bin/env python - +import os import sys import time import optparse @@ -11,6 +11,7 @@ from radical.analytics.utils import to_latex +RES = int(os.environ.get('RADICAL_ANALYTICS_RESOLUTION', 252)) # ---------------------------------------------------------------------------- # @@ -37,7 +38,7 @@ GRID = False # True, False FNAME = None SAVE_AS = 'x11' # 'svg', 'png', 'x11', 'pdf' -WIDTH = 500 +WIDTH = RES HEIGHT = None STDEV = False diff --git a/bin/rp_inspect/plot_conc.py b/bin/rp_inspect/plot_conc.py index 9684f95..a9e88cc 100755 --- a/bin/rp_inspect/plot_conc.py +++ b/bin/rp_inspect/plot_conc.py @@ -1,9 +1,9 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 __copyright__ = 'Copyright 2013-2016, http://radical.rutgers.edu' __license__ = 'MIT' - +import os import sys import matplotlib.pyplot as plt @@ -14,6 +14,8 @@ from radical.analytics.utils import to_latex +RES = int(os.environ.get('RADICAL_ANALYTICS_RESOLUTION', 252)) + # ---------------------------------------------------------------------------- # @@ -75,7 +77,7 @@ for metric in metrics} # prep figure - fig, ax = plt.subplots(figsize=ra.get_plotsize(500)) + fig, ax = plt.subplots(figsize=ra.get_plotsize(RES)) for metric in data: x = [e[0] for e in data[metric]] diff --git a/bin/rp_inspect/plot_dur.py b/bin/rp_inspect/plot_dur.py index e7a3dd6..86eb9b0 100755 --- a/bin/rp_inspect/plot_dur.py +++ b/bin/rp_inspect/plot_dur.py @@ -3,7 +3,7 @@ __copyright__ = 'Copyright 2013-2016, http://radical.rutgers.edu' __license__ = 'MIT' - +import os import sys import matplotlib.pyplot as plt @@ -14,6 +14,7 @@ from radical.analytics.utils import to_latex +RES = int(os.environ.get('RADICAL_ANALYTICS_RESOLUTION', 252)) # ---------------------------------------------------------------------------- # @@ -24,32 +25,18 @@ # The event list below will describe the whole duration (first to last event), # and the durations between subsequential events are considered contributing # sub-durations. For each entity, we plot the times derived that way. -# + +s = ru.STATE +e = ru.EVENT event_entities = ['task', 'master', 'worker'] event_list = [ - # {ru.STATE: 'NEW' , ru.EVENT: 'state' }, - # {ru.STATE: 'TMGR_SCHEDULING_PENDING' , ru.EVENT: 'state' }, - # {ru.STATE: 'TMGR_SCHEDULING' , ru.EVENT: 'state' }, - # {ru.STATE: 'TMGR_STAGING_INPUT_PENDING' , ru.EVENT: 'state' }, - # {ru.STATE: 'TMGR_STAGING_INPUT' , ru.EVENT: 'state' }, - # {ru.STATE: 'AGENT_STAGING_INPUT_PENDING' , ru.EVENT: 'state' }, - # {ru.STATE: None , ru.EVENT: 'get' }, - # {ru.STATE: 'AGENT_STAGING_INPUT' , ru.EVENT: 'state' }, - # {ru.STATE: 'AGENT_SCHEDULING_PENDING' , ru.EVENT: 'state' }, - {ru.STATE: 'AGENT_SCHEDULING' , ru.EVENT: 'state' }, - # {ru.STATE: None , ru.EVENT: 'schedule_ok' }, - {ru.STATE: 'AGENT_EXECUTING_PENDING' , ru.EVENT: 'state' }, - {ru.STATE: 'AGENT_EXECUTING' , ru.EVENT: 'state' }, - {ru.STATE: None , ru.EVENT: 'exec_start' }, - # {ru.STATE: None , ru.EVENT: 'exec_ok' }, - {ru.STATE: None , ru.EVENT: 'exec_stop' }, - # {ru.STATE: None , ru.EVENT: 'unschedule_start'}, - {ru.STATE: None , ru.EVENT: 'unschedule_stop' }, - # {ru.STATE: 'AGENT_STAGING_OUTPUT_PENDING' , ru.EVENT: 'state' }, - # {ru.STATE: 'TMGR_STAGING_OUTPUT_PENDING' , ru.EVENT: 'state' }, - # {ru.STATE: 'TMGR_STAGING_OUTPUT' , ru.EVENT: 'state' }, - # {ru.STATE: 'AGENT_STAGING_OUTPUT' , ru.EVENT: 'state' }, - # {ru.STATE: 'DONE' , ru.EVENT: 'state' }, + [{s: 'AGENT_SCHEDULING' , e: 'state' }, 'total'], + [{s: 'AGENT_EXECUTING_PENDING' , e: 'state' }, 'sched'], + [{s: 'AGENT_EXECUTING' , e: 'state' }, 'comm'], + [{s: None , e: 'launch_start' }, 'rp exec'], + [{s: None , e: 'exec_start' }, 'launch'], + [{s: None , e: 'exec_stop' }, 'app exec'], + [{s: None , e: 'unschedule_stop' }, 'unsched'], ] # ------------------------------------------------------------------------------ @@ -69,8 +56,8 @@ tstamps = list() - for event in event_list: - times = thing.timestamps(event=event) + for item in event_list: + times = thing.timestamps(event=item[0]) if times: tstamps.append(times[0]) else : tstamps.append(np.nan) @@ -96,23 +83,19 @@ # create a numpyarray for plotting np_data = np.array(sorted_data) - fig, ax = plt.subplots(figsize=ra.get_plotsize(500)) + fig, ax = plt.subplots(figsize=ra.get_plotsize(RES)) - for e_idx in range(len(event_list)): - if e_idx == 0: - label = 'total' - else: - label = to_latex('%s - %s' % (ru.event_to_label(event_list[e_idx - 1]), - ru.event_to_label(event_list[e_idx]))) - ax.plot(np_data[:,0], np_data[:,(1 + e_idx)], label=label) + for idx,item in enumerate(event_list): + label = to_latex(item[1]) + ax.plot(np_data[:,0], np_data[:,(1 + idx)], label=label) plt.yscale('log') # FIXME: how to do the legend now? With the large font size, I don't see # a way to fit it anymore... :-/ # plt.legend(fancybox=True, shadow=True) - plt.legend(loc='upper center', bbox_to_anchor=(0.5, 1.15), - ncol=2, fancybox=True, shadow=True) + plt.legend(loc='upper center', bbox_to_anchor=(0.5, 1.20), + ncol=4, fancybox=True, shadow=True) # FIXME: why is the x-axis label gone? plt.xlabel(to_latex('task ID')) diff --git a/bin/rp_inspect/plot_rate.py b/bin/rp_inspect/plot_rate.py index 15c6210..f5d048b 100755 --- a/bin/rp_inspect/plot_rate.py +++ b/bin/rp_inspect/plot_rate.py @@ -1,9 +1,9 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 __copyright__ = 'Copyright 2013-2016, http://radical.rutgers.edu' __license__ = 'MIT' - +import os import sys import matplotlib.pyplot as plt @@ -14,6 +14,8 @@ from radical.analytics.utils import to_latex +RES = int(os.environ.get('RADICAL_ANALYTICS_RESOLUTION', 252)) + # ---------------------------------------------------------------------------- # @@ -67,7 +69,7 @@ data = {metric: session.rate(event=metrics[metric], sampling=1.0) for metric in metrics} - fig, ax = plt.subplots(figsize=ra.get_plotsize(500)) + fig, ax = plt.subplots(figsize=ra.get_plotsize(RES)) for metric in data: x = [e[0] for e in data[metric]] diff --git a/bin/rp_inspect/plot_state.py b/bin/rp_inspect/plot_state.py index 0b8b3d4..8a9c256 100755 --- a/bin/rp_inspect/plot_state.py +++ b/bin/rp_inspect/plot_state.py @@ -1,9 +1,9 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 __copyright__ = 'Copyright 2013-2016, http://radical.rutgers.edu' __license__ = 'MIT' - +import os import sys import radical.utils as ru @@ -15,6 +15,8 @@ from radical.analytics.utils import to_latex +RES = int(os.environ.get('RADICAL_ANALYTICS_RESOLUTION', 252)) + # ---------------------------------------------------------------------------- # @@ -25,33 +27,27 @@ # type `event_entity`.. Before plotting, we sort those entities by the # timestamp of the first event in the event list +s = ru.STATE +e = ru.EVENT event_entities = ['task', 'master', 'worker'] event_list = [ - # {ru.STATE: rp.NEW , ru.EVENT: 'state' }, - # {ru.STATE: rp.TMGR_SCHEDULING_PENDING , ru.EVENT: 'state' }, - # {ru.STATE: rp.TMGR_SCHEDULING , ru.EVENT: 'state' }, - # {ru.STATE: rp.TMGR_STAGING_INPUT_PENDING , ru.EVENT: 'state' }, - # {ru.STATE: rp.TMGR_STAGING_INPUT , ru.EVENT: 'state' }, - # {ru.STATE: rp.AGENT_STAGING_INPUT_PENDING , ru.EVENT: 'state' }, - # {ru.COMP : 'agent_0' , ru.EVENT: 'get' }, - {ru.STATE: rp.AGENT_STAGING_INPUT , ru.EVENT: 'state' }, - {ru.STATE: rp.AGENT_SCHEDULING_PENDING , ru.EVENT: 'state' }, - {ru.STATE: rp.AGENT_SCHEDULING , ru.EVENT: 'state' }, - # {ru.STATE: None , ru.EVENT: 'schedule_ok' }, - {ru.STATE: rp.AGENT_EXECUTING_PENDING , ru.EVENT: 'state' }, - {ru.STATE: rp.AGENT_EXECUTING , ru.EVENT: 'state' }, - # {ru.STATE: None , ru.EVENT: 'exec_mkdir' }, - # {ru.STATE: None , ru.EVENT: 'exec_mkdir_done'}, - {ru.STATE: None , ru.EVENT: 'exec_start' }, - # {ru.STATE: None , ru.EVENT: 'app_start' }, - # {ru.STATE: None , ru.EVENT: 'app_stop' }, - # {ru.STATE: None , ru.EVENT: 'exec_ok' }, - {ru.STATE: None , ru.EVENT: 'exec_stop' }, - {ru.STATE: rp.AGENT_STAGING_OUTPUT_PENDING, ru.EVENT: 'state' }, - {ru.STATE: rp.AGENT_STAGING_OUTPUT , ru.EVENT: 'state' }, - # {ru.STATE: rp.TMGR_STAGING_OUTPUT_PENDING , ru.EVENT: 'state' }, - # {ru.STATE: rp.TMGR_STAGING_OUTPUT , ru.EVENT: 'state' }, - # {ru.STATE: rp.DONE , ru.EVENT: 'state' }, + # [{s: rp.AGENT_STAGING_INPUT_PENDING , e: 'state' }, 'input_wait' ], + # [{s: rp.AGENT_STAGING_INPUT , e: 'state' }, 'input' ], + # [{s: rp.AGENT_SCHEDULING_PENDING , e: 'state' }, 'sched_wait' ], + [{s: rp.AGENT_SCHEDULING , e: 'state' }, 'sched' ], + # [{s: None , e: 'schedule_ok' }, 'sched_ok' ], + [{s: rp.AGENT_EXECUTING_PENDING , e: 'state' }, 'exec_wait' ], + [{s: rp.AGENT_EXECUTING , e: 'state' }, 'exec' ], + # [{s: None , e: 'exec_mkdir' }, 'mkdir' ], + # [{s: None , e: 'exec_mkdir_done'}, 'mkdir_ok' ], + [{s: None , e: 'exec_start' }, 'exec_start' ], + [{s: None , e: 'exec_stop' }, 'exec_stop' ], + # [{s: None , e: 'app_start' }, 'app_start' ], + # [{s: None , e: 'app_stop' }, 'app_stop' ], + # [{s: None , e: 'exec_ok' }, 'exec_ok' ], + [{s: None , e: 'exec_stop' }, 'exec_stop' ], + # [{s: rp.AGENT_STAGING_OUTPUT_PENDING, e: 'state' }, 'output_wait'], + # [{s: rp.AGENT_STAGING_OUTPUT , e: 'state' }, 'output' ], ] @@ -74,7 +70,8 @@ tstamps = list() - for event in event_list: + for item in event_list: + event = item[0] times = thing.timestamps(event=event) if times: tstamps.append(times[0]) else : tstamps.append(None) @@ -113,17 +110,17 @@ np_data = np.array(sorted_data) - fig, ax = plt.subplots(figsize=ra.get_plotsize(500)) + fig, ax = plt.subplots(figsize=ra.get_plotsize(RES)) - for e_idx in range(len(event_list)): - ax.plot(np_data[:,0], np_data[:,(1 + e_idx)], - label=to_latex(ru.event_to_label(event_list[e_idx]))) + for idx,item in enumerate(event_list): + ax.plot(np_data[:,0], np_data[:,(1 + idx)], + label=to_latex(item[1])) plt.xlabel(to_latex('task (sorted by %s)' % order)) plt.ylabel(to_latex('time [sec]')) - # FIXME: how to do the legend now? With the large font size, I don't see - plt.legend() + plt.legend(loc='upper center', bbox_to_anchor=(0.5, 1.20), + ncol=3, fancybox=True, shadow=True) plt.savefig('%s_state.png' % session.uid) # plt.show() diff --git a/bin/rp_inspect/plot_util.py b/bin/rp_inspect/plot_util.py index 18882ab..dc59c05 100755 --- a/bin/rp_inspect/plot_util.py +++ b/bin/rp_inspect/plot_util.py @@ -1,9 +1,9 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 __copyright__ = 'Copyright 2013-2016, http://radical.rutgers.edu' __license__ = 'MIT' - +import os import sys import matplotlib.pyplot as plt @@ -13,6 +13,8 @@ from radical.analytics.utils import to_latex +RES = int(os.environ.get('RADICAL_ANALYTICS_RESOLUTION', 252)) + # ---------------------------------------------------------------------------- # @@ -120,7 +122,7 @@ if len(sys.argv) == 3: stype = sys.argv[2] else : stype = 'radical.pilot' - fig, axes = plt.subplots(2, figsize=ra.get_plotsize(500)) + fig, axes = plt.subplots(2, figsize=ra.get_plotsize(RES)) session = ra.Session(src, stype=stype) # this script does not really work for many tasks @@ -186,7 +188,7 @@ # Add legend for both plots fig.legend(legend, [m[0] for m in metrics], ncol=3, - loc='upper center', bbox_to_anchor=(0.5, 1.10)) + loc='upper center', bbox_to_anchor=(0.5, 1.15)) # plt.xticks(list(range(int(x_min)-1, int(x_max)+1))) diff --git a/bin/rp_inspect/plot_util_2.py b/bin/rp_inspect/plot_util_2.py index 9a72a67..8eaedd8 100755 --- a/bin/rp_inspect/plot_util_2.py +++ b/bin/rp_inspect/plot_util_2.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 +import os import sys import matplotlib as mpl @@ -9,6 +10,9 @@ from radical.analytics.utils import to_latex +RES = int(os.environ.get('RADICAL_ANALYTICS_RESOLUTION', 252)) + + # This utilization plot accounts for resource usages the following way: # # - initially, all resources are owned by the 'system'. @@ -53,10 +57,10 @@ # signal transition *from* what entity *to* what other entity: # # t_trans = [ -# # event , from, to -# [{1: 'schedule_ok'}, 'idle' , 'exec_rp' ], -# [{1: 'exec_start'} , 'exec_rp' , 'exec_launch' ], -# [{1: 'rank_start'} , 'exec_launch' , 'exec_task'], +# # event , from, , to +# [{1: 'schedule_ok'} , 'idle' , 'exec_rp' ], +# [{1: 'launch_start'}, 'exec_rp' , 'exec_launch'], +# [{1: 'exec_start'} , 'exec_launch', 'exec_task' ], # # # ---------------------------------------------------------------------------- @@ -67,8 +71,8 @@ # ------------------------------------------------------------------------------ # pick and choose what resources to plot (one sub-plot per resource) -resrc = ['cpu', 'gpu'] resrc = ['cpu'] +resrc = ['cpu', 'gpu'] # pick and choose what contributions to plot metrics = [ # metric , [color , alpha]] @@ -84,8 +88,10 @@ ['idle' , ['#00FF00', 0.1 ]] ] -labels = [['exec_rp', 'exec_launch', 'exec_task', 'bootstrap', 'agent'], - ['raptor_master', 'raptor_worker', 'raptor_task', 'idle']] +labels = [['exec_rp', 'exec_launch', 'exec_task'], + ['bootstrap', 'agent', 'idle'], + # ['raptor_master', 'raptor_worker', 'raptor_task'], + ] # ------------------------------------------------------------------------------ # transition events for pilot, task, master, worker, request @@ -103,36 +109,36 @@ t_trans = [ [{1: 'schedule_ok'} , 'idle' , 'exec_rp' ] , - [{1: 'exec_start'} , 'exec_rp' , 'exec_launch' ] , - [{1: 'rank_start'} , 'exec_launch' , 'exec_task' ] , + [{1: 'launch_start'} , 'exec_rp' , 'exec_launch' ] , + [{1: 'exec_start'} , 'exec_launch' , 'exec_task' ] , # [{1: 'app_start'} , 'exec_task' , 'exec_task' ] , # [{1: 'app_stop'} , 'exec_task' , 'exec_task' ] , - [{1: 'rank_stop'} , 'exec_task' , 'exec_launch' ] , - [{1: 'exec_stop'} , 'exec_launch' , 'exec_rp' ] , + [{1: 'exec_stop'} , 'exec_task' , 'exec_launch' ] , + [{1: 'launch_stop'} , 'exec_launch' , 'exec_rp' ] , [{1: 'unschedule_stop'} , 'exec_rp' , 'idle' ] ] m_trans = [ [{1: 'schedule_ok'} , 'idle' , 'exec_rp' ] , - [{1: 'exec_start'} , 'exec_rp' , 'exec_launch' ] , - [{1: 'rank_start'} , 'exec_launch' , 'raptor_master'] , - [{1: 'rank_stop'} , 'raptor_master' , 'exec_launch' ] , - [{1: 'exec_stop'} , 'exec_launch' , 'exec_rp' ] , + [{1: 'launch_start'} , 'exec_rp' , 'exec_launch' ] , + [{1: 'exec_start'} , 'exec_launch' , 'raptor_master'] , + [{1: 'exec_stop'} , 'raptor_master' , 'exec_launch' ] , + [{1: 'launch_stop'} , 'exec_launch' , 'exec_rp' ] , [{1: 'unschedule_stop'} , 'exec_rp' , 'idle' ] ] w_trans = [ [{1: 'schedule_ok'} , 'idle' , 'exec_rp' ] , - [{1: 'exec_start'} , 'exec_rp' , 'exec_launch' ] , - [{1: 'rank_start'} , 'exec_launch' , 'raptor_worker'] , - [{1: 'rank_stop'} , 'raptor_worker' , 'exec_launch' ] , - [{1: 'exec_stop'} , 'exec_launch' , 'exec_rp' ] , + [{1: 'launch_start'} , 'exec_rp' , 'exec_launch' ] , + [{1: 'exec_start'} , 'exec_launch' , 'raptor_worker'] , + [{1: 'exec_stop'} , 'raptor_worker' , 'exec_launch' ] , + [{1: 'launch_stop'} , 'exec_launch' , 'exec_rp' ] , [{1: 'unschedule_stop'} , 'exec_rp' , 'idle' ] ] r_trans = [ - [{1: 'rank_start'} , 'raptor_worker' , 'raptor_task' ] , - [{1: 'rank_stop'} , 'raptor_task' , 'raptor_worker'] + [{1: 'exec_start'} , 'raptor_worker' , 'raptor_task' ] , + [{1: 'exec_stop'} , 'raptor_task' , 'raptor_worker'] ] # what entity maps to what transition table @@ -181,27 +187,35 @@ def main(): # Derive pilot and task timeseries of a session for each metric p_resrc, series, x = ra.get_pilot_series(session, pilot, tmap, resrc, use_percent) + r_areas = dict() + for plot_id, r in enumerate(resrc): + + if not p_resrc[r]: + continue + + # stack timeseries for each metrics into areas + areas = ra.stack_transitions(series, r, to_stack) + if len(areas) <= 3: + print('skip %s, not enough data' % r) + else: + r_areas[r] = areas + # #plots = # of resource types (e.g., CPU/GPU = 2 resource types = 2 plots) - n_plots = 0 - for r in p_resrc: - if p_resrc[r]: - n_plots += 1 + n_plots = len(r_areas) # sub-plots for each resource type, legend on first, x-axis shared - fig = plt.figure(figsize=(ra.get_plotsize(400))) + fig = plt.figure(figsize=(ra.get_plotsize(RES))) gs = mpl.gridspec.GridSpec(n_plots, 1) for plot_id, r in enumerate(resrc): - if not p_resrc[r]: + areas = r_areas.get(r) + if areas is None: continue # create sub-plot ax = plt.subplot(gs[plot_id]) - # stack timeseries for each metrics into areas - areas = ra.stack_transitions(series, r, to_stack) - # plot individual metrics prev_m = None patches = dict() @@ -237,7 +251,7 @@ def main(): ax.set_xlim([x['min'], x['max']]) if use_percent: - ax.set_ylim([0, 110]) + ax.set_ylim([0, 100]) else: ax.set_ylim([0, p_resrc[r]]) @@ -260,7 +274,7 @@ def main(): # first sub-plot gets legend if plot_id == 0: ax.legend(patches_sorted, legend_sorted, loc='upper center', - ncol=ncol, bbox_to_anchor=(0.5, 1.25), fancybox=True, + ncol=ncol, bbox_to_anchor=(0.5, 1.35), fancybox=True, shadow=True) for ax in fig.get_axes():