Skip to content

Commit e113b5a

Browse files
author
OutlyingWest
committed
display_graph_for_all moved to the extension
1 parent e0d0fcb commit e113b5a

3 files changed

Lines changed: 49 additions & 39 deletions

File tree

src/jumper/context.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
from dataclasses import dataclass
22

3+
from jumper.perfdatahandler import PerformanceDataHandler
4+
35

46
@dataclass
57
class KernelContext:
68
nodelist: list = None
9+
perfdata_handler = PerformanceDataHandler()
710

811

912
kernel_context = KernelContext()

src/jumper/kernel.py

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,10 @@ def __init__(self, **kwargs):
9595

9696
# will be set to True as soon as GPU data is received
9797
self.gpu_avail = False
98-
self.perfdata_handler = PerformanceDataHandler()
99-
kernel_context.nodelist = self.perfdata_handler.get_nodelist()
98+
# TODO: Temporary share perfdata_handler instance with an ipython extension
99+
# as it contains data that should be shared with the extension.
100+
kernel_context.perfdata_handler = PerformanceDataHandler()
101+
kernel_context.nodelist = kernel_context.perfdata_handler.get_nodelist()
100102

101103
self.scorep_available_ = shutil.which("scorep")
102104
self.scorep_python_available_ = True
@@ -717,7 +719,7 @@ async def scorep_execute(
717719
cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=proc_env
718720
)
719721

720-
self.perfdata_handler.start_perfmonitor(proc.pid)
722+
kernel_context.perfdata_handler.start_perfmonitor(proc.pid)
721723
# For memory mode jupyter_dump and jupyter_update must be awaited
722724
# concurrently to the running subprocess
723725
if self.pershelper.mode == "memory":
@@ -779,7 +781,7 @@ async def scorep_execute(
779781
time_indices = None
780782
if len(multicellmode_timestamps):
781783
# retrieve the index this cell will have in the global history
782-
sub_idx = len(self.perfdata_handler.get_code_history())
784+
sub_idx = len(kernel_context.perfdata_handler.get_code_history())
783785
# append to have end of last code fragment
784786
multicellmode_timestamps.append("MCM_TS" + str(time.time()))
785787
time_indices = [[]]
@@ -819,7 +821,7 @@ async def scorep_execute(
819821
time_indices[0][idx] = (sub_idx, ms)
820822

821823
performance_data_nodes, duration = (
822-
self.perfdata_handler.end_perfmonitor()
824+
kernel_context.perfdata_handler.end_perfmonitor()
823825
)
824826

825827
# In disk mode, subprocess already terminated
@@ -909,7 +911,7 @@ async def scorep_execute(
909911
self.pershelper.postprocess()
910912
if performance_data_nodes:
911913
self.report_perfdata(performance_data_nodes, duration)
912-
self.perfdata_handler.append_code(
914+
kernel_context.perfdata_handler.append_code(
913915
datetime.datetime.now(), code, time_indices
914916
)
915917
return self.standard_reply()
@@ -957,9 +959,9 @@ async def do_execute(
957959
return self.standard_reply()
958960
"""
959961
if code.startswith("%%display_graph_for_last"):
960-
if not len(self.perfdata_handler.get_perfdata_history()):
962+
if not len(kernel_context.perfdata_handler.get_perfdata_history()):
961963
self.cell_output("No performance data available.")
962-
time_indices = self.perfdata_handler.get_time_indices()[-1]
964+
time_indices = kernel_context.perfdata_handler.get_time_indices()[-1]
963965
if time_indices:
964966
sub_idxs = [x[0] for x in time_indices[0]]
965967
self.cell_output(
@@ -969,7 +971,7 @@ async def do_execute(
969971
)
970972
perfvis.draw_performance_graph(
971973
kernel_context.nodelist,
972-
self.perfdata_handler.get_perfdata_history()[-1],
974+
kernel_context.perfdata_handler.get_perfdata_history()[-1],
973975
self.gpu_avail,
974976
time_indices,
975977
)
@@ -981,14 +983,14 @@ async def do_execute(
981983
"stdout",
982984
)
983985
index = int(code.split(" ")[1])
984-
if index >= len(self.perfdata_handler.get_perfdata_history()):
986+
if index >= len(kernel_context.perfdata_handler.get_perfdata_history()):
985987
self.cell_output(
986988
"Tracked only "
987-
+ str(len(self.perfdata_handler.get_perfdata_history()))
989+
+ str(len(kernel_context.perfdata_handler.get_perfdata_history()))
988990
+ " cells. This index is not available."
989991
)
990992
else:
991-
time_indices = self.perfdata_handler.get_time_indices()[index]
993+
time_indices = kernel_context.perfdata_handler.get_time_indices()[index]
992994
if time_indices:
993995
sub_idxs = [x[0] for x in time_indices[0]]
994996
self.cell_output(
@@ -998,22 +1000,11 @@ async def do_execute(
9981000
)
9991001
perfvis.draw_performance_graph(
10001002
kernel_context.nodelist,
1001-
self.perfdata_handler.get_perfdata_history()[index],
1003+
kernel_context.perfdata_handler.get_perfdata_history()[index],
10021004
self.gpu_avail,
10031005
time_indices,
10041006
)
10051007
return self.standard_reply()
1006-
elif code.startswith("%%display_graph_for_all"):
1007-
data, time_indices = (
1008-
self.perfdata_handler.get_perfdata_aggregated()
1009-
)
1010-
perfvis.draw_performance_graph(
1011-
kernel_context.nodelist,
1012-
data,
1013-
self.gpu_avail,
1014-
time_indices,
1015-
)
1016-
return self.standard_reply()
10171008

10181009
elif code.startswith("%%display_code_for_index"):
10191010
if len(code.split(" ")) == 1:
@@ -1022,28 +1013,28 @@ async def do_execute(
10221013
"stdout",
10231014
)
10241015
index = int(code.split(" ")[1])
1025-
if index >= len(self.perfdata_handler.get_perfdata_history()):
1016+
if index >= len(kernel_context.perfdata_handler.get_perfdata_history()):
10261017
self.cell_output(
10271018
"Tracked only "
1028-
+ str(len(self.perfdata_handler.get_perfdata_history()))
1019+
+ str(len(kernel_context.perfdata_handler.get_perfdata_history()))
10291020
+ " cells. This index is not available."
10301021
)
10311022
else:
10321023
self.cell_output(
10331024
"Cell timestamp: "
1034-
+ str(self.perfdata_handler.get_code_history()[index][0])
1025+
+ str(kernel_context.perfdata_handler.get_code_history()[index][0])
10351026
+ "\n--\n",
10361027
"stdout",
10371028
)
10381029
self.cell_output(
1039-
self.perfdata_handler.get_code_history()[index][1],
1030+
kernel_context.perfdata_handler.get_code_history()[index][1],
10401031
"stdout",
10411032
)
10421033
return self.standard_reply()
10431034
elif code.startswith("%%display_code_history"):
10441035
show(
10451036
pd.DataFrame(
1046-
self.perfdata_handler.get_code_history(),
1037+
kernel_context.perfdata_handler.get_code_history(),
10471038
columns=["timestamp", "code"],
10481039
).reset_index(),
10491040
layout={"topStart": "search", "topEnd": None},
@@ -1065,14 +1056,14 @@ async def do_execute(
10651056
# In addition, it has a counter for the number of measurements
10661057
# each sub cell corresponds to in the list of performance data
10671058
# measurements, e.g. (2_0, 5), (2_1, 3), (2_2, 7)
1068-
mcm_time_indices = self.perfdata_handler.get_time_indices()
1059+
mcm_time_indices = kernel_context.perfdata_handler.get_time_indices()
10691060
mcm_time_indices = list(
10701061
filter(lambda item: item is not None, mcm_time_indices)
10711062
)
10721063

10731064
code = (
10741065
f"{varname}="
1075-
f"{self.perfdata_handler.get_perfdata_history()}"
1066+
f"{kernel_context.perfdata_handler.get_perfdata_history()}"
10761067
)
10771068

10781069
if mcm_time_indices:
@@ -1107,13 +1098,13 @@ async def do_execute(
11071098
filename = code.split(" ")[1]
11081099
with open(f"{filename}_perfdata.json", "w") as f:
11091100
json.dump(
1110-
self.perfdata_handler.get_perfdata_history(),
1101+
kernel_context.perfdata_handler.get_perfdata_history(),
11111102
default=str,
11121103
fp=f,
11131104
)
11141105
with open(f"{filename}_code.json", "w") as f:
11151106
json.dump(
1116-
self.perfdata_handler.get_code_history(),
1107+
kernel_context.perfdata_handler.get_code_history(),
11171108
default=str,
11181109
fp=f,
11191110
)
@@ -1212,7 +1203,7 @@ async def do_execute(
12121203
else:
12131204
if self.mode == KernelMode.DEFAULT:
12141205
self.pershelper.parse(magics_cleanup(code)[1], "jupyter")
1215-
self.perfdata_handler.start_perfmonitor(os.getpid())
1206+
kernel_context.perfdata_handler.start_perfmonitor(os.getpid())
12161207
parent_ret = await super().do_execute(
12171208
code,
12181209
silent,
@@ -1222,11 +1213,11 @@ async def do_execute(
12221213
cell_id=cell_id,
12231214
)
12241215
performance_data_nodes, duration = (
1225-
self.perfdata_handler.end_perfmonitor()
1216+
kernel_context.perfdata_handler.end_perfmonitor()
12261217
)
12271218
if performance_data_nodes:
12281219
self.report_perfdata(performance_data_nodes, duration)
1229-
self.perfdata_handler.append_code(
1220+
kernel_context.perfdata_handler.append_code(
12301221
datetime.datetime.now(), code
12311222
)
12321223
return parent_ret

src/magic_extension/magic.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,35 @@
77
from jumper.kernel import KernelMode
88

99
from jumper.perfdatahandler import PerformanceDataHandler
10+
import jumper.visualization as perfvis
1011

1112

1213
@magics_class
1314
class KernelMagics(Magics):
1415
def __init__(self, shell):
1516
super(KernelMagics, self).__init__(shell)
16-
self.perfdata_handler = PerformanceDataHandler()
1717
self.mode = KernelMode.DEFAULT
1818

19+
# will be set to True as soon as GPU data is received
20+
self.gpu_avail = False
21+
1922
@cell_magic
2023
def abra(self, line, cell):
2124
print('HELLO!\n', cell)
2225

26+
@line_magic
27+
def display_graph_for_all(self, line):
28+
data, time_indices = (
29+
kernel_context.perfdata_handler.get_perfdata_aggregated()
30+
)
31+
perfvis.draw_performance_graph(
32+
kernel_context.nodelist,
33+
data,
34+
self.gpu_avail,
35+
time_indices,
36+
)
37+
38+
2339
@cell_magic
2440
def set_perfmonitor(self, line, code):
2541
"""
@@ -33,8 +49,8 @@ def set_perfmonitor(self, line, code):
3349
)
3450
else:
3551
try:
36-
self.perfdata_handler.set_monitor(monitor)
37-
kernel_context.nodelist = self.perfdata_handler.get_nodelist()
52+
kernel_context.perfdata_handler.set_monitor(monitor)
53+
kernel_context.nodelist = kernel_context.perfdata_handler.get_nodelist()
3854
if len(kernel_context.nodelist) <= 1:
3955
kernel_context.nodelist = None
4056
self.cell_output(

0 commit comments

Comments
 (0)