Skip to content

Commit

Permalink
update postpro workflow
Browse files Browse the repository at this point in the history
  • Loading branch information
greole committed Feb 18, 2024
1 parent 1fee3a7 commit 550c94d
Show file tree
Hide file tree
Showing 3 changed files with 228 additions and 141 deletions.
10 changes: 5 additions & 5 deletions .github/workflows/build-job-doc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,29 +56,29 @@ jobs:
obr query --query global --query TimeStep --query SolveP --query MomentumPredictor --query PISOStep
obr status \
--filter preconditioner==none \
--sort_by nCells,nProcs,executor,Host \
--sort_by nCells,nProcs,nNodes,executor,Host \
--extra TimeStep,SolveP,MomentumPredictor,PISOStep \
--hide view
echo "# Results Overview " > overview.md
echo "## Unpreconditioned" >> overview.md
obr status \
--filter preconditioner==none \
--sort_by nCells,nProcs,executor,Host \
--sort_by nCells,nProcs,nNodes,executor,Host \
--extra TimeStep,SolveP,MomentumPredictor,PISOStep \
--hide jobid,view \
--export_to markdown >> overview.md
echo "## Preconditioned" >> overview.md
obr status \
--filter preconditioner!=none \
--sort_by nCells,nProcs,executor,preconditioner,Host \
--sort_by nCells,nProcs,nNodes,executor,preconditioner,Host \
--extra TimeStep,SolveP,MomentumPredictor,PISOStep \
--hide jobid,view \
--export_to markdown >> overview.md
mkdir -p postProcessing/${{env.CAMPAIGN}}
obr status \
--sort_by nCells,nProcs,executor,preconditioner \
--sort_by nCells,nProcs,nNodes,executor,preconditioner \
--hide view,jobid \
--extra TimeStep,SolveP,MomentumPredictor,PISOStep,Host,solver_p \
--extra TimeStep,SolveP,MomentumPredictor,PISOStep,Host,solver_p,p_NoIterations \
--export_to json > postProcessing/${{env.CAMPAIGN}}/results.json
cat postProcessing/${{env.CAMPAIGN}}/results.json
Expand Down
241 changes: 156 additions & 85 deletions LidDrivenCavity3D/assets/plot.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,52 @@
import matplotlib.pyplot as plt
import seaborn as sb
import exasim_plot_helpers as eph
import logging

from pathlib import Path
from copy import deepcopy

from pathlib import Path


def plot_script():
return """import pandas as pd
df_json = '{}'
df = pd.DataFrame.read_json(df_json)
"""


def palette():
return sb.color_palette("tab10")


def plotter(
x, y, color, style, df, df_filter, post_pro_dir, postfix="", size=None, col=None, log=None, plot_type="line"
x,
y,
color,
style,
df,
df_filter,
post_pro_dir,
postfix="",
size=None,
col=None,
log=None,
plot_type="line",
):
df = df_filter(df)
if df.empty:
logging.warning("Dataframe empty after filter")
name = f"{df_filter.name}_{y}_over_{x}_c={color}_s={style}_cols={col}{postfix}"
script_name = name+".py"
script_name = name + ".py"

script_dir = post_pro_dir / "scripts"
script_dir.mkdir(parents=True, exist_ok=True)

with open (post_pro_dir / script_name, "w") as script:
with open(script_dir / script_name, "w") as script:
script.write(plot_script().format(df.to_json()))


relplot = sb.relplot(
x=x,
y=y,
Expand All @@ -35,15 +59,15 @@ def plotter(
col=col,
kind=plot_type,
markers=True,
palette=palette(),
)
if log == "both":
plt.xscale("log")
plt.yscale("log")
if log == "x":
plt.xscale("log")
fig_name = name + ".png"
plt.savefig(post_pro_dir / fig_name )

plt.savefig(post_pro_dir / fig_name)


def col_divide(df_orig, df_comparisson):
Expand All @@ -54,115 +78,162 @@ def col_divide(df_orig, df_comparisson):
if c == "nCells" or c == "nProcs":
continue
try:
print(f"c: {c} ret[c] {df_comparisson[c] / df_orig[c]} comp: {df_comparisson[c]} orig: {df_orig[c]}")
ret[c] = df_comparisson[c] / df_orig[c]
print(
f"c: {c} ret[c] {df_comparisson[c] / df_orig[c]} comp: {df_comparisson[c]} orig: {df_orig[c]}"
)
ret[c] = df_comparisson[c] / df_orig[c]
except Exception as e:
print(e, c)
pass
print(f"df[TimeStep] {ret['TimeStep']}")
return ret



class Df_filter:
def __init__(self, name, func):
self.name = name
self.func = func

def __call__(self, df):
return self.func(df)
return self.func(deepcopy(df))


def compute_speedup(df, bases, extra_filter=lambda df: df):
from copy import deepcopy
def compute_speedup(df, bases, extra_filter=lambda df: df, node_based=False):
# check if bases vals are in df
bases_clean = []
for record in bases:
base = record["base"]
keep = all([query.val in df[query.idx].values for query in base])
if keep:
bases_clean.append(record)
bases=bases_clean

indices = [q.idx for q in bases[0]["base"]]
indices.append("Host")
# things that need to match
indices += ["nCells"]
if node_based:
indices = [q.idx for q in bases[0]["base"]]
indices += ["nNodes"]
exclude = None
else:
indices = [q.idx for q in bases[0]["base"]]
exclude = ["nNodes"]
indices += ["nCells", "Host"]

df_copy = deepcopy(extra_filter(df))
df_copy.set_index(keys=indices, inplace=True)
speedup_df = eph.helpers.compute_speedup(df_copy, bases, ignore_indices=[]).reset_index()
df_copy_set_idx = df_copy.set_index(keys=indices)
speedup_df = eph.helpers.compute_speedup(
df_copy_set_idx, bases, ignore_indices=[], exclude=exclude
).reset_index()

return speedup_df[speedup_df["executor"] != "CPU"]


def generate_base(node_based=False):
"""This function generates the list of base cases queries. The base case queries are used to compute the speedup.
If node_based is set to be true no specific number of nProcs is added to the base case query.
Returns:
a list case and base case queries
"""

# TODO this needs to know nProcs beforehand
base_ = [
eph.helpers.DFQuery(idx="preconditioner", val="none"),
eph.helpers.DFQuery(idx="executor", val="CPU"),
]

base_nla = deepcopy(base_)
base_hkn = deepcopy(base_)
base_smuc = deepcopy(base_)

if not node_based:
base_nla.append(eph.helpers.DFQuery(idx="nProcs", val=32))
base_hkn.append(eph.helpers.DFQuery(idx="nProcs", val=76))
base_smuc.append(eph.helpers.DFQuery(idx="nProcs", val=112))

return [
# {
# "case": [
# eph.helpers.DFQuery(idx="Host", val="nla"),
# ],
# "base": base_nla,
# },
{
"case": [
eph.helpers.DFQuery(idx="Host", val="hkn"),
],
"base": base_hkn,
},
]
{
"case": [
eph.helpers.DFQuery(idx="Host", val="i20"),
],
"base": base_smuc,
},


def compute_fvops(df):
"""this function computes fvops"""
df["fvOps"] = df["nCells"] / df["TimeStep"] * 1000.
return df

def compute_fvops_piter(df):
"""this function computes nCellsPerCU"""
df["fvOpsPIter"] = df["nCells"] / df["TimeStep"] * 1000 / df["p_NoIterations"]
return df

def compute_nCellsPerCU(df):
"""this function computes nCellsPerCU"""
df["nCellsPerRank"] = df["nCells"] / df["nProcs"]
return df


def main(campaign, comparisson=None):
script_dir = Path(__file__).parent
post_pro_dir = script_dir / "../postProcessing/{}".format(campaign)
json_file = post_pro_dir / "results.json"
df = pd.read_json(json_file)

bases = [
{
"case": [
eph.helpers.DFQuery(idx="Host", val="nla"),
],
"base" : [
# TODO this needs to know nProcs beforehand
eph.helpers.DFQuery(idx="nProcs", val=32),
eph.helpers.DFQuery(idx="preconditioner", val="none"),
eph.helpers.DFQuery(idx="executor", val="CPU"),
]
},
{
"case": [
eph.helpers.DFQuery(idx="Host", val="hkn"),
],
"base" : [
# TODO this needs to know nProcs beforehand
eph.helpers.DFQuery(idx="nProcs", val=76),
eph.helpers.DFQuery(idx="preconditioner", val="none"),
eph.helpers.DFQuery(idx="executor", val="CPU"),
]
},
{
"case": [
eph.helpers.DFQuery(idx="Host", val="i20"),
],
"base" : [
# TODO this needs to know nProcs beforehand
eph.helpers.DFQuery(idx="nProcs", val=112),
eph.helpers.DFQuery(idx="preconditioner", val="none"),
eph.helpers.DFQuery(idx="executor", val="CPU"),
]
},
]

speedup = compute_speedup(df, bases)
speedup.to_json(path_or_buf=post_pro_dir/"speedup_results.json")

df = compute_fvops(df)
df = compute_fvops_piter(df)
df = compute_nCellsPerCU(df)

unprecond = lambda x: x[x["preconditioner"] == "none"]
for x, c in [("nCells", "nProcs"), ("nProcs", "nCells")]:
for y in ["TimeStep", "SolveP"]:
plotter(
x=x,
y=y,
color=c,
style="solver_p",
post_pro_dir=post_pro_dir,
plot_type="line",
col="Host",
log=True,
df=df,
df_filter=Df_filter("unpreconditioned", unprecond),
)

plotter(
x=x,
y=y,
color=c,
style="solver_p",
post_pro_dir=post_pro_dir,
plot_type="line",
col="Host",
log=True,
df=df,
df_filter=Df_filter(
"unprecond_speedup", lambda df: compute_speedup(df, bases, unprecond)
),
)
for filt in [
Df_filter("unpreconditioned", unprecond),
Df_filter(
"unprecond_speedup",
lambda df: compute_speedup(df, generate_base(node_based=False), unprecond),
),
Df_filter(
"unprecond_speedup_nNodes",
lambda df: compute_speedup(
df, generate_base(node_based=True), unprecond, node_based=True
),
),
]:
for x, c in [
("nCells", "nProcs"),
("nProcs", "nCells"),
("nNodes", "nCells"),
("nCellsPerRank", "nCells"),
]:
try:
for y in ["TimeStep", "SolveP", "fvOps", "fvOpsPIter"]:
plotter(
x=x,
y=y,
color=c,
style="solver_p",
post_pro_dir=post_pro_dir,
plot_type="line",
col="Host",
log=True,
df=df,
df_filter=filt,
)
except Exception as e:
print(e)

# comparisson against other results
try:
Expand Down
Loading

0 comments on commit 550c94d

Please sign in to comment.