Add timing script for investigating action contribution

This commit is contained in:
2024-03-11 04:31:14 +01:00
parent dac08095c4
commit 3ba78c5f11
4 changed files with 90 additions and 17 deletions
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env python
import argparse
import sys
import timing
ignore = ["TimeStep"]
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument("jobs", nargs="+")
p.add_argument("--normalize", action="store_true")
p.add_argument("--extra-columns", nargs="*")
args = p.parse_args()
columns = [
"BC:cells",
"BC:dynamicecm",
"Sweep:Cells",
"Sweep:DynamicECM",
"Sweep:DynamicECMDampers",
] + (args.extra_columns or [])
dfs = dict()
labels = []
for label, jobid in [jobarg.split(":") for jobarg in args.jobs]:
jobs, excluded_array_indices = timing.get_jobs(jobid)
df = timing.load_array_mean_timings(jobid, excluded_array_indices).mean()
dfs[label] = df
labels.extend(df.index)
labels = set(labels)
print(",".join(["label"] + columns + ["Other"]))
values_by_label = dict()
for label, df in dfs.items():
values = {"Other": 0}
for c in df.index:
if c in ignore:
continue
elif c not in columns:
values["Other"] += df[c]
print(f"Others+= {c}={df[c]}", file=sys.stderr)
else:
values[c] = df[c]
values_by_label[label] = values
if args.normalize:
print("Normalizing data to 100%...", file=sys.stderr)
for values in values_by_label.values():
row_length = sum(values.values())
for c in values.keys():
values[c] *= 100 / row_length
for label, values in values_by_label.items():
print(label + "," + ",".join(f"{values[c]}" for c in columns + ["Other"]))
+21 -17
View File
@@ -72,6 +72,26 @@ def get_accounting_data(jobid: str):
return json.loads(sacct_results.stdout.decode("utf8"))
def get_jobs(jobid: str):
accounting_data = get_accounting_data(jobid)
jobs = []
excluded_array_indices = []
for array_job in accounting_data["jobs"]:
# Get metadata related to array
array_main_job = array_job["array"]["job_id"]
array_index = array_job["array"]["task_id"]
# The last step is the actual job we want the data for
# The steps before set up cluster etc.
last_step = array_job["steps"][-1]
if last_step["state"] != "COMPLETED":
print(f"WARNING: {array_main_job}.{array_index} has state {last_step['state']}, excluding it from measurements", file=sys.stderr)
excluded_array_indices.append(array_index)
continue
jobs.append(last_step)
return jobs, excluded_array_indices
if __name__ == "__main__":
p = argparse.ArgumentParser(description="Load and analzye data from nastja timing files")
p.add_argument("jobid", nargs="+")
@@ -82,23 +102,7 @@ if __name__ == "__main__":
results = []
for i, jobid in enumerate(args.jobid, 1):
print(f"({i:2}/{len(args.jobid):2}) Loading accounting data for {jobid}", file=sys.stderr)
accounting_data = get_accounting_data(jobid)
jobs = []
excluded_array_indices = []
for array_job in accounting_data["jobs"]:
# Get metadata related to array
array_main_job = array_job["array"]["job_id"]
array_index = array_job["array"]["task_id"]
# The last step is the actual job we want the data for
# The steps before set up cluster etc.
last_step = array_job["steps"][-1]
if last_step["state"] != "COMPLETED":
print(f"WARNING: {array_main_job}.{array_index} has state {last_step['state']}, excluding it from measurements", file=sys.stderr)
excluded_array_indices.append(array_index)
continue
jobs.append(last_step)
jobs, excluded_array_indices = get_jobs(jobid)
array_mean_timings = load_array_mean_timings(jobid, excluded_array_indices)
if args.dump_timings:
print(array_mean_timings, file=sys.stderr)