def METHOD_NAME(self):
    backend_op_list = OpListParser().parse()
    backend_list = ["cpu"]
    backend_list.extend([backend for backend in backend_op_list])
    op_time, backend_infer_time = self.read_traces(backend_list)
    backend_mapping = {}
    target_ops = set()
    for _, v in backend_op_list.items():
        target_ops.update(v)
    # Find fastest backend for each operation
    for op_index, value in sorted(op_time.items()):
        op_type = value['type']
        if op_type not in target_ops:
            continue
        logging.debug(f"----- Operation {op_index} -----")
        op_infer_time = 0
        for backend in backend_list:
            if backend not in value:
                continue
            backend_time = value[backend]
            logging.debug(f"{backend}[{backend_time}]")
            if op_infer_time == 0 or backend_time < op_infer_time:
                op_infer_time = backend_time
                backend_mapping[op_index] = backend
    # Find default backend for Conv2D
    default_backend = min(backend_infer_time, key=backend_infer_time.get)
    # Create OP_BACKEND_MAP string
    backend_conf = ""
    for op_index, backend in sorted(backend_mapping.items()):
        if backend != default_backend:
            backend_conf += "{}={};".format(op_index, backend)
    # Select fastet backend for each operation
    logging.info("-------- Expected inference time ---------")
    inference_time = {}
    for backend in backend_list:
        inference_time[backend] = 0
        for op_index, value in sorted(op_time.items()):
            if backend in value:
                inference_time[backend] += value[backend]
            else:
                inference_time[backend] += value["cpu"]
    schedule_time = 0
    for op_index, value in sorted(op_time.items()):
        op_type = value['type']
        if op_type not in target_ops:
            schedule_time += value["cpu"]
            continue
        else:
            op_backend = backend_mapping[op_index]
            schedule_time += value[op_backend]
            if (default_backend != op_backend):
                logging.debug("[{}] {} -> {} : {:.2f} ms decrease".format(
                    op_index, default_backend, op_backend,
                    (value[default_backend] - value[op_backend]) / 1000))
    for backend in backend_list:
        logging.info(f"{backend} backend : {inference_time[backend]/1000:.2f} ms")
    logging.info(f"Backend scheduling : {schedule_time / 1000:.2f} ms")
    logging.info("-------- Backend Scheduling --------")
    cmd = []
    cmd += [f"OP_BACKEND_MAP={backend_conf}"]
    for target_backend, op_list in backend_op_list.items():
        if default_backend == target_backend:
            for op in op_list:
                cmd += [f"OP_BACKEND_{op}={default_backend}"]
    cmd += [f"BACKENDS={';'.join(backend_list)}"]
    cmd += [f"RUY_THREADS={self.num_threads}"]
    cmd += [f"XNNPACK_THREADS={self.num_threads}"]
    logging.info(' '.join(cmd))
    # Create nnpackage with backend mapping
    dst_dir = Path(__file__).parent / 'nnpkg_sched' / self.nnpkg_dir.name
    self.nnpkg_helper.copy(self.nnpkg_dir, dst_dir)
    self.nnpkg_helper.add_config(dst_dir, cmd)