Skip to content

Commit

Permalink
Release candidate version of thesis defence
Browse files Browse the repository at this point in the history
  • Loading branch information
Kobzol committed Nov 11, 2024
1 parent e83c18f commit 6102f20
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 59 deletions.
14 changes: 7 additions & 7 deletions thesis/defence/challenges.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,13 +123,13 @@ def heterogeneous_tasks(slide: Box):
left = cols.box(width=900, y=0)
tasks = render_tasks(left)

right = cols.box(y=0, width=600)
row = right.box(x=0, horizontal=True)
row.box(p_right=20).text("Node granularity")
row.box(width=50).image("images/prohibited.svg")
row = right.box(show="2+", x=0, horizontal=True)
row.box(p_right=20).text("Coarse-grained dependencies")
row.box(width=50).image("images/prohibited.svg")
# right = cols.box(y=0, width=600)
# row = right.box(x=0, horizontal=True)
# row.box(p_right=20).text("Node granularity")
# row.box(width=50).image("images/prohibited.svg")
# row = right.box(show="2+", x=0, horizontal=True)
# row.box(p_right=20).text("Coarse-grained dependencies")
# row.box(width=50).image("images/prohibited.svg")

colours = [RED, GREEN, BLUE, ORANGE]
random.seed(42)
Expand Down
38 changes: 20 additions & 18 deletions thesis/defence/estee.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,25 @@ def estee_intro(slide: Box):
lst.item(show="next+").text("Which factors affect scheduling the most?")
lst.item(show="next+").text("How can we simplify scheduler prototyping?")

@slides.slide()
def estee_code(slide: Box):
slide = slide_header_top(slide, "ESTEE")
# @slides.slide()
# def estee_code(slide: Box):
# slide = slide_header_top(slide, "ESTEE")

slide.update_style("default", T(size=50))
lst = unordered_list(slide.box())
lst.item().text("Framework for simulating task graph execution")
# slide.update_style("default", T(size=50))
# lst = unordered_list(slide.box())
# lst.item().text("Framework for simulating task graph execution")
# Discrete event simulation
lst.item(show="next+").text("Python interface designed for prototyping")
lst.item(show="next+").text('"Batteries included"')
# lst.item(show="next+").text("Python interface designed for prototyping")
# lst.item(show="next+").text('"Batteries included"')

@slides.slide()
def estee_code(slide: Box):
slide = slide_header_top(slide, "ESTEE usage example")
slide = slide_header_top(slide, "ESTEE")
slide.update_style("code", T(size=26))

row = slide.box(horizontal=True, x=25, p_top=100)
slide.box(p_top=80).text("Framework for simulating task graph execution")

row = slide.box(horizontal=True, x=25, p_top=100, show="next+")
width = 1030
codebox: TextBoxItem = code_step(row.box(p_top=30, width=width, y=0), """
dag = TaskGraph()
Expand All @@ -58,15 +60,15 @@ def estee_code(slide: Box):
simulator = Simulator(task_graph, cluster, scheduler, network)
~#makespan{makespan} = simulator.run()
""", 1, [
""", 2, [
list(range(6)),
list(range(8)),
list(range(9)),
list(range(10)),
list(range(13)),
], language="python", width=width, use_styles=True, return_box=True)
], language="python", width=width, use_styles=True, return_box=True )
row.box(width=30)
row.box(width=500).image("images/estee-architecture.svg")
row.box(width=500).image("images/estee-architecture.svg", show_begin=2)
codebox.inline_box("#makespan", padding=-5, show="next+").rect(color="red", stroke_width=4)

@slides.slide()
Expand All @@ -77,10 +79,10 @@ def estee_analysis(slide: Box):
lst = unordered_list(slide.box())
lst.item().text("Compare scheduler performance")
lst.item(show="next+").text("Analyze neglected factors")
lst2 = lst.ul()
lst2.item().text("Knowledge about task durations", style="l2")
lst2.item().text("Delay between scheduler invocations", style="l2")
lst2.item().text("Network model", style="l2")
# lst2 = lst.ul()
# lst2.item().text("Knowledge about task durations", style="l2")
# lst2.item().text("Delay between scheduler invocations", style="l2")
# lst2.item().text("Network model", style="l2")

@slides.slide()
def estee_chart_1(slide: Box):
Expand All @@ -89,7 +91,7 @@ def estee_chart_1(slide: Box):

@slides.slide()
def estee_chart_2(slide: Box):
content = slide_header_top(slide, "Scheduling delay effect")
content = slide_header_top(slide, "Scheduling frequency effect")
content.box(width="75%").image("images/estee-msd.png")

@slides.slide()
Expand Down
64 changes: 44 additions & 20 deletions thesis/defence/hq.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import functools
from typing import Iterable, List, Optional, Union

from elsie import Slides, TextStyle as T
from elsie import Arrow, Slides, TextStyle as T
from elsie.boxtree.box import Box
from elsie.ext import unordered_list
from elsie.ext.list import ListBuilder
Expand Down Expand Up @@ -92,7 +92,6 @@ def task_to_allocation_mapping(slide: Box):
lst2.item().text("Massive overhead (millions of allocations)", style="l2")
lst2.item().text("Allocation count limits", style="l2")
lst2.item().text("Node granularity", style="l2")
lst2.item().text("Difficult with dependencies", style="l2")
lst.item(show="next+", p_top=10).text("One allocation for the whole task graph")
lst2 = lst.ul()
lst2.item().text("Only for small task graphs", style="l2")
Expand All @@ -101,6 +100,7 @@ def task_to_allocation_mapping(slide: Box):
lst2 = lst.ul()
lst2.item().text("Challenging to find good partitioning", style="l2")
lst2.item().text("No load balancing across allocations", style="l2")
lst2.item().text("Difficult dependency management", style="l2")

task_size = 50
node_size = 60
Expand Down Expand Up @@ -203,6 +203,7 @@ def node_row(box: Box, count: int):
for _ in range(count):
node(row.box(width=node_size, x=x), size=node_size)
x += node_size + margin
return row

task_box = row.box()
task_box_1 = task_box.fbox(show="2-3")
Expand Down Expand Up @@ -261,7 +262,7 @@ def overlay_node(node_box: Box, show: str,

text_box = row.box(p_left=20, p_right=100, horizontal=True)
text_box.box(p_right=20).text("→")
text_box.box().text("Meta-scheduler")
metascheduler = text_box.box().text("Meta-scheduler")

slurm_box_width = 200
slurm_box = text_box.box(p_left=20, width=slurm_box_width).text("→ Slurm →")
Expand All @@ -276,6 +277,14 @@ def overlay_node(node_box: Box, show: str,
overlay_node(pbs_nodes[0], show=node_fragment, color_index=1, mode="down")
overlay_node(pbs_nodes[1], show=node_fragment, color_index=2)

arrow = Arrow(size=10)
row.box(show=f"{fragment + 2}+").line([
(metascheduler.x("50%"), metascheduler.y("0").add(-20)),
(metascheduler.x("50%"), metascheduler.y("0").add(-50)),
(pbs_nodes[0].x("50%"), metascheduler.y("0").add(-50)),
(pbs_nodes[0].x("50%"), metascheduler.y("0").add(-20)),
], stroke_width=2, start_arrow=arrow, end_arrow=arrow)

task_box_2 = task_box.overlay(show=f"{fragment + 3}+")
task_graph_grid(task_box_2.box(), size=task_size, rows=1, cols=2,
task_constructor=functools.partial(pbs_task, offset=3))
Expand All @@ -288,7 +297,7 @@ def overlay_node(node_box: Box, show: str,
(content.x("95%"), row.y("100%").add(margin_line))
))

row = wrapper.box(horizontal=True, width=width, height=300, show="last+")
row = wrapper.box(horizontal=True, width=width, height=220, show="last+")

content.box(x=50, y=row.y("[50%]").add(-40), show="last+").text("Meta-scheduling +\nautomatic allocation",
style=T(size=label_size))
Expand All @@ -299,20 +308,35 @@ def overlay_node(node_box: Box, show: str,

text_box = row.box(p_left=20, p_right=100, horizontal=True)
text_box.box(p_right=20).text("→")
hq_box = text_box.box().text("Meta-scheduler")
text_box.box(p_left=20, width=slurm_box_width).text("→ Slurm →")
metascheduler = text_box.box().text("Meta-scheduler")
slurm_box = text_box.box(p_left=20, width=slurm_box_width).text("→ Slurm →")

pbs_nodes = cluster_1(row.box(x=row.x("100%").add(-25)), size=node_size)

node(row.box(x=hq_box.x("50%"), y=hq_box.y(0).add(-25), show="next+"), x=0, y=0,
fragment = slide.current_fragment() + 1
below_slurm_box = row.box(x=slurm_box.x(0), y=slurm_box.y("100%"), width=slurm_box_width,
show=f"{fragment + 1}+")
below_slurm_box.box().text("↑")
alloc_row = node_row(below_slurm_box.box(), count=2)

alloc_template = node(row.box(x=metascheduler.x("50%"), y=alloc_row.y("50%"), show=f"{fragment}+"), x=0, y=0,
size=node_size, node_args=dict(stroke_dasharray="4", stroke_width="2"))
row.box(show=f"{fragment + 1}+").line([
(alloc_template.x("100%").add(20), alloc_template.y("50%")),
(alloc_row.x("0").add(-20), alloc_template.y("50%")),
], stroke_width=2, end_arrow=arrow)

fragment = slide.current_fragment() + 1
overlay_node(pbs_nodes[0], show=f"{fragment}", color_index=None)
overlay_node(pbs_nodes[1], show=f"{fragment}", color_index=None)
overlay_node(pbs_nodes[0], show=f"{fragment + 1}+", color_index=0, mode="up")
overlay_node(pbs_nodes[0], show=f"{fragment + 1}+", color_index=1, mode="down")
overlay_node(pbs_nodes[1], show=f"{fragment + 1}+", color_index=2)
row.box(show=f"{fragment}+").line([
(metascheduler.x("50%"), metascheduler.y("0").add(-20)),
(metascheduler.x("50%"), metascheduler.y("0").add(-50)),
(pbs_nodes[0].x("50%"), metascheduler.y("0").add(-50)),
(pbs_nodes[0].x("50%"), metascheduler.y("0").add(-20)),
], stroke_width=2, start_arrow=arrow, end_arrow=arrow)

overlay_node(pbs_nodes[0], show=f"{fragment}+", color_index=0, mode="up")
overlay_node(pbs_nodes[0], show=f"{fragment}+", color_index=1, mode="down")
overlay_node(pbs_nodes[1], show=f"{fragment}+", color_index=2)

# @slides.slide()
# def autoalloc(slide: Box):
Expand Down Expand Up @@ -460,10 +484,10 @@ def hq_software(slide: Box):

slide.box(p_top=100, show="next+").text("Task runtime designed for HPC use-cases")

row = slide.box(p_top=80, horizontal=True, show="next+")
margin = 50
row.box(width=400, p_right=margin).image("images/it4i-logo.png")
row.box(width=300, p_right=margin).image("images/ligate-logo.png")
# row = slide.box(p_top=80, horizontal=True, show="next+")
# margin = 50
# row.box(width=400, p_right=margin).image("images/it4i-logo.png")
# row.box(width=300, p_right=margin).image("images/ligate-logo.png")

# slide.box(show="next+", p_top=40).text("Team effort @ IT4I")
# slide.box(show="last+").text("(primary contributors: Ada Böhm & me)", style="l2")
Expand Down Expand Up @@ -519,10 +543,10 @@ def hq_fractional_resources(slide: Box):
content = slide_header_top(slide, "Fractional resources evaluation")
content.box().image("images/hq-evaluation-fractional-resources.png")

@slides.slide()
def hq_resource_variants(slide: Box):
content = slide_header_top(slide, "Resource variants evaluation")
content.box().image("images/hq-evaluation-resource-variants.png")
# @slides.slide()
# def hq_resource_variants(slide: Box):
# content = slide_header_top(slide, "Resource variants evaluation")
# content.box().image("images/hq-evaluation-resource-variants.png")

@slides.slide()
def hq_sota_comparison(slide: Box):
Expand Down
2 changes: 1 addition & 1 deletion thesis/defence/rsds.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def rsds_outcome(slide: Box):
lst2.item().text("Even a random scheduler can be competitive!", style="l2")
lst.item(show="next+").text("Dask scaled poorly on HPC")
lst2 = lst.ul()
lst2.item().text("Caused by inefficient runtime and GIL", style="l2")
lst2.item().text("Caused by inefficient Python runtime and GIL", style="l2")
# lst2.item(show="next+").text("<100 ms tasks problematic", style="l2")
lst.item(show="next+").text("RSDS: open source alternative to Dask's server")
lst2 = lst.ul()
Expand Down
26 changes: 13 additions & 13 deletions thesis/defence/slides.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from utils import slide_header_top
from workflows import workflows

PRODUCTION_BUILD = False
PRODUCTION_BUILD = True

WIDTH = 1600
HEIGHT = 900
Expand Down Expand Up @@ -114,17 +114,23 @@ def objectives_fulfilled(slide: Box):
offset = 40

lst = ordered_list(content.box(p_top=80))
lst.item(show="next+").text("Identify HPC workflow challenges ✓")
lst.item().text("Identify HPC workflow challenges ✓")
lst.item(show="next+", p_top=offset).text("Design approaches for overcoming them ✓")
lst2 = lst.ul()
lst2.item(show="next+").text("Meta-scheduling approach", style="l2")
lst2.item(show="next+").text("Heterogeneous resource management", style="l2")
lst2.item().text("Meta-scheduling approach", style="l2")
lst2.item().text("Heterogeneous resource management", style="l2")
lst.item(show="next+", p_top=offset).text("Implement them in a task runtime ✓")
lst2 = lst.ul()
lst2.item(show="next+").text("HyperQueue", style="l2")
lst2.item().text("HyperQueue", style="l2")
lst.item(show="next+", p_top=offset).text("Analyze results on real use-cases ✓")
lst2 = lst.ul()
lst2.item(show="next+").text("LIGATE, CERN", style="l2")
lst2.item().text("LIGATE, CERN", style="l2")


@slides.slide()
def outro(slide: Box):
slide.box().text("Thank you for your attention", style=T(size=70))
slide.box(y="[90%]").text("Slides made with https://github.com/spirali/elsie", style=T(size=40))


@slides.slide()
Expand Down Expand Up @@ -206,12 +212,6 @@ def publications_unrelated(slide: Box):
~emph{Complex, Intelligent, and Software Intensive Systems 2020}""")


@slides.slide()
def outro(slide: Box):
slide.box().text("Thank you for your attention", style=T(size=70))
slide.box(y="[90%]").text("Slides made with https://github.com/spirali/elsie", style=T(size=40))


main_slide_count = len(slides._slides)

questions(slides)
Expand Down Expand Up @@ -255,7 +255,7 @@ def calculate_dim(slide: Slide, progress: float) -> Tuple[float, Tuple[float, fl
total_steps += steps

numbering_start = 2
numbering_end = 53
numbering_end = 49


def page_numbering(slides: List[Box]):
Expand Down

0 comments on commit 6102f20

Please sign in to comment.