import re from collections import defaultdict import argparse def dump_file(ops, file_path): with open(file_path, 'w') as f: for op in ops: f.write(op) f.write('\n') def parse_profiler(profiler_file): ops_shapes = defaultdict(set) ops_shapes_first_step = defaultdict(set) ops_shapes_other_steps = defaultdict(set) with open(profiler_file, 'r') as f: lines = f.readlines() step = 0 for line in lines: if re.findall(r'^Name.*Input Shapes$', line.strip()): step += 1 continue if step == 0: continue if -1 == line.find('[[') and -1 == line.find('[]'): continue line_fields = [field.strip() for field in line.strip().split(' ') if field != ''] ops_shapes[line_fields[0]].add(line_fields[-1]) if step == 1: ops_shapes_first_step[line_fields[0]].add(line_fields[-1]) else: ops_shapes_other_steps[line_fields[0]].add(line_fields[-1]) all_ops = [k for k, v in ops_shapes.items()] dynamic_ops = list() for op_name, shape_set in ops_shapes_other_steps.items(): if op_name not in ops_shapes_first_step.keys(): dynamic_ops.append(op_name) else: if len(shape_set - ops_shapes_first_step[op_name]) > 0: dynamic_ops.append(op_name) return all_ops, dynamic_ops def extract_ops(profiler_file): all_ops, dynamic_ops = parse_profiler(profiler_file) print('all_ops:', all_ops) print('dynamic_ops', dynamic_ops) dump_file(all_ops, 'all_ops.txt') dump_file(dynamic_ops, 'dynamic_ops.txt') if __name__ == '__main__': parser = argparse.ArgumentParser('extract ops') parser.add_argument('--profiler_file', default='', type=str, metavar='PATH') args = parser.parse_args() extract_ops(args.profiler_file)