in bench_cluster/report.py [0:0]
def parse_profiler(inp_dir):
# Search for files ending in .json in the inp_dir and its subdirectories
file_paths = glob.glob(os.path.join(inp_dir, "**", "*.json"), recursive=True)
if not file_paths:
raise ValueError(f"No .json file found in {inp_dir}")
all_forward_durations = []
all_backward_durations = []
def _format_duration(duration):
ms = duration // 1000
us = duration % 1000
return f"{ms}ms {us}μs"
for file_path in file_paths:
print(f"Processing file: {file_path}")
with open(file_path, 'r') as f:
trace_data = json.load(f)
forward_durations = []
backward_durations = []
for event in trace_data['traceEvents']:
if 'name' in event and 'dur' in event:
if "forward" in event['name'].lower():
forward_durations.append(event['dur'])
elif "backward" in event['name'].lower():
backward_durations.append(event['dur'])
if forward_durations:
all_forward_durations.extend(forward_durations)
if backward_durations:
all_backward_durations.extend(backward_durations)
# Write the mean forward and backward durations to a csv file
pattern = re.compile(r'dp-\d+_tp-\d+_pp-\d+_mbz-\d+')
matching_index = next((i for i, part in enumerate(file_path.split("/")) if pattern.match(part)), None)
if matching_index is None:
raise ValueError(f"Could not find the specified pattern in {file_paths[0]}")
assert matching_index < len(file_path.split("/")) - 1, "Matching index is out of bounds"
output_file = "/".join(file_path.split("/")[:matching_index + 1]) + "/profiler.csv"
if all_forward_durations or all_backward_durations:
with open(output_file, 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(["forward", "backward"])
writer.writerow([
_format_duration(int(mean(all_forward_durations))) if all_forward_durations else "N/A",
_format_duration(int(mean(all_backward_durations))) if all_backward_durations else "N/A"
])
print(f"Results written to {output_file}")
else:
print("No forward or backward durations found in any file.")