(
self,
graph: BaseGraph,
dataloader: Iterable,
executor: BaseGraphExecutor,
collate_fn: Callable,
calib_steps: int,
**kwargs
)
| 498 | self.store_parameter(pair) |
| 499 | |
| 500 | def optimize( |
| 501 | self, |
| 502 | graph: BaseGraph, |
| 503 | dataloader: Iterable, |
| 504 | executor: BaseGraphExecutor, |
| 505 | collate_fn: Callable, |
| 506 | calib_steps: int, |
| 507 | **kwargs |
| 508 | ) -> None: |
| 509 | # restrain maximum img number used for loss checking |
| 510 | batchsize = 1 |
| 511 | for data in dataloader: |
| 512 | if collate_fn is not None: |
| 513 | data = collate_fn(data) |
| 514 | if isinstance(data, torch.Tensor): |
| 515 | batchsize = data.shape[0] |
| 516 | elif isinstance(data, (list, tuple)): |
| 517 | for value in data: |
| 518 | if isinstance(value, torch.Tensor): |
| 519 | batchsize = value.shape[0] |
| 520 | break |
| 521 | elif isinstance(data, dict): |
| 522 | for key, value in data.items(): |
| 523 | if isinstance(value, torch.Tensor): |
| 524 | batchsize = value.shape[0] |
| 525 | break |
| 526 | break |
| 527 | |
| 528 | calib_steps = min(calib_steps, ceil(200 / batchsize)) |
| 529 | |
| 530 | all_pairs = self.collect_all_pairs(graph) |
| 531 | if self.layer_norm: |
| 532 | self.layer_weight_norm(all_pairs) |
| 533 | |
| 534 | for i in range(self.iteration): |
| 535 | logger.debug(f'DFQ/SSD Equalization Iteration {i + 1}/{self.iteration}') |
| 536 | for _,pair in tqdm(enumerate(all_pairs), desc=f'SSD/DFQ Equalization Iteration {i+1}/{self.iteration}', total=len(all_pairs)): |
| 537 | logger.debug(f"Now Processing Pair {_ + 1}/{len(all_pairs)}: {'--'.join([op.name for op in pair])}") |
| 538 | self.store_parameter(pair) |
| 539 | |
| 540 | logger.debug(f'Collecting Activation Range for Pair...') |
| 541 | op_act_range = self.collect_activation_range(pair, executor, dataloader, collate_fn, calib_steps) |
| 542 | logger.debug(f'Collecting Done!') |
| 543 | |
| 544 | original_weights = self.collect_original_parameter(pair) |
| 545 | basic_loss = self.test_ssd_loss(pair, executor, dataloader, collate_fn, calib_steps) |
| 546 | best_loss = basic_loss |
| 547 | best_idx = -1 |
| 548 | |
| 549 | # now apply equalization and estimate loss |
| 550 | for algo in range(0,4): |
| 551 | self.one_step_equalization(pair, op_act_range, algo) |
| 552 | self.store_parameter(pair) |
| 553 | self.initiate_pair_state(pair) |
| 554 | loss = self.test_ssd_loss(pair, executor, dataloader, collate_fn, calib_steps) |
| 555 | if algo == 0: |
| 556 | logger.debug(f'DFQ Step, Loss Before Equalization {basic_loss} || Loss After Equalization {loss}') |
| 557 | else: |
nothing calls this directly
no test coverage detected