MCPcopy
hub / github.com/OpenPPL/ppq / optimize

Method optimize

ppq/quantization/optim/ssd.py:500–573  ·  view source on GitHub ↗
(
        self,
        graph: BaseGraph,
        dataloader: Iterable,
        executor: BaseGraphExecutor,
        collate_fn: Callable,
        calib_steps: int,
        **kwargs
    )

Source from the content-addressed store, hash-verified

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:

Callers

nothing calls this directly

Calls 11

collect_all_pairsMethod · 0.95
layer_weight_normMethod · 0.95
store_parameterMethod · 0.95
test_ssd_lossMethod · 0.95
one_step_equalizationMethod · 0.95
initiate_pair_stateMethod · 0.95
debugMethod · 0.80
collate_fnFunction · 0.50

Tested by

no test coverage detected