From febbb204f4e49fe1a1be9c1d016aaf8c12bcbed3 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Tue, 6 Oct 2020 09:37:04 +0300 Subject: [PATCH 01/30] docs update --- catalyst/core/callbacks/exception.py | 15 +++-- catalyst/core/callbacks/logging.py | 8 ++- .../core/callbacks/tests/test_early_stop.py | 2 +- catalyst/core/callbacks/timer.py | 2 +- catalyst/core/callbacks/validation.py | 2 +- catalyst/data/__main__.py | 4 +- catalyst/data/dataset/torch.py | 11 ++-- catalyst/data/sampler.py | 61 ++++++++++--------- catalyst/dl/__main__.py | 2 +- catalyst/dl/callbacks/confusion_matrix.py | 39 +++++++----- catalyst/dl/callbacks/scheduler.py | 8 +-- 11 files changed, 88 insertions(+), 66 deletions(-) diff --git a/catalyst/core/callbacks/exception.py b/catalyst/core/callbacks/exception.py index 9c8a30acde..8ecd4ee69a 100644 --- a/catalyst/core/callbacks/exception.py +++ b/catalyst/core/callbacks/exception.py @@ -4,16 +4,23 @@ class ExceptionCallback(Callback): - """@TODO: Docs. Contribution is welcome.""" + """Handles python exceptions during run.""" def __init__(self): - """@TODO: Docs. Contribution is welcome.""" + """Initialisation for ExceptionCallback.""" super().__init__( order=CallbackOrder.external + 1, node=CallbackNode.all ) - def on_exception(self, runner: IRunner): - """@TODO: Docs. Contribution is welcome.""" + def on_exception(self, runner: IRunner) -> None: + """Exception handle hook. + + Args: + runner: experiment runner + + Raises: + Exception + """ exception = runner.exception if not utils.is_exception(exception): return diff --git a/catalyst/core/callbacks/logging.py b/catalyst/core/callbacks/logging.py index b8bd17593a..22cd0e8655 100644 --- a/catalyst/core/callbacks/logging.py +++ b/catalyst/core/callbacks/logging.py @@ -205,8 +205,12 @@ def _log_metrics( f"{name}{suffix}", metrics[name], step ) - def on_stage_start(self, runner: IRunner): - """@TODO: Docs. Contribution is welcome.""" + def on_stage_start(self, runner: IRunner) -> None: + """Stage start hook. Check ``logdir`` correctness. + + Args: + runner: current runner + """ assert runner.logdir is not None extra_mode = "_base" diff --git a/catalyst/core/callbacks/tests/test_early_stop.py b/catalyst/core/callbacks/tests/test_early_stop.py index 74f0e607c1..95627c50ef 100644 --- a/catalyst/core/callbacks/tests/test_early_stop.py +++ b/catalyst/core/callbacks/tests/test_early_stop.py @@ -4,7 +4,7 @@ def test_patience1(): - """@TODO: Docs. Contribution is welcome.""" + """Tests EarlyStoppingCallback.""" early_stop = EarlyStoppingCallback(1) runner = MagicMock() type(runner).stage_name = PropertyMock(return_value="training") diff --git a/catalyst/core/callbacks/timer.py b/catalyst/core/callbacks/timer.py index 483448c1a7..e0e3f9279b 100644 --- a/catalyst/core/callbacks/timer.py +++ b/catalyst/core/callbacks/timer.py @@ -9,7 +9,7 @@ class TimerCallback(Callback): """Logs pipeline execution time.""" def __init__(self): - """@TODO: Docs. Contribution is welcome.""" + """Initialisation for TimerCallback.""" super().__init__(order=CallbackOrder.metric + 1, node=CallbackNode.all) self.timer = TimeManager() diff --git a/catalyst/core/callbacks/validation.py b/catalyst/core/callbacks/validation.py index 3d612f1e51..32aea1def3 100644 --- a/catalyst/core/callbacks/validation.py +++ b/catalyst/core/callbacks/validation.py @@ -10,7 +10,7 @@ class ValidationManagerCallback(Callback): """ def __init__(self): - """@TODO: Docs. Contribution is welcome.""" + """Initialisation for ValidationManagerCallback.""" super().__init__( order=CallbackOrder.validation, node=CallbackNode.all, ) diff --git a/catalyst/data/__main__.py b/catalyst/data/__main__.py index c6aa04eac2..67091ba636 100644 --- a/catalyst/data/__main__.py +++ b/catalyst/data/__main__.py @@ -151,9 +151,7 @@ def build_parser() -> ArgumentParser: def main(): - """ - @TODO: Docs. Contribution is welcome - """ + """catalyst-data entry point.""" parser = build_parser() args, uargs = parser.parse_known_args() diff --git a/catalyst/data/dataset/torch.py b/catalyst/data/dataset/torch.py index ca30770001..903710cf06 100644 --- a/catalyst/data/dataset/torch.py +++ b/catalyst/data/dataset/torch.py @@ -201,13 +201,14 @@ def __init__( class DatasetFromSampler(Dataset): - """Dataset of indexes from `Sampler`.""" + """Dataset to create indexes from `Sampler`. + + Args: + sampler: PyTorch sampler + """ def __init__(self, sampler: Sampler): - """ - Args: - sampler: @TODO: Docs. Contribution is welcome - """ + """Initialisation for DatasetFromSampler.""" self.sampler = sampler self.sampler_list = None diff --git a/catalyst/data/sampler.py b/catalyst/data/sampler.py index 86e9fc2cb3..3efac8625d 100644 --- a/catalyst/data/sampler.py +++ b/catalyst/data/sampler.py @@ -14,21 +14,18 @@ class BalanceClassSampler(Sampler): - """Abstraction over data sampler. + """Allows you to create stratified sample on unbalanced classes. - Allows you to create stratified sample on unbalanced classes. + Args: + labels: list of class label for each elem in the dataset + mode: Strategy to balance classes. + Must be one of [downsampling, upsampling] """ def __init__( self, labels: List[int], mode: Union[str, int] = "downsampling" ): - """ - Args: - labels: list of class label - for each elem in the dataset - mode: Strategy to balance classes. - Must be one of [downsampling, upsampling] - """ + """Sampler initialisation.""" super().__init__(labels) labels = np.array(labels) @@ -113,17 +110,17 @@ class BalanceBatchSampler(Sampler): where P equals 32 and K equals 4: `In Defense of the Triplet Loss for Person Re-Identification`_. + Args: + labels: list of classes labeles for each elem in the dataset + p: number of classes in a batch, should be > 1 + k: number of instances of each class in a batch, should be > 1 + .. _In Defense of the Triplet Loss for Person Re-Identification: https://arxiv.org/abs/1703.07737 """ def __init__(self, labels: Union[List[int], np.ndarray], p: int, k: int): - """ - Args: - labels: list of classes labeles for each elem in the dataset - p: number of classes in a batch, should be > 1 - k: number of instances of each class in a batch, should be > 1 - """ + """Sampler initialisation.""" super().__init__(self) classes = set(labels) @@ -199,6 +196,18 @@ class MiniEpochSampler(Sampler): """ Sampler iterates mini epochs from the dataset used by ``mini_epoch_len``. + Args: + data_len: Size of the dataset + mini_epoch_len: Num samples from the dataset used in one + mini epoch. + drop_last: If ``True``, sampler will drop the last batches + if its size would be less than ``batches_per_epoch`` + shuffle: one of ``"always"``, ``"real_epoch"``, or `None``. + The sampler will shuffle indices + > "per_mini_epoch" - every mini epoch (every ``__iter__`` call) + > "per_epoch" -- every real epoch + > None -- don't shuffle + Example: >>> MiniEpochSampler(len(dataset), mini_epoch_len=100) >>> MiniEpochSampler(len(dataset), mini_epoch_len=100, drop_last=True) @@ -213,19 +222,7 @@ def __init__( drop_last: bool = False, shuffle: str = None, ): - """ - Args: - data_len: Size of the dataset - mini_epoch_len: Num samples from the dataset used in one - mini epoch. - drop_last: If ``True``, sampler will drop the last batches - if its size would be less than ``batches_per_epoch`` - shuffle: one of ``"always"``, ``"real_epoch"``, or `None``. - The sampler will shuffle indices - > "per_mini_epoch" - every mini epoch (every ``__iter__`` call) - > "per_epoch" -- every real epoch - > None -- don't shuffle - """ + """Sampler initialisation.""" super().__init__(None) self.data_len = int(data_len) @@ -254,7 +251,7 @@ def __init__( self.shuffle_type = shuffle def shuffle(self) -> None: - """@TODO: Docs. Contribution is welcome.""" + """Shuffle sampler indices.""" if self.shuffle_type == "per_mini_epoch" or ( self.shuffle_type == "per_epoch" and self.state_i == 0 ): @@ -267,7 +264,11 @@ def shuffle(self) -> None: ) def __iter__(self) -> Iterator[int]: - """@TODO: Docs. Contribution is welcome.""" + """Iterate over sampler. + + Returns: + python iterator + """ self.state_i = self.state_i % self.divider self.shuffle() diff --git a/catalyst/dl/__main__.py b/catalyst/dl/__main__.py index 7af3c8e97c..c840bffa83 100644 --- a/catalyst/dl/__main__.py +++ b/catalyst/dl/__main__.py @@ -46,7 +46,7 @@ def build_parser() -> ArgumentParser: def main(): - """@TODO: Docs. Contribution is welcome.""" + """catalyst-dl entry point.""" parser = build_parser() args, uargs = parser.parse_known_args() diff --git a/catalyst/dl/callbacks/confusion_matrix.py b/catalyst/dl/callbacks/confusion_matrix.py index f42ea71b6d..fc5a3e350b 100644 --- a/catalyst/dl/callbacks/confusion_matrix.py +++ b/catalyst/dl/callbacks/confusion_matrix.py @@ -12,31 +12,42 @@ class ConfusionMatrixCallback(Callback): - """@TODO: Docs. Contribution is welcome.""" + """Callback to plot your confusion matrix to the Tensorboard. + + Args: + input_key: key to use from ``runner.input``, specifies our ``y_true`` + output_key: key to use from ``runner.output``, specifies our ``y_pred`` + prefix: tensorboard plot name + mode: Strategy to compute confusion matrix. + Must be one of [tnt, sklearn] + class_names: list with class names + num_classes: number of classes + plot_params: extra params for plt.figure rendering + tensorboard_callback_name: name of the tensorboard logger callback + """ def __init__( self, input_key: str = "targets", output_key: str = "logits", prefix: str = "confusion_matrix", - version: str = "tnt", + mode: str = "tnt", class_names: List[str] = None, num_classes: int = None, plot_params: Dict = None, tensorboard_callback_name: str = "_tensorboard", + version: str = None, ): - """ - Args: - @TODO: Docs. Contribution is welcome - """ + """Callback initialisation.""" super().__init__(CallbackOrder.metric, CallbackNode.all) self.prefix = prefix self.output_key = output_key self.input_key = input_key self.tensorboard_callback_name = tensorboard_callback_name - assert version in ["tnt", "sklearn"] - self._version = version + assert mode in ["tnt", "sklearn"] + assert version in [None, "tnt", "sklearn"] + self._mode = version or mode self._plot_params = plot_params or {} self.class_names = class_names @@ -48,16 +59,16 @@ def __init__( self._reset_stats() def _reset_stats(self): - if self._version == "tnt": + if self._mode == "tnt": self.confusion_matrix = meters.ConfusionMeter(self.num_classes) - elif self._version == "sklearn": + elif self._mode == "sklearn": self.outputs = [] self.targets = [] def _add_to_stats(self, outputs, targets): - if self._version == "tnt": + if self._mode == "tnt": self.confusion_matrix.add(predicted=outputs, target=targets) - elif self._version == "sklearn": + elif self._mode == "sklearn": outputs = outputs.cpu().numpy() targets = targets.cpu().numpy() @@ -67,9 +78,9 @@ def _add_to_stats(self, outputs, targets): self.targets.extend(targets) def _compute_confusion_matrix(self): - if self._version == "tnt": + if self._mode == "tnt": confusion_matrix = self.confusion_matrix.value() - elif self._version == "sklearn": + elif self._mode == "sklearn": confusion_matrix = confusion_matrix_fn( y_true=self.targets, y_pred=self.outputs ) diff --git a/catalyst/dl/callbacks/scheduler.py b/catalyst/dl/callbacks/scheduler.py index 9f5e188609..eacf0a3ed6 100644 --- a/catalyst/dl/callbacks/scheduler.py +++ b/catalyst/dl/callbacks/scheduler.py @@ -58,7 +58,7 @@ def _calc_lr_linear(self): return self.init_lr + self.lr_step * self.find_iter def calc_lr(self): - """Calculates learning reate. + """Calculates learning rate. Returns: learning rate. @@ -68,11 +68,11 @@ def calc_lr(self): return res def calc_momentum(self): - """@TODO: Docs. Contribution is welcome.""" + """Calculates new momentum.""" pass def on_loader_start(self, runner: IRunner): - """@TODO: Docs. Contribution is welcome. + """Loader start hook. Updates scheduler statistics. Args: runner: current runner @@ -86,7 +86,7 @@ def on_loader_start(self, runner: IRunner): super().on_loader_start(runner=runner) def on_batch_end(self, runner: IRunner): - """@TODO: Docs. Contribution is welcome. + """Batch end hook. Make scheduler step and stops iterating if needed. Args: runner: current runner From bd4153e7337aeb18f629c3befdc39452ccf9ed7c Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Tue, 6 Oct 2020 10:06:10 +0300 Subject: [PATCH 02/30] brace yourself; arch update is comming --- catalyst/{dl => }/callbacks/__init__.py | 7 +- .../{core => }/callbacks/batch_overfit.py | 0 catalyst/{core => }/callbacks/checkpoint.py | 0 .../{dl => }/callbacks/confusion_matrix.py | 0 catalyst/{core => }/callbacks/control_flow.py | 0 catalyst/{core => }/callbacks/criterion.py | 0 catalyst/{core => }/callbacks/early_stop.py | 0 catalyst/{core => }/callbacks/exception.py | 0 catalyst/{core => }/callbacks/formatters.py | 0 catalyst/{dl => }/callbacks/inference.py | 0 catalyst/{core => }/callbacks/logging.py | 0 catalyst/{dl => }/callbacks/meter.py | 0 catalyst/{core => }/callbacks/metrics.py | 0 catalyst/callbacks/metrics/__init__.py | 8 + .../{dl => }/callbacks/metrics/accuracy.py | 0 catalyst/{dl => }/callbacks/metrics/auc.py | 0 .../{dl => }/callbacks/metrics/cmc_score.py | 0 catalyst/{dl => }/callbacks/metrics/dice.py | 0 .../{dl => }/callbacks/metrics/f1_score.py | 0 catalyst/{dl => }/callbacks/metrics/iou.py | 0 .../{dl => }/callbacks/metrics/ppv_tpr_f1.py | 0 .../{dl => }/callbacks/metrics/precision.py | 0 catalyst/{dl => }/callbacks/mixup.py | 0 catalyst/{core => }/callbacks/optimizer.py | 2 +- .../{core => }/callbacks/periodic_loader.py | 0 catalyst/{dl => }/callbacks/pruning.py | 0 catalyst/{dl => }/callbacks/quantization.py | 0 catalyst/{core => }/callbacks/scheduler.py | 102 ++++++- .../dl => }/callbacks/tests/__init__.py | 0 .../tests/test_checkpoint_callback.py | 0 .../tests/test_control_flow_callback.py | 0 .../callbacks/tests/test_early_stop.py | 0 .../tests/test_optimizer_callback.py | 0 .../tests/test_periodic_loader_callback.py | 0 .../callbacks/tests/test_pruning.py | 2 +- .../callbacks/tests/test_quantization.py | 2 +- .../tests/test_wrapper_callback.py | 0 catalyst/{core => }/callbacks/timer.py | 0 catalyst/{dl => }/callbacks/tracing.py | 0 catalyst/{core => }/callbacks/validation.py | 0 .../contrib/{dl => }/callbacks/__init__.py | 22 +- .../{dl => }/callbacks/alchemy_logger.py | 0 .../{dl => }/callbacks/cutmix_callback.py | 0 .../{dl => }/callbacks/gradnorm_logger.py | 2 +- .../contrib/{dl => }/callbacks/knn_metric.py | 0 .../{dl => }/callbacks/kornia_transform.py | 0 .../{dl => }/callbacks/mask_inference.py | 0 .../{dl => }/callbacks/neptune_logger.py | 0 .../{dl => }/callbacks/optuna_callback.py | 0 .../{dl => }/callbacks/perplexity_metric.py | 0 .../{dl => }/callbacks/telegram_logger.py | 0 .../tests}/__init__.py | 0 .../callbacks/tests/test_gradnorm_logger.py | 2 +- .../callbacks/tests/test_optuna_callback.py | 2 +- .../tests/test_perplexity_callback.py | 2 +- .../callbacks/tests/test_tracer_callback.py | 0 .../{dl => }/callbacks/wandb_logger.py | 0 .../contrib/{nn => }/criterion/__init__.py | 13 +- catalyst/contrib/{nn => }/criterion/ce.py | 0 catalyst/contrib/{nn => }/criterion/circle.py | 0 .../contrib/{nn => }/criterion/contrastive.py | 0 catalyst/contrib/{nn => }/criterion/dice.py | 0 catalyst/contrib/{nn => }/criterion/focal.py | 0 .../contrib/{nn => }/criterion/functional.py | 0 catalyst/contrib/{nn => }/criterion/gan.py | 0 catalyst/contrib/{nn => }/criterion/huber.py | 0 catalyst/contrib/{nn => }/criterion/iou.py | 0 catalyst/contrib/{nn => }/criterion/lovasz.py | 0 catalyst/contrib/{nn => }/criterion/margin.py | 0 .../contrib/{nn => }/criterion/triplet.py | 0 catalyst/contrib/{nn => }/criterion/wing.py | 0 catalyst/contrib/dl/__init__.py | 5 - .../contrib/dl/callbacks/visdom_logger.py | 274 ------------------ .../{dl/runner => experiment}/__init__.py | 0 catalyst/contrib/{nn => }/modules/__init__.py | 0 catalyst/contrib/{nn => }/modules/arcface.py | 0 catalyst/contrib/{nn => }/modules/common.py | 0 catalyst/contrib/{nn => }/modules/cosface.py | 0 catalyst/contrib/{nn => }/modules/lama.py | 0 catalyst/contrib/{nn => }/modules/pooling.py | 0 catalyst/contrib/{nn => }/modules/rms_norm.py | 0 catalyst/contrib/{nn => }/modules/se.py | 0 catalyst/contrib/{nn => }/modules/softmax.py | 0 catalyst/contrib/nn/__init__.py | 6 - catalyst/contrib/nn/optimizers/__init__.py | 10 - catalyst/contrib/optimizers/__init__.py | 3 + catalyst/contrib/{nn => }/optimizers/adamp.py | 0 catalyst/contrib/{nn => }/optimizers/lamb.py | 0 .../contrib/{nn => }/optimizers/lookahead.py | 0 .../contrib/{nn => }/optimizers/qhadamw.py | 0 catalyst/contrib/{nn => }/optimizers/radam.py | 0 .../contrib/{nn => }/optimizers/ralamb.py | 0 catalyst/contrib/{nn => }/optimizers/sgdp.py | 0 .../contrib/{nn/tests => runner}/__init__.py | 0 .../contrib/{nn => }/schedulers/__init__.py | 0 catalyst/contrib/{nn => }/schedulers/base.py | 0 .../contrib/{nn => }/schedulers/onecycle.py | 0 .../callbacks => contrib}/tests/__init__.py | 0 .../contrib/{nn => }/tests/test_criterion.py | 0 .../contrib/{nn => }/tests/test_modules.py | 0 .../contrib/{nn => }/tests/test_optimizer.py | 0 catalyst/core/callbacks/__init__.py | 45 --- catalyst/core/experiment.py | 2 +- catalyst/core/runner.py | 4 +- catalyst/core/utils/__init__.py | 10 - catalyst/dl/__init__.py | 4 - catalyst/dl/__main__.py | 2 +- catalyst/dl/callbacks/metrics/__init__.py | 25 -- catalyst/dl/callbacks/scheduler.py | 102 ------- catalyst/dl/callbacks/tests/__init__.py | 0 catalyst/dl/experiment/__init__.py | 8 - catalyst/dl/runner/__init__.py | 6 - catalyst/dl/scripts/quantize.py | 2 +- catalyst/dl/utils/__init__.py | 27 -- catalyst/dl/utils/callbacks.py | 32 -- catalyst/dl/utils/torch.py | 68 ----- catalyst/experiment/__init__.py | 6 + catalyst/{dl => }/experiment/config.py | 2 +- catalyst/{dl => }/experiment/experiment.py | 2 +- catalyst/{dl => }/experiment/supervised.py | 4 +- .../{core => experiment}/tests/__init__.py | 0 .../{dl => }/experiment/tests/test_config.py | 2 +- .../{dl => }/experiment/tests/test_core.py | 2 +- .../experiment/tests/test_supervised.py | 2 +- catalyst/registry/registries.py | 6 +- catalyst/runner/__init__.py | 5 + catalyst/{dl => }/runner/runner.py | 10 +- catalyst/{dl => }/runner/supervised.py | 6 +- catalyst/{tools => }/settings.py | 0 catalyst/tools/__init__.py | 18 -- catalyst/{tools => }/typing.py | 0 catalyst/utils/__init__.py | 6 +- catalyst/{core => }/utils/callbacks.py | 36 ++- catalyst/utils/components.py | 10 +- catalyst/utils/loader.py | 58 ---- .../{core/utils/data.py => utils/loaders.py} | 123 +++++++- catalyst/{dl => }/utils/quantization.py | 2 +- catalyst/utils/torch.py | 4 +- .../{dl/utils/trace.py => utils/tracing.py} | 4 +- catalyst/{dl => }/utils/wizard.py | 0 .../experiment.py | 2 +- tests/_tests_scripts/cv_z_kornia.py | 4 +- tests/_tests_scripts/cv_z_segmentation.py | 2 +- tests/_tests_scripts/dl_experiment.py | 1 - tests/_tests_scripts/dl_runner.py | 1 - tests/_tests_scripts/dl_z_classification.py | 16 +- 146 files changed, 334 insertions(+), 801 deletions(-) rename catalyst/{dl => }/callbacks/__init__.py (79%) rename catalyst/{core => }/callbacks/batch_overfit.py (100%) rename catalyst/{core => }/callbacks/checkpoint.py (100%) rename catalyst/{dl => }/callbacks/confusion_matrix.py (100%) rename catalyst/{core => }/callbacks/control_flow.py (100%) rename catalyst/{core => }/callbacks/criterion.py (100%) rename catalyst/{core => }/callbacks/early_stop.py (100%) rename catalyst/{core => }/callbacks/exception.py (100%) rename catalyst/{core => }/callbacks/formatters.py (100%) rename catalyst/{dl => }/callbacks/inference.py (100%) rename catalyst/{core => }/callbacks/logging.py (100%) rename catalyst/{dl => }/callbacks/meter.py (100%) rename catalyst/{core => }/callbacks/metrics.py (100%) create mode 100644 catalyst/callbacks/metrics/__init__.py rename catalyst/{dl => }/callbacks/metrics/accuracy.py (100%) rename catalyst/{dl => }/callbacks/metrics/auc.py (100%) rename catalyst/{dl => }/callbacks/metrics/cmc_score.py (100%) rename catalyst/{dl => }/callbacks/metrics/dice.py (100%) rename catalyst/{dl => }/callbacks/metrics/f1_score.py (100%) rename catalyst/{dl => }/callbacks/metrics/iou.py (100%) rename catalyst/{dl => }/callbacks/metrics/ppv_tpr_f1.py (100%) rename catalyst/{dl => }/callbacks/metrics/precision.py (100%) rename catalyst/{dl => }/callbacks/mixup.py (100%) rename catalyst/{core => }/callbacks/optimizer.py (99%) rename catalyst/{core => }/callbacks/periodic_loader.py (100%) rename catalyst/{dl => }/callbacks/pruning.py (100%) rename catalyst/{dl => }/callbacks/quantization.py (100%) rename catalyst/{core => }/callbacks/scheduler.py (76%) rename catalyst/{contrib/dl => }/callbacks/tests/__init__.py (100%) rename catalyst/{core => }/callbacks/tests/test_checkpoint_callback.py (100%) rename catalyst/{core => }/callbacks/tests/test_control_flow_callback.py (100%) rename catalyst/{core => }/callbacks/tests/test_early_stop.py (100%) rename catalyst/{core => callbacks}/tests/test_optimizer_callback.py (100%) rename catalyst/{core => }/callbacks/tests/test_periodic_loader_callback.py (100%) rename catalyst/{core => }/callbacks/tests/test_pruning.py (98%) rename catalyst/{dl => }/callbacks/tests/test_quantization.py (95%) rename catalyst/{core => callbacks}/tests/test_wrapper_callback.py (100%) rename catalyst/{core => }/callbacks/timer.py (100%) rename catalyst/{dl => }/callbacks/tracing.py (100%) rename catalyst/{core => }/callbacks/validation.py (100%) rename catalyst/contrib/{dl => }/callbacks/__init__.py (71%) rename catalyst/contrib/{dl => }/callbacks/alchemy_logger.py (100%) rename catalyst/contrib/{dl => }/callbacks/cutmix_callback.py (100%) rename catalyst/contrib/{dl => }/callbacks/gradnorm_logger.py (98%) rename catalyst/contrib/{dl => }/callbacks/knn_metric.py (100%) rename catalyst/contrib/{dl => }/callbacks/kornia_transform.py (100%) rename catalyst/contrib/{dl => }/callbacks/mask_inference.py (100%) rename catalyst/contrib/{dl => }/callbacks/neptune_logger.py (100%) rename catalyst/contrib/{dl => }/callbacks/optuna_callback.py (100%) rename catalyst/contrib/{dl => }/callbacks/perplexity_metric.py (100%) rename catalyst/contrib/{dl => }/callbacks/telegram_logger.py (100%) rename catalyst/contrib/{dl/experiment => callbacks/tests}/__init__.py (100%) rename catalyst/contrib/{dl => }/callbacks/tests/test_gradnorm_logger.py (98%) rename catalyst/contrib/{dl => }/callbacks/tests/test_optuna_callback.py (96%) rename catalyst/contrib/{dl => }/callbacks/tests/test_perplexity_callback.py (97%) rename catalyst/contrib/{dl => }/callbacks/tests/test_tracer_callback.py (100%) rename catalyst/contrib/{dl => }/callbacks/wandb_logger.py (100%) rename catalyst/contrib/{nn => }/criterion/__init__.py (71%) rename catalyst/contrib/{nn => }/criterion/ce.py (100%) rename catalyst/contrib/{nn => }/criterion/circle.py (100%) rename catalyst/contrib/{nn => }/criterion/contrastive.py (100%) rename catalyst/contrib/{nn => }/criterion/dice.py (100%) rename catalyst/contrib/{nn => }/criterion/focal.py (100%) rename catalyst/contrib/{nn => }/criterion/functional.py (100%) rename catalyst/contrib/{nn => }/criterion/gan.py (100%) rename catalyst/contrib/{nn => }/criterion/huber.py (100%) rename catalyst/contrib/{nn => }/criterion/iou.py (100%) rename catalyst/contrib/{nn => }/criterion/lovasz.py (100%) rename catalyst/contrib/{nn => }/criterion/margin.py (100%) rename catalyst/contrib/{nn => }/criterion/triplet.py (100%) rename catalyst/contrib/{nn => }/criterion/wing.py (100%) delete mode 100644 catalyst/contrib/dl/__init__.py delete mode 100644 catalyst/contrib/dl/callbacks/visdom_logger.py rename catalyst/contrib/{dl/runner => experiment}/__init__.py (100%) rename catalyst/contrib/{nn => }/modules/__init__.py (100%) rename catalyst/contrib/{nn => }/modules/arcface.py (100%) rename catalyst/contrib/{nn => }/modules/common.py (100%) rename catalyst/contrib/{nn => }/modules/cosface.py (100%) rename catalyst/contrib/{nn => }/modules/lama.py (100%) rename catalyst/contrib/{nn => }/modules/pooling.py (100%) rename catalyst/contrib/{nn => }/modules/rms_norm.py (100%) rename catalyst/contrib/{nn => }/modules/se.py (100%) rename catalyst/contrib/{nn => }/modules/softmax.py (100%) delete mode 100644 catalyst/contrib/nn/__init__.py delete mode 100644 catalyst/contrib/nn/optimizers/__init__.py create mode 100644 catalyst/contrib/optimizers/__init__.py rename catalyst/contrib/{nn => }/optimizers/adamp.py (100%) rename catalyst/contrib/{nn => }/optimizers/lamb.py (100%) rename catalyst/contrib/{nn => }/optimizers/lookahead.py (100%) rename catalyst/contrib/{nn => }/optimizers/qhadamw.py (100%) rename catalyst/contrib/{nn => }/optimizers/radam.py (100%) rename catalyst/contrib/{nn => }/optimizers/ralamb.py (100%) rename catalyst/contrib/{nn => }/optimizers/sgdp.py (100%) rename catalyst/contrib/{nn/tests => runner}/__init__.py (100%) rename catalyst/contrib/{nn => }/schedulers/__init__.py (100%) rename catalyst/contrib/{nn => }/schedulers/base.py (100%) rename catalyst/contrib/{nn => }/schedulers/onecycle.py (100%) rename catalyst/{core/callbacks => contrib}/tests/__init__.py (100%) rename catalyst/contrib/{nn => }/tests/test_criterion.py (100%) rename catalyst/contrib/{nn => }/tests/test_modules.py (100%) rename catalyst/contrib/{nn => }/tests/test_optimizer.py (100%) delete mode 100644 catalyst/core/callbacks/__init__.py delete mode 100644 catalyst/core/utils/__init__.py delete mode 100644 catalyst/dl/callbacks/metrics/__init__.py delete mode 100644 catalyst/dl/callbacks/scheduler.py delete mode 100644 catalyst/dl/callbacks/tests/__init__.py delete mode 100644 catalyst/dl/experiment/__init__.py delete mode 100644 catalyst/dl/runner/__init__.py delete mode 100644 catalyst/dl/utils/__init__.py delete mode 100644 catalyst/dl/utils/callbacks.py delete mode 100644 catalyst/dl/utils/torch.py create mode 100644 catalyst/experiment/__init__.py rename catalyst/{dl => }/experiment/config.py (99%) rename catalyst/{dl => }/experiment/experiment.py (99%) rename catalyst/{dl => }/experiment/supervised.py (96%) rename catalyst/{core => experiment}/tests/__init__.py (100%) rename catalyst/{dl => }/experiment/tests/test_config.py (98%) rename catalyst/{dl => }/experiment/tests/test_core.py (97%) rename catalyst/{dl => }/experiment/tests/test_supervised.py (99%) create mode 100644 catalyst/runner/__init__.py rename catalyst/{dl => }/runner/runner.py (98%) rename catalyst/{dl => }/runner/supervised.py (97%) rename catalyst/{tools => }/settings.py (100%) rename catalyst/{tools => }/typing.py (100%) rename catalyst/{core => }/utils/callbacks.py (69%) rename catalyst/{core/utils/data.py => utils/loaders.py} (63%) rename catalyst/{dl => }/utils/quantization.py (98%) rename catalyst/{dl/utils/trace.py => utils/tracing.py} (99%) rename catalyst/{dl => }/utils/wizard.py (100%) diff --git a/catalyst/dl/callbacks/__init__.py b/catalyst/callbacks/__init__.py similarity index 79% rename from catalyst/dl/callbacks/__init__.py rename to catalyst/callbacks/__init__.py index d106fee9fd..ca3d04b802 100644 --- a/catalyst/dl/callbacks/__init__.py +++ b/catalyst/callbacks/__init__.py @@ -1,23 +1,20 @@ # flake8: noqa -from catalyst.tools.settings import ( +from catalyst.settings import ( IS_QUANTIZATION_AVAILABLE, IS_PRUNING_AVAILABLE, ) -from catalyst.core.callbacks import * from catalyst.dl.callbacks.confusion_matrix import ConfusionMatrixCallback from catalyst.dl.callbacks.inference import InferCallback from catalyst.dl.callbacks.meter import MeterMetricsCallback from catalyst.dl.callbacks.mixup import MixupCallback from catalyst.dl.callbacks.scheduler import LRFinder from catalyst.dl.callbacks.tracing import TracerCallback -from catalyst.dl.callbacks.metrics import * +from catalyst.callbacks.metrics import * if IS_QUANTIZATION_AVAILABLE: from catalyst.dl.callbacks.quantization import DynamicQuantizationCallback if IS_PRUNING_AVAILABLE: from catalyst.dl.callbacks.pruning import PruningCallback - -from catalyst.contrib.dl.callbacks import * diff --git a/catalyst/core/callbacks/batch_overfit.py b/catalyst/callbacks/batch_overfit.py similarity index 100% rename from catalyst/core/callbacks/batch_overfit.py rename to catalyst/callbacks/batch_overfit.py diff --git a/catalyst/core/callbacks/checkpoint.py b/catalyst/callbacks/checkpoint.py similarity index 100% rename from catalyst/core/callbacks/checkpoint.py rename to catalyst/callbacks/checkpoint.py diff --git a/catalyst/dl/callbacks/confusion_matrix.py b/catalyst/callbacks/confusion_matrix.py similarity index 100% rename from catalyst/dl/callbacks/confusion_matrix.py rename to catalyst/callbacks/confusion_matrix.py diff --git a/catalyst/core/callbacks/control_flow.py b/catalyst/callbacks/control_flow.py similarity index 100% rename from catalyst/core/callbacks/control_flow.py rename to catalyst/callbacks/control_flow.py diff --git a/catalyst/core/callbacks/criterion.py b/catalyst/callbacks/criterion.py similarity index 100% rename from catalyst/core/callbacks/criterion.py rename to catalyst/callbacks/criterion.py diff --git a/catalyst/core/callbacks/early_stop.py b/catalyst/callbacks/early_stop.py similarity index 100% rename from catalyst/core/callbacks/early_stop.py rename to catalyst/callbacks/early_stop.py diff --git a/catalyst/core/callbacks/exception.py b/catalyst/callbacks/exception.py similarity index 100% rename from catalyst/core/callbacks/exception.py rename to catalyst/callbacks/exception.py diff --git a/catalyst/core/callbacks/formatters.py b/catalyst/callbacks/formatters.py similarity index 100% rename from catalyst/core/callbacks/formatters.py rename to catalyst/callbacks/formatters.py diff --git a/catalyst/dl/callbacks/inference.py b/catalyst/callbacks/inference.py similarity index 100% rename from catalyst/dl/callbacks/inference.py rename to catalyst/callbacks/inference.py diff --git a/catalyst/core/callbacks/logging.py b/catalyst/callbacks/logging.py similarity index 100% rename from catalyst/core/callbacks/logging.py rename to catalyst/callbacks/logging.py diff --git a/catalyst/dl/callbacks/meter.py b/catalyst/callbacks/meter.py similarity index 100% rename from catalyst/dl/callbacks/meter.py rename to catalyst/callbacks/meter.py diff --git a/catalyst/core/callbacks/metrics.py b/catalyst/callbacks/metrics.py similarity index 100% rename from catalyst/core/callbacks/metrics.py rename to catalyst/callbacks/metrics.py diff --git a/catalyst/callbacks/metrics/__init__.py b/catalyst/callbacks/metrics/__init__.py new file mode 100644 index 0000000000..1c095e0410 --- /dev/null +++ b/catalyst/callbacks/metrics/__init__.py @@ -0,0 +1,8 @@ +# flake8: noqa + +from catalyst.callbacks.metrics import ( + AccuracyCallback, + MultiLabelAccuracyCallback, +) +from catalyst.callbacks.metrics import CMCScoreCallback +from catalyst.callbacks.metrics import PrecisionRecallF1ScoreCallback diff --git a/catalyst/dl/callbacks/metrics/accuracy.py b/catalyst/callbacks/metrics/accuracy.py similarity index 100% rename from catalyst/dl/callbacks/metrics/accuracy.py rename to catalyst/callbacks/metrics/accuracy.py diff --git a/catalyst/dl/callbacks/metrics/auc.py b/catalyst/callbacks/metrics/auc.py similarity index 100% rename from catalyst/dl/callbacks/metrics/auc.py rename to catalyst/callbacks/metrics/auc.py diff --git a/catalyst/dl/callbacks/metrics/cmc_score.py b/catalyst/callbacks/metrics/cmc_score.py similarity index 100% rename from catalyst/dl/callbacks/metrics/cmc_score.py rename to catalyst/callbacks/metrics/cmc_score.py diff --git a/catalyst/dl/callbacks/metrics/dice.py b/catalyst/callbacks/metrics/dice.py similarity index 100% rename from catalyst/dl/callbacks/metrics/dice.py rename to catalyst/callbacks/metrics/dice.py diff --git a/catalyst/dl/callbacks/metrics/f1_score.py b/catalyst/callbacks/metrics/f1_score.py similarity index 100% rename from catalyst/dl/callbacks/metrics/f1_score.py rename to catalyst/callbacks/metrics/f1_score.py diff --git a/catalyst/dl/callbacks/metrics/iou.py b/catalyst/callbacks/metrics/iou.py similarity index 100% rename from catalyst/dl/callbacks/metrics/iou.py rename to catalyst/callbacks/metrics/iou.py diff --git a/catalyst/dl/callbacks/metrics/ppv_tpr_f1.py b/catalyst/callbacks/metrics/ppv_tpr_f1.py similarity index 100% rename from catalyst/dl/callbacks/metrics/ppv_tpr_f1.py rename to catalyst/callbacks/metrics/ppv_tpr_f1.py diff --git a/catalyst/dl/callbacks/metrics/precision.py b/catalyst/callbacks/metrics/precision.py similarity index 100% rename from catalyst/dl/callbacks/metrics/precision.py rename to catalyst/callbacks/metrics/precision.py diff --git a/catalyst/dl/callbacks/mixup.py b/catalyst/callbacks/mixup.py similarity index 100% rename from catalyst/dl/callbacks/mixup.py rename to catalyst/callbacks/mixup.py diff --git a/catalyst/core/callbacks/optimizer.py b/catalyst/callbacks/optimizer.py similarity index 99% rename from catalyst/core/callbacks/optimizer.py rename to catalyst/callbacks/optimizer.py index e47736f927..83ca0f1a87 100644 --- a/catalyst/core/callbacks/optimizer.py +++ b/catalyst/callbacks/optimizer.py @@ -8,7 +8,7 @@ from catalyst.core import utils from catalyst.core.callback import Callback, CallbackNode, CallbackOrder from catalyst.core.runner import IRunner -from catalyst.tools.typing import Optimizer +from catalyst.typing import Optimizer logger = logging.getLogger(__name__) diff --git a/catalyst/core/callbacks/periodic_loader.py b/catalyst/callbacks/periodic_loader.py similarity index 100% rename from catalyst/core/callbacks/periodic_loader.py rename to catalyst/callbacks/periodic_loader.py diff --git a/catalyst/dl/callbacks/pruning.py b/catalyst/callbacks/pruning.py similarity index 100% rename from catalyst/dl/callbacks/pruning.py rename to catalyst/callbacks/pruning.py diff --git a/catalyst/dl/callbacks/quantization.py b/catalyst/callbacks/quantization.py similarity index 100% rename from catalyst/dl/callbacks/quantization.py rename to catalyst/callbacks/quantization.py diff --git a/catalyst/core/callbacks/scheduler.py b/catalyst/callbacks/scheduler.py similarity index 76% rename from catalyst/core/callbacks/scheduler.py rename to catalyst/callbacks/scheduler.py index 7992dcacd7..77970ff60f 100644 --- a/catalyst/core/callbacks/scheduler.py +++ b/catalyst/callbacks/scheduler.py @@ -1,11 +1,12 @@ -from typing import Tuple +from typing import Optional, Tuple from abc import ABC, abstractmethod import torch from catalyst.contrib.nn.schedulers import BatchScheduler, OneCycleLRWithWarmup -from catalyst.core import utils +from catalyst.core import IRunner, utils from catalyst.core.callback import Callback, CallbackNode, CallbackOrder +from catalyst.core.callbacks import LRUpdater from catalyst.core.runner import IRunner @@ -321,4 +322,99 @@ def on_batch_end(self, runner: IRunner) -> None: self.update_optimizer(runner=runner) -__all__ = ["ISchedulerCallback", "SchedulerCallback", "LRUpdater"] +class LRFinder(LRUpdater): + """ + Helps you find an optimal learning rate for a model, as per suggestion of + `Cyclical Learning Rates for Training Neural Networks`_ paper. + Learning rate is increased in linear or log scale, depending on user input. + + See `How Do You Find A Good Learning Rate`_ article for details. + + .. _Cyclical Learning Rates for Training Neural Networks: + https://arxiv.org/abs/1506.01186 + .. _How Do You Find A Good Learning Rate: + https://sgugger.github.io/how-do-you-find-a-good-learning-rate.html + """ + + def __init__( + self, + final_lr, + scale: str = "log", + num_steps: Optional[int] = None, + optimizer_key: str = None, + ): + """ + Args: + final_lr: final learning rate to try with + scale: learning rate increasing scale ("log" or "linear") + num_steps: number of batches to try; + if None - whole loader would be used. + optimizer_key: which optimizer key to use + for learning rate scheduling + """ + super().__init__(optimizer_key=optimizer_key) + + self.final_lr = final_lr + self.scale = scale + self.num_steps = num_steps + self.multiplier = 0 + self.lr_step = 0 + self.find_iter = 0 + + self._calc_lr = None + if scale == "log": + self._calc_lr = self._calc_lr_log + elif scale == "linear": + self._calc_lr = self._calc_lr_linear + else: + raise Exception("Not supported") + + def _calc_lr_log(self): + return self.init_lr * self.multiplier ** self.find_iter + + def _calc_lr_linear(self): + return self.init_lr + self.lr_step * self.find_iter + + def calc_lr(self): + """Calculates learning rate. + + Returns: + learning rate. + """ + res = self._calc_lr() + self.find_iter += 1 + return res + + def calc_momentum(self): + """Calculates new momentum.""" + pass + + def on_loader_start(self, runner: IRunner): + """Loader start hook. Updates scheduler statistics. + + Args: + runner: current runner + """ + if runner.is_train_loader: + lr_step = self.final_lr / self.init_lr + self.num_steps = self.num_steps or runner.loader_len + self.multiplier = lr_step ** (1 / self.num_steps) + self.lr_step = (self.final_lr - self.init_lr) / self.num_steps + + super().on_loader_start(runner=runner) + + def on_batch_end(self, runner: IRunner): + """Batch end hook. Make scheduler step and stops iterating if needed. + + Args: + runner: current runner + + Raises: + NotImplementedError: at the end of LRFinder + """ + super().on_batch_end(runner=runner) + if self.find_iter > self.num_steps: + raise NotImplementedError("End of LRFinder") + + +__all__ = ["ISchedulerCallback", "SchedulerCallback", "LRUpdater", "LRFinder"] diff --git a/catalyst/contrib/dl/callbacks/tests/__init__.py b/catalyst/callbacks/tests/__init__.py similarity index 100% rename from catalyst/contrib/dl/callbacks/tests/__init__.py rename to catalyst/callbacks/tests/__init__.py diff --git a/catalyst/core/callbacks/tests/test_checkpoint_callback.py b/catalyst/callbacks/tests/test_checkpoint_callback.py similarity index 100% rename from catalyst/core/callbacks/tests/test_checkpoint_callback.py rename to catalyst/callbacks/tests/test_checkpoint_callback.py diff --git a/catalyst/core/callbacks/tests/test_control_flow_callback.py b/catalyst/callbacks/tests/test_control_flow_callback.py similarity index 100% rename from catalyst/core/callbacks/tests/test_control_flow_callback.py rename to catalyst/callbacks/tests/test_control_flow_callback.py diff --git a/catalyst/core/callbacks/tests/test_early_stop.py b/catalyst/callbacks/tests/test_early_stop.py similarity index 100% rename from catalyst/core/callbacks/tests/test_early_stop.py rename to catalyst/callbacks/tests/test_early_stop.py diff --git a/catalyst/core/tests/test_optimizer_callback.py b/catalyst/callbacks/tests/test_optimizer_callback.py similarity index 100% rename from catalyst/core/tests/test_optimizer_callback.py rename to catalyst/callbacks/tests/test_optimizer_callback.py diff --git a/catalyst/core/callbacks/tests/test_periodic_loader_callback.py b/catalyst/callbacks/tests/test_periodic_loader_callback.py similarity index 100% rename from catalyst/core/callbacks/tests/test_periodic_loader_callback.py rename to catalyst/callbacks/tests/test_periodic_loader_callback.py diff --git a/catalyst/core/callbacks/tests/test_pruning.py b/catalyst/callbacks/tests/test_pruning.py similarity index 98% rename from catalyst/core/callbacks/tests/test_pruning.py rename to catalyst/callbacks/tests/test_pruning.py index 86e1ed0025..b9c81d913c 100644 --- a/catalyst/core/callbacks/tests/test_pruning.py +++ b/catalyst/callbacks/tests/test_pruning.py @@ -6,7 +6,7 @@ from torch import nn from catalyst import dl -from catalyst.tools.settings import IS_PRUNING_AVAILABLE +from catalyst.settings import IS_PRUNING_AVAILABLE if IS_PRUNING_AVAILABLE: from catalyst.dl import PruningCallback diff --git a/catalyst/dl/callbacks/tests/test_quantization.py b/catalyst/callbacks/tests/test_quantization.py similarity index 95% rename from catalyst/dl/callbacks/tests/test_quantization.py rename to catalyst/callbacks/tests/test_quantization.py index 6c5cce763f..ce09a3c354 100644 --- a/catalyst/dl/callbacks/tests/test_quantization.py +++ b/catalyst/callbacks/tests/test_quantization.py @@ -10,7 +10,7 @@ from catalyst.contrib.datasets import MNIST from catalyst.contrib.nn.modules import Flatten from catalyst.data.cv import ToTensor -from catalyst.tools.settings import IS_QUANTIZATION_AVAILABLE +from catalyst.settings import IS_QUANTIZATION_AVAILABLE @pytest.mark.skipif( diff --git a/catalyst/core/tests/test_wrapper_callback.py b/catalyst/callbacks/tests/test_wrapper_callback.py similarity index 100% rename from catalyst/core/tests/test_wrapper_callback.py rename to catalyst/callbacks/tests/test_wrapper_callback.py diff --git a/catalyst/core/callbacks/timer.py b/catalyst/callbacks/timer.py similarity index 100% rename from catalyst/core/callbacks/timer.py rename to catalyst/callbacks/timer.py diff --git a/catalyst/dl/callbacks/tracing.py b/catalyst/callbacks/tracing.py similarity index 100% rename from catalyst/dl/callbacks/tracing.py rename to catalyst/callbacks/tracing.py diff --git a/catalyst/core/callbacks/validation.py b/catalyst/callbacks/validation.py similarity index 100% rename from catalyst/core/callbacks/validation.py rename to catalyst/callbacks/validation.py diff --git a/catalyst/contrib/dl/callbacks/__init__.py b/catalyst/contrib/callbacks/__init__.py similarity index 71% rename from catalyst/contrib/dl/callbacks/__init__.py rename to catalyst/contrib/callbacks/__init__.py index a2ac6f64f1..9227e5aeb0 100644 --- a/catalyst/contrib/dl/callbacks/__init__.py +++ b/catalyst/contrib/callbacks/__init__.py @@ -5,19 +5,13 @@ from catalyst.tools import settings -from catalyst.contrib.dl.callbacks.cutmix_callback import CutmixCallback -from catalyst.contrib.dl.callbacks.gradnorm_logger import GradNormLogger -from catalyst.contrib.dl.callbacks.knn_metric import KNNMetricCallback -from catalyst.contrib.dl.callbacks.perplexity_metric import ( - PerplexityMetricCallback, -) -from catalyst.contrib.dl.callbacks.telegram_logger import TelegramLogger +from catalyst.contrib.callbacks.gradnorm_logger import GradNormLogger logger = logging.getLogger(__name__) try: import imageio - from catalyst.contrib.dl.callbacks.mask_inference import InferMaskCallback + from catalyst.contrib.callbacks import InferMaskCallback except ImportError as ex: if settings.cv_required: logger.warning( @@ -28,7 +22,7 @@ try: import kornia - from catalyst.contrib.dl.callbacks.kornia_transform import ( + from catalyst.contrib.callbacks.kornia_transform import ( BatchTransformCallback, ) except ImportError as ex: @@ -49,7 +43,7 @@ try: import alchemy - from catalyst.contrib.dl.callbacks.alchemy_logger import AlchemyLogger + from catalyst.contrib.callbacks.alchemy_logger import AlchemyLogger except ImportError as ex: if settings.alchemy_logger_required: logger.warning( @@ -60,7 +54,7 @@ try: import visdom - from catalyst.contrib.dl.callbacks.visdom_logger import VisdomLogger + from catalyst.contrib.callbacks.visdom_logger import VisdomLogger except ImportError as ex: if settings.visdom_logger_required: logger.warning( @@ -71,7 +65,7 @@ try: import neptune - from catalyst.contrib.dl.callbacks.neptune_logger import NeptuneLogger + from catalyst.contrib.callbacks import NeptuneLogger except ImportError as ex: if settings.neptune_logger_required: logger.warning( @@ -82,7 +76,7 @@ try: import wandb - from catalyst.contrib.dl.callbacks.wandb_logger import WandbLogger + from catalyst.contrib.callbacks.wandb_logger import WandbLogger except ImportError as ex: if settings.wandb_logger_required: logger.warning( @@ -93,7 +87,7 @@ try: import optuna - from catalyst.contrib.dl.callbacks.optuna_callback import ( + from catalyst.contrib.callbacks.optuna_callback import ( OptunaPruningCallback, OptunaCallback, ) diff --git a/catalyst/contrib/dl/callbacks/alchemy_logger.py b/catalyst/contrib/callbacks/alchemy_logger.py similarity index 100% rename from catalyst/contrib/dl/callbacks/alchemy_logger.py rename to catalyst/contrib/callbacks/alchemy_logger.py diff --git a/catalyst/contrib/dl/callbacks/cutmix_callback.py b/catalyst/contrib/callbacks/cutmix_callback.py similarity index 100% rename from catalyst/contrib/dl/callbacks/cutmix_callback.py rename to catalyst/contrib/callbacks/cutmix_callback.py diff --git a/catalyst/contrib/dl/callbacks/gradnorm_logger.py b/catalyst/contrib/callbacks/gradnorm_logger.py similarity index 98% rename from catalyst/contrib/dl/callbacks/gradnorm_logger.py rename to catalyst/contrib/callbacks/gradnorm_logger.py index 906de7c607..e832e7afe7 100644 --- a/catalyst/contrib/dl/callbacks/gradnorm_logger.py +++ b/catalyst/contrib/callbacks/gradnorm_logger.py @@ -5,7 +5,7 @@ from catalyst.core.callback import Callback, CallbackNode, CallbackOrder from catalyst.core.runner import IRunner -from catalyst.tools.typing import Model +from catalyst.typing import Model class GradNormLogger(Callback): diff --git a/catalyst/contrib/dl/callbacks/knn_metric.py b/catalyst/contrib/callbacks/knn_metric.py similarity index 100% rename from catalyst/contrib/dl/callbacks/knn_metric.py rename to catalyst/contrib/callbacks/knn_metric.py diff --git a/catalyst/contrib/dl/callbacks/kornia_transform.py b/catalyst/contrib/callbacks/kornia_transform.py similarity index 100% rename from catalyst/contrib/dl/callbacks/kornia_transform.py rename to catalyst/contrib/callbacks/kornia_transform.py diff --git a/catalyst/contrib/dl/callbacks/mask_inference.py b/catalyst/contrib/callbacks/mask_inference.py similarity index 100% rename from catalyst/contrib/dl/callbacks/mask_inference.py rename to catalyst/contrib/callbacks/mask_inference.py diff --git a/catalyst/contrib/dl/callbacks/neptune_logger.py b/catalyst/contrib/callbacks/neptune_logger.py similarity index 100% rename from catalyst/contrib/dl/callbacks/neptune_logger.py rename to catalyst/contrib/callbacks/neptune_logger.py diff --git a/catalyst/contrib/dl/callbacks/optuna_callback.py b/catalyst/contrib/callbacks/optuna_callback.py similarity index 100% rename from catalyst/contrib/dl/callbacks/optuna_callback.py rename to catalyst/contrib/callbacks/optuna_callback.py diff --git a/catalyst/contrib/dl/callbacks/perplexity_metric.py b/catalyst/contrib/callbacks/perplexity_metric.py similarity index 100% rename from catalyst/contrib/dl/callbacks/perplexity_metric.py rename to catalyst/contrib/callbacks/perplexity_metric.py diff --git a/catalyst/contrib/dl/callbacks/telegram_logger.py b/catalyst/contrib/callbacks/telegram_logger.py similarity index 100% rename from catalyst/contrib/dl/callbacks/telegram_logger.py rename to catalyst/contrib/callbacks/telegram_logger.py diff --git a/catalyst/contrib/dl/experiment/__init__.py b/catalyst/contrib/callbacks/tests/__init__.py similarity index 100% rename from catalyst/contrib/dl/experiment/__init__.py rename to catalyst/contrib/callbacks/tests/__init__.py diff --git a/catalyst/contrib/dl/callbacks/tests/test_gradnorm_logger.py b/catalyst/contrib/callbacks/tests/test_gradnorm_logger.py similarity index 98% rename from catalyst/contrib/dl/callbacks/tests/test_gradnorm_logger.py rename to catalyst/contrib/callbacks/tests/test_gradnorm_logger.py index 61058e697c..6bc8c45d4c 100644 --- a/catalyst/contrib/dl/callbacks/tests/test_gradnorm_logger.py +++ b/catalyst/contrib/callbacks/tests/test_gradnorm_logger.py @@ -8,8 +8,8 @@ from torch.optim import Adam from torch.utils.data import DataLoader +from catalyst.contrib.callbacks.gradnorm_logger import GradNormLogger from catalyst.contrib.datasets import MNIST -from catalyst.contrib.dl.callbacks.gradnorm_logger import GradNormLogger from catalyst.core.callback import Callback, CallbackOrder from catalyst.core.callbacks import CriterionCallback, OptimizerCallback from catalyst.core.runner import IRunner diff --git a/catalyst/contrib/dl/callbacks/tests/test_optuna_callback.py b/catalyst/contrib/callbacks/tests/test_optuna_callback.py similarity index 96% rename from catalyst/contrib/dl/callbacks/tests/test_optuna_callback.py rename to catalyst/contrib/callbacks/tests/test_optuna_callback.py index 91ae081210..a6a61aac7b 100644 --- a/catalyst/contrib/dl/callbacks/tests/test_optuna_callback.py +++ b/catalyst/contrib/callbacks/tests/test_optuna_callback.py @@ -6,8 +6,8 @@ from torch.utils.data import DataLoader from catalyst import dl +from catalyst.contrib.callbacks import OptunaPruningCallback from catalyst.contrib.datasets import MNIST -from catalyst.contrib.dl.callbacks import OptunaPruningCallback from catalyst.contrib.nn import Flatten from catalyst.data.cv.transforms.torch import ToTensor from catalyst.dl import AccuracyCallback diff --git a/catalyst/contrib/dl/callbacks/tests/test_perplexity_callback.py b/catalyst/contrib/callbacks/tests/test_perplexity_callback.py similarity index 97% rename from catalyst/contrib/dl/callbacks/tests/test_perplexity_callback.py rename to catalyst/contrib/callbacks/tests/test_perplexity_callback.py index 2b42e80e4e..7a9c0e27f7 100644 --- a/catalyst/contrib/dl/callbacks/tests/test_perplexity_callback.py +++ b/catalyst/contrib/callbacks/tests/test_perplexity_callback.py @@ -9,7 +9,7 @@ from transformers.data.data_collator import DataCollatorForLanguageModeling from catalyst import dl -from catalyst.contrib.dl.callbacks import PerplexityMetricCallback +from catalyst.contrib.callbacks import PerplexityMetricCallback from catalyst.data.nlp import LanguageModelingDataset diff --git a/catalyst/contrib/dl/callbacks/tests/test_tracer_callback.py b/catalyst/contrib/callbacks/tests/test_tracer_callback.py similarity index 100% rename from catalyst/contrib/dl/callbacks/tests/test_tracer_callback.py rename to catalyst/contrib/callbacks/tests/test_tracer_callback.py diff --git a/catalyst/contrib/dl/callbacks/wandb_logger.py b/catalyst/contrib/callbacks/wandb_logger.py similarity index 100% rename from catalyst/contrib/dl/callbacks/wandb_logger.py rename to catalyst/contrib/callbacks/wandb_logger.py diff --git a/catalyst/contrib/nn/criterion/__init__.py b/catalyst/contrib/criterion/__init__.py similarity index 71% rename from catalyst/contrib/nn/criterion/__init__.py rename to catalyst/contrib/criterion/__init__.py index 75a9a548d9..044ec9b519 100644 --- a/catalyst/contrib/nn/criterion/__init__.py +++ b/catalyst/contrib/criterion/__init__.py @@ -1,11 +1,6 @@ # flake8: noqa from torch.nn.modules.loss import * -from catalyst.contrib.nn.criterion.ce import ( - MaskCrossEntropyLoss, - NaiveCrossEntropyLoss, - SymmetricCrossEntropyLoss, -) from catalyst.contrib.nn.criterion.circle import CircleLoss from catalyst.contrib.nn.criterion.contrastive import ( ContrastiveDistanceLoss, @@ -17,7 +12,7 @@ FocalLossBinary, FocalLossMultiClass, ) -from catalyst.contrib.nn.criterion.gan import ( +from catalyst.contrib.criterion.gan import ( GradientPenaltyLoss, MeanOutputLoss, ) @@ -29,10 +24,4 @@ LovaszLossMultiLabel, ) from catalyst.contrib.nn.criterion.margin import MarginLoss -from catalyst.contrib.nn.criterion.triplet import ( - TripletLoss, - TripletLossV2, - TripletPairwiseEmbeddingLoss, - TripletMarginLossWithSampler, -) from catalyst.contrib.nn.criterion.wing import WingLoss diff --git a/catalyst/contrib/nn/criterion/ce.py b/catalyst/contrib/criterion/ce.py similarity index 100% rename from catalyst/contrib/nn/criterion/ce.py rename to catalyst/contrib/criterion/ce.py diff --git a/catalyst/contrib/nn/criterion/circle.py b/catalyst/contrib/criterion/circle.py similarity index 100% rename from catalyst/contrib/nn/criterion/circle.py rename to catalyst/contrib/criterion/circle.py diff --git a/catalyst/contrib/nn/criterion/contrastive.py b/catalyst/contrib/criterion/contrastive.py similarity index 100% rename from catalyst/contrib/nn/criterion/contrastive.py rename to catalyst/contrib/criterion/contrastive.py diff --git a/catalyst/contrib/nn/criterion/dice.py b/catalyst/contrib/criterion/dice.py similarity index 100% rename from catalyst/contrib/nn/criterion/dice.py rename to catalyst/contrib/criterion/dice.py diff --git a/catalyst/contrib/nn/criterion/focal.py b/catalyst/contrib/criterion/focal.py similarity index 100% rename from catalyst/contrib/nn/criterion/focal.py rename to catalyst/contrib/criterion/focal.py diff --git a/catalyst/contrib/nn/criterion/functional.py b/catalyst/contrib/criterion/functional.py similarity index 100% rename from catalyst/contrib/nn/criterion/functional.py rename to catalyst/contrib/criterion/functional.py diff --git a/catalyst/contrib/nn/criterion/gan.py b/catalyst/contrib/criterion/gan.py similarity index 100% rename from catalyst/contrib/nn/criterion/gan.py rename to catalyst/contrib/criterion/gan.py diff --git a/catalyst/contrib/nn/criterion/huber.py b/catalyst/contrib/criterion/huber.py similarity index 100% rename from catalyst/contrib/nn/criterion/huber.py rename to catalyst/contrib/criterion/huber.py diff --git a/catalyst/contrib/nn/criterion/iou.py b/catalyst/contrib/criterion/iou.py similarity index 100% rename from catalyst/contrib/nn/criterion/iou.py rename to catalyst/contrib/criterion/iou.py diff --git a/catalyst/contrib/nn/criterion/lovasz.py b/catalyst/contrib/criterion/lovasz.py similarity index 100% rename from catalyst/contrib/nn/criterion/lovasz.py rename to catalyst/contrib/criterion/lovasz.py diff --git a/catalyst/contrib/nn/criterion/margin.py b/catalyst/contrib/criterion/margin.py similarity index 100% rename from catalyst/contrib/nn/criterion/margin.py rename to catalyst/contrib/criterion/margin.py diff --git a/catalyst/contrib/nn/criterion/triplet.py b/catalyst/contrib/criterion/triplet.py similarity index 100% rename from catalyst/contrib/nn/criterion/triplet.py rename to catalyst/contrib/criterion/triplet.py diff --git a/catalyst/contrib/nn/criterion/wing.py b/catalyst/contrib/criterion/wing.py similarity index 100% rename from catalyst/contrib/nn/criterion/wing.py rename to catalyst/contrib/criterion/wing.py diff --git a/catalyst/contrib/dl/__init__.py b/catalyst/contrib/dl/__init__.py deleted file mode 100644 index f3e3eeff3c..0000000000 --- a/catalyst/contrib/dl/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# flake8: noqa - -from catalyst.contrib.dl.experiment import * -from catalyst.contrib.dl.runner import * -from catalyst.contrib.dl.callbacks import * diff --git a/catalyst/contrib/dl/callbacks/visdom_logger.py b/catalyst/contrib/dl/callbacks/visdom_logger.py deleted file mode 100644 index 8b3164b84e..0000000000 --- a/catalyst/contrib/dl/callbacks/visdom_logger.py +++ /dev/null @@ -1,274 +0,0 @@ -# flake8: noqa -# @TODO: code formatting issue for 20.07 release -from typing import Dict, List, Union -from collections import Counter -import logging -import queue -import threading -import time - -from alchemy.logger import Logger -import visdom - -from catalyst.core.callback import ( - Callback, - CallbackNode, - CallbackOrder, - CallbackScope, -) -from catalyst.core.runner import IRunner - - -class Visdom(Logger): - """Logger, translates ``runner.*_metrics`` to Visdom. - Read about Visdom here https://github.com/facebookresearch/visdom - - Example: - .. code-block:: python - - VisdomLogger( - env_name="...", # enviroment name - server="localhost", # visdom server name - port=8097, # visdom server port - ) - """ - - def __init__( - self, - env_name: str, - batch_size: int = None, - server: str = "localhost", - port: int = 8097, - log_to_filename: str = None, - username: str = None, - password: str = None, - ): - """ - Args: - env_name: Environment name to plot to when - no env is provided (default: main) - batch_size: batch_size for log_on_batch_end - server: the hostname of your - visdom server (default: 'http://localhost') - port: the port for your visdom server (default: 8097) - log_to_filename: logs per-epoch metrics if set True - username: username to use for authentication, - if server started with -enable_login (default: None) - password: password to use for authentication, - if server started with -enable_login (default: None) - """ - self._batch_size = max(int(batch_size or int(1e3)), 1) - self._counters = Counter() - self._queue = queue.Queue() - self._thread = threading.Thread(target=self._run_worker) - self._thread.start() - try: - self.viz = visdom.Visdom( - server=server, - port=port, - env=env_name, - log_to_filename=log_to_filename, - username=username, - password=password, - ) - startup_sec = 1 - while not self.viz.check_connection() and startup_sec > 0: - time.sleep(0.1) - startup_sec -= 0.1 - assert ( - self.viz.check_connection() - ), "No connection could be formed quickly" - except Exception as e: - logging.error( - "The visdom experienced an exception while" - + "running: {}".format(repr(e)) # noqa: P101 - ) - - def _run_worker(self): - """Runs worker to gather batch statistics.""" - running = True - while running: - batch = [] - try: - while len(batch) < self._batch_size: - if batch: - msg = self._queue.get_nowait() - else: - msg = self._queue.get() - if msg is None: - running = False - break - batch.append(msg) - except queue.Empty: - pass - if batch: - self.plot_lines(batch) - - def plot_lines(self, batch: List[Dict]): - """Plots vales from batch statistics. - - Args: - batch: List with dictionaries from log_scalar - """ - for msg in batch: - opts = { - "xlabel": "epochs", - "legend": ["train", "valid"], - "ylabel": msg["name"], - "title": msg["name"], - } - self.viz.line( - X=[self._counters[msg["full_name"]]], - Y=[msg["value"]], - win=msg["name"], - name=msg["mode"], - update="append", - opts=opts, - ) - - def log_scalar( - self, name: str, mode: str, full_name: str, value: Union[int, float], - ): - """Logs scalar. - - Args: - name: Environment name to plot to when - no env is provided (default: main) - mode: Metric's mode (example: train) - full_name: Full metric name - value (Union[int, float]): Metric's value - """ - self._queue.put( - { - "name": name, - "full_name": full_name, - "mode": mode, - "value": value, - "step": self._counters[full_name], - } - ) - self._counters[full_name] += 1 - - -class VisdomLogger(Callback): - """Logger callback, translates ``runner.*_metrics`` to Visdom. - Read about Visdom here https://github.com/facebookresearch/visdom - - Example: - .. code-block:: python - - from catalyst.dl import SupervisedRunner, VisdomLogger - - runner = SupervisedRunner() - - runner.train( - model=model, - criterion=criterion, - optimizer=optimizer, - loaders=loaders, - logdir=logdir, - num_epochs=num_epochs, - verbose=True, - callbacks={ - "logger": VisdomLogger( - env_name="...", # enviroment name - server="localhost", # visdom server name - port=8097, # visdom server port - ) - } - ) - """ - - def __init__( - self, - metric_names: List[str] = None, - log_on_batch_end: bool = False, - log_on_epoch_end: bool = True, - **logging_params, - ): - """ - Args: - metric_names: list of metric names to log, - if none - logs everything - log_on_batch_end: logs per-batch metrics if set True - log_on_epoch_end: logs per-epoch metrics if set True - """ - super().__init__( - order=CallbackOrder.logging, - node=CallbackNode.master, - scope=CallbackScope.experiment, - ) - self.metrics_to_log = metric_names - self.log_on_batch_end = log_on_batch_end - self.log_on_epoch_end = log_on_epoch_end - - if not (self.log_on_batch_end or self.log_on_epoch_end): - raise ValueError("You have to log something!") - - if (self.log_on_batch_end and not self.log_on_epoch_end) or ( - not self.log_on_batch_end and self.log_on_epoch_end - ): - self.batch_log_suffix = "" - self.epoch_log_suffix = "" - else: - self.batch_log_suffix = "_batch" - self.epoch_log_suffix = "_epoch" - self.logger = Visdom(**logging_params) - - def _log_metrics( - self, metrics: Dict[str, float], step: int, mode: str, suffix="" - ): - """Translate batch metrics to Visdom logger. - - Args: - metrics (Dict[str, float]): Metrics from Catalyst - step: Iteration step from Catalyst - mode: Metric's mode (example: train) - suffix: Additional suffix - """ - if self.metrics_to_log is None: - metrics_to_log = sorted(metrics.keys()) - else: - metrics_to_log = self.metrics_to_log - - for name in metrics_to_log: - if name in metrics: - # Renaming catalyst metric names to visdom formatting - real_mode = name.split("_")[0] - splitted_name = name.split(real_mode + "_")[-1] - metric_name = f"{splitted_name}{suffix}" - full_metric_name = f"{real_mode}/{metric_name}" - metric_value = metrics[name] - # Log values - self.logger.log_scalar( - metric_name, real_mode, full_metric_name, metric_value - ) - - def __del__(self): - """@TODO: Docs. Contribution is welcome.""" - self.logger.close() - - def on_batch_end(self, runner: IRunner): - """Translate batch metrics to Visdom.""" - if self.log_on_batch_end: - mode = runner.loader_name - metrics = runner.batch_metrics - self._log_metrics( - metrics=metrics, - step=runner.global_sample_step, - mode=mode, - suffix=self.batch_log_suffix, - ) - - def on_epoch_end(self, runner: IRunner): - """Translate epoch metrics to Visdom.""" - if self.log_on_epoch_end: - self._log_metrics( - metrics=runner.epoch_metrics, - step=runner.global_epoch, - mode=runner.loader_name, - suffix=self.epoch_log_suffix, - ) - - -__all__ = ["VisdomLogger"] diff --git a/catalyst/contrib/dl/runner/__init__.py b/catalyst/contrib/experiment/__init__.py similarity index 100% rename from catalyst/contrib/dl/runner/__init__.py rename to catalyst/contrib/experiment/__init__.py diff --git a/catalyst/contrib/nn/modules/__init__.py b/catalyst/contrib/modules/__init__.py similarity index 100% rename from catalyst/contrib/nn/modules/__init__.py rename to catalyst/contrib/modules/__init__.py diff --git a/catalyst/contrib/nn/modules/arcface.py b/catalyst/contrib/modules/arcface.py similarity index 100% rename from catalyst/contrib/nn/modules/arcface.py rename to catalyst/contrib/modules/arcface.py diff --git a/catalyst/contrib/nn/modules/common.py b/catalyst/contrib/modules/common.py similarity index 100% rename from catalyst/contrib/nn/modules/common.py rename to catalyst/contrib/modules/common.py diff --git a/catalyst/contrib/nn/modules/cosface.py b/catalyst/contrib/modules/cosface.py similarity index 100% rename from catalyst/contrib/nn/modules/cosface.py rename to catalyst/contrib/modules/cosface.py diff --git a/catalyst/contrib/nn/modules/lama.py b/catalyst/contrib/modules/lama.py similarity index 100% rename from catalyst/contrib/nn/modules/lama.py rename to catalyst/contrib/modules/lama.py diff --git a/catalyst/contrib/nn/modules/pooling.py b/catalyst/contrib/modules/pooling.py similarity index 100% rename from catalyst/contrib/nn/modules/pooling.py rename to catalyst/contrib/modules/pooling.py diff --git a/catalyst/contrib/nn/modules/rms_norm.py b/catalyst/contrib/modules/rms_norm.py similarity index 100% rename from catalyst/contrib/nn/modules/rms_norm.py rename to catalyst/contrib/modules/rms_norm.py diff --git a/catalyst/contrib/nn/modules/se.py b/catalyst/contrib/modules/se.py similarity index 100% rename from catalyst/contrib/nn/modules/se.py rename to catalyst/contrib/modules/se.py diff --git a/catalyst/contrib/nn/modules/softmax.py b/catalyst/contrib/modules/softmax.py similarity index 100% rename from catalyst/contrib/nn/modules/softmax.py rename to catalyst/contrib/modules/softmax.py diff --git a/catalyst/contrib/nn/__init__.py b/catalyst/contrib/nn/__init__.py deleted file mode 100644 index d8ee240e32..0000000000 --- a/catalyst/contrib/nn/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# flake8: noqa - -from catalyst.contrib.nn.criterion import * -from catalyst.contrib.nn.modules import * -from catalyst.contrib.nn.optimizers import * -from catalyst.contrib.nn.schedulers import * diff --git a/catalyst/contrib/nn/optimizers/__init__.py b/catalyst/contrib/nn/optimizers/__init__.py deleted file mode 100644 index d492967645..0000000000 --- a/catalyst/contrib/nn/optimizers/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# flake8: noqa -from torch.optim import * - -from catalyst.contrib.nn.optimizers.adamp import AdamP -from catalyst.contrib.nn.optimizers.lamb import Lamb -from catalyst.contrib.nn.optimizers.lookahead import Lookahead -from catalyst.contrib.nn.optimizers.qhadamw import QHAdamW -from catalyst.contrib.nn.optimizers.radam import RAdam -from catalyst.contrib.nn.optimizers.ralamb import Ralamb -from catalyst.contrib.nn.optimizers.sgdp import SGDP diff --git a/catalyst/contrib/optimizers/__init__.py b/catalyst/contrib/optimizers/__init__.py new file mode 100644 index 0000000000..f3ddfd4743 --- /dev/null +++ b/catalyst/contrib/optimizers/__init__.py @@ -0,0 +1,3 @@ +# flake8: noqa + +from catalyst.contrib.optimizers.lookahead import Lookahead diff --git a/catalyst/contrib/nn/optimizers/adamp.py b/catalyst/contrib/optimizers/adamp.py similarity index 100% rename from catalyst/contrib/nn/optimizers/adamp.py rename to catalyst/contrib/optimizers/adamp.py diff --git a/catalyst/contrib/nn/optimizers/lamb.py b/catalyst/contrib/optimizers/lamb.py similarity index 100% rename from catalyst/contrib/nn/optimizers/lamb.py rename to catalyst/contrib/optimizers/lamb.py diff --git a/catalyst/contrib/nn/optimizers/lookahead.py b/catalyst/contrib/optimizers/lookahead.py similarity index 100% rename from catalyst/contrib/nn/optimizers/lookahead.py rename to catalyst/contrib/optimizers/lookahead.py diff --git a/catalyst/contrib/nn/optimizers/qhadamw.py b/catalyst/contrib/optimizers/qhadamw.py similarity index 100% rename from catalyst/contrib/nn/optimizers/qhadamw.py rename to catalyst/contrib/optimizers/qhadamw.py diff --git a/catalyst/contrib/nn/optimizers/radam.py b/catalyst/contrib/optimizers/radam.py similarity index 100% rename from catalyst/contrib/nn/optimizers/radam.py rename to catalyst/contrib/optimizers/radam.py diff --git a/catalyst/contrib/nn/optimizers/ralamb.py b/catalyst/contrib/optimizers/ralamb.py similarity index 100% rename from catalyst/contrib/nn/optimizers/ralamb.py rename to catalyst/contrib/optimizers/ralamb.py diff --git a/catalyst/contrib/nn/optimizers/sgdp.py b/catalyst/contrib/optimizers/sgdp.py similarity index 100% rename from catalyst/contrib/nn/optimizers/sgdp.py rename to catalyst/contrib/optimizers/sgdp.py diff --git a/catalyst/contrib/nn/tests/__init__.py b/catalyst/contrib/runner/__init__.py similarity index 100% rename from catalyst/contrib/nn/tests/__init__.py rename to catalyst/contrib/runner/__init__.py diff --git a/catalyst/contrib/nn/schedulers/__init__.py b/catalyst/contrib/schedulers/__init__.py similarity index 100% rename from catalyst/contrib/nn/schedulers/__init__.py rename to catalyst/contrib/schedulers/__init__.py diff --git a/catalyst/contrib/nn/schedulers/base.py b/catalyst/contrib/schedulers/base.py similarity index 100% rename from catalyst/contrib/nn/schedulers/base.py rename to catalyst/contrib/schedulers/base.py diff --git a/catalyst/contrib/nn/schedulers/onecycle.py b/catalyst/contrib/schedulers/onecycle.py similarity index 100% rename from catalyst/contrib/nn/schedulers/onecycle.py rename to catalyst/contrib/schedulers/onecycle.py diff --git a/catalyst/core/callbacks/tests/__init__.py b/catalyst/contrib/tests/__init__.py similarity index 100% rename from catalyst/core/callbacks/tests/__init__.py rename to catalyst/contrib/tests/__init__.py diff --git a/catalyst/contrib/nn/tests/test_criterion.py b/catalyst/contrib/tests/test_criterion.py similarity index 100% rename from catalyst/contrib/nn/tests/test_criterion.py rename to catalyst/contrib/tests/test_criterion.py diff --git a/catalyst/contrib/nn/tests/test_modules.py b/catalyst/contrib/tests/test_modules.py similarity index 100% rename from catalyst/contrib/nn/tests/test_modules.py rename to catalyst/contrib/tests/test_modules.py diff --git a/catalyst/contrib/nn/tests/test_optimizer.py b/catalyst/contrib/tests/test_optimizer.py similarity index 100% rename from catalyst/contrib/nn/tests/test_optimizer.py rename to catalyst/contrib/tests/test_optimizer.py diff --git a/catalyst/core/callbacks/__init__.py b/catalyst/core/callbacks/__init__.py deleted file mode 100644 index 427812e558..0000000000 --- a/catalyst/core/callbacks/__init__.py +++ /dev/null @@ -1,45 +0,0 @@ -# flake8: noqa - -from catalyst.core.callbacks.batch_overfit import BatchOverfitCallback -from catalyst.core.callbacks.checkpoint import ( - ICheckpointCallback, - BaseCheckpointCallback, - CheckpointCallback, - IterationCheckpointCallback, -) -from catalyst.core.callbacks.control_flow import ControlFlowCallback -from catalyst.core.callbacks.criterion import CriterionCallback -from catalyst.core.callbacks.early_stop import ( - CheckRunCallback, - EarlyStoppingCallback, -) -from catalyst.core.callbacks.exception import ExceptionCallback -from catalyst.core.callbacks.logging import ( - ILoggerCallback, - ConsoleLogger, - TensorboardLogger, - VerboseLogger, -) -from catalyst.core.callbacks.metrics import ( - IMetricCallback, - IBatchMetricCallback, - ILoaderMetricCallback, - BatchMetricCallback, - LoaderMetricCallback, - MetricCallback, - MetricAggregationCallback, - MetricManagerCallback, -) -from catalyst.core.callbacks.optimizer import ( - IOptimizerCallback, - OptimizerCallback, - AMPOptimizerCallback, -) -from catalyst.core.callbacks.periodic_loader import PeriodicLoaderCallback -from catalyst.core.callbacks.scheduler import ( - ISchedulerCallback, - LRUpdater, - SchedulerCallback, -) -from catalyst.core.callbacks.timer import TimerCallback -from catalyst.core.callbacks.validation import ValidationManagerCallback diff --git a/catalyst/core/experiment.py b/catalyst/core/experiment.py index cb451332e2..df5362d637 100644 --- a/catalyst/core/experiment.py +++ b/catalyst/core/experiment.py @@ -5,7 +5,7 @@ from torch.utils.data import DataLoader, Dataset from catalyst.core.callback import Callback -from catalyst.tools.typing import Criterion, Model, Optimizer, Scheduler +from catalyst.typing import Criterion, Model, Optimizer, Scheduler class IExperiment(ABC): diff --git a/catalyst/core/runner.py b/catalyst/core/runner.py index 071be0073d..3d054472d2 100644 --- a/catalyst/core/runner.py +++ b/catalyst/core/runner.py @@ -13,7 +13,7 @@ from catalyst.core.legacy import IRunnerLegacy from catalyst.tools import settings from catalyst.tools.frozen_class import FrozenClass -from catalyst.tools.typing import ( +from catalyst.typing import ( Criterion, Device, Model, @@ -913,7 +913,7 @@ def run_experiment(self, experiment: IExperiment = None) -> "IRunner": for stage in self.experiment.stages: self._run_stage(stage) except (Exception, KeyboardInterrupt) as ex: - from catalyst.core.callbacks.exception import ExceptionCallback + from catalyst.callbacks.exception import ExceptionCallback def _exception_handler_check(callbacks: Union[OrderedDict, Dict]): return callbacks is not None and any( diff --git a/catalyst/core/utils/__init__.py b/catalyst/core/utils/__init__.py deleted file mode 100644 index 5f9906f999..0000000000 --- a/catalyst/core/utils/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# flake8: noqa - -from catalyst.contrib.utils import * -from catalyst.utils import * - -from catalyst.core.utils.callbacks import ( - filter_callbacks_by_node, - sort_callbacks_by_order, -) -from catalyst.core.utils.data import get_loaders_from_params, validate_loaders diff --git a/catalyst/dl/__init__.py b/catalyst/dl/__init__.py index 30c4032616..21d8795f2e 100644 --- a/catalyst/dl/__init__.py +++ b/catalyst/dl/__init__.py @@ -1,7 +1,3 @@ # flake8: noqa -from catalyst.core import * - from catalyst.dl.callbacks import * -from catalyst.dl.experiment import * -from catalyst.dl.runner import * diff --git a/catalyst/dl/__main__.py b/catalyst/dl/__main__.py index c840bffa83..24ee1e345f 100644 --- a/catalyst/dl/__main__.py +++ b/catalyst/dl/__main__.py @@ -3,7 +3,7 @@ from catalyst.__version__ import __version__ from catalyst.dl.scripts import quantize, run, trace -from catalyst.tools.settings import IS_GIT_AVAILABLE, IS_OPTUNA_AVAILABLE +from catalyst.settings import IS_GIT_AVAILABLE, IS_OPTUNA_AVAILABLE COMMANDS = OrderedDict( [("run", run), ("trace", trace), ("quantize", quantize)] diff --git a/catalyst/dl/callbacks/metrics/__init__.py b/catalyst/dl/callbacks/metrics/__init__.py deleted file mode 100644 index fd61543a97..0000000000 --- a/catalyst/dl/callbacks/metrics/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# flake8: noqa - -from catalyst.dl.callbacks.metrics.accuracy import ( - AccuracyCallback, - MultiLabelAccuracyCallback, -) -from catalyst.dl.callbacks.metrics.auc import AUCCallback -from catalyst.dl.callbacks.metrics.cmc_score import CMCScoreCallback -from catalyst.dl.callbacks.metrics.dice import ( - DiceCallback, - MultiClassDiceMetricCallback, - MulticlassDiceMetricCallback, -) -from catalyst.dl.callbacks.metrics.f1_score import F1ScoreCallback -from catalyst.dl.callbacks.metrics.iou import ( - ClasswiseIouCallback, - ClasswiseJaccardCallback, - IouCallback, - JaccardCallback, -) -from catalyst.dl.callbacks.metrics.ppv_tpr_f1 import ( - PrecisionRecallF1ScoreCallback, -) - -from catalyst.dl.callbacks.metrics.precision import AveragePrecisionCallback diff --git a/catalyst/dl/callbacks/scheduler.py b/catalyst/dl/callbacks/scheduler.py deleted file mode 100644 index eacf0a3ed6..0000000000 --- a/catalyst/dl/callbacks/scheduler.py +++ /dev/null @@ -1,102 +0,0 @@ -from typing import Optional - -from catalyst.core import IRunner -from catalyst.core.callbacks import LRUpdater - - -class LRFinder(LRUpdater): - """ - Helps you find an optimal learning rate for a model, as per suggestion of - `Cyclical Learning Rates for Training Neural Networks`_ paper. - Learning rate is increased in linear or log scale, depending on user input. - - See `How Do You Find A Good Learning Rate`_ article for details. - - .. _Cyclical Learning Rates for Training Neural Networks: - https://arxiv.org/abs/1506.01186 - .. _How Do You Find A Good Learning Rate: - https://sgugger.github.io/how-do-you-find-a-good-learning-rate.html - """ - - def __init__( - self, - final_lr, - scale: str = "log", - num_steps: Optional[int] = None, - optimizer_key: str = None, - ): - """ - Args: - final_lr: final learning rate to try with - scale: learning rate increasing scale ("log" or "linear") - num_steps: number of batches to try; - if None - whole loader would be used. - optimizer_key: which optimizer key to use - for learning rate scheduling - """ - super().__init__(optimizer_key=optimizer_key) - - self.final_lr = final_lr - self.scale = scale - self.num_steps = num_steps - self.multiplier = 0 - self.lr_step = 0 - self.find_iter = 0 - - self._calc_lr = None - if scale == "log": - self._calc_lr = self._calc_lr_log - elif scale == "linear": - self._calc_lr = self._calc_lr_linear - else: - raise Exception("Not supported") - - def _calc_lr_log(self): - return self.init_lr * self.multiplier ** self.find_iter - - def _calc_lr_linear(self): - return self.init_lr + self.lr_step * self.find_iter - - def calc_lr(self): - """Calculates learning rate. - - Returns: - learning rate. - """ - res = self._calc_lr() - self.find_iter += 1 - return res - - def calc_momentum(self): - """Calculates new momentum.""" - pass - - def on_loader_start(self, runner: IRunner): - """Loader start hook. Updates scheduler statistics. - - Args: - runner: current runner - """ - if runner.is_train_loader: - lr_step = self.final_lr / self.init_lr - self.num_steps = self.num_steps or runner.loader_len - self.multiplier = lr_step ** (1 / self.num_steps) - self.lr_step = (self.final_lr - self.init_lr) / self.num_steps - - super().on_loader_start(runner=runner) - - def on_batch_end(self, runner: IRunner): - """Batch end hook. Make scheduler step and stops iterating if needed. - - Args: - runner: current runner - - Raises: - NotImplementedError: at the end of LRFinder - """ - super().on_batch_end(runner=runner) - if self.find_iter > self.num_steps: - raise NotImplementedError("End of LRFinder") - - -__all__ = ["LRFinder"] diff --git a/catalyst/dl/callbacks/tests/__init__.py b/catalyst/dl/callbacks/tests/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/catalyst/dl/experiment/__init__.py b/catalyst/dl/experiment/__init__.py deleted file mode 100644 index 54ea04f527..0000000000 --- a/catalyst/dl/experiment/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# flake8: noqa - -from catalyst.dl.experiment.config import ConfigExperiment -from catalyst.dl.experiment.experiment import Experiment -from catalyst.dl.experiment.supervised import SupervisedExperiment - - -__all__ = ["ConfigExperiment", "Experiment", "SupervisedExperiment"] diff --git a/catalyst/dl/runner/__init__.py b/catalyst/dl/runner/__init__.py deleted file mode 100644 index 0bf25c2622..0000000000 --- a/catalyst/dl/runner/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# flake8: noqa - -from catalyst.dl.runner.runner import Runner -from catalyst.dl.runner.supervised import SupervisedRunner - -__all__ = ["Runner", "SupervisedRunner"] diff --git a/catalyst/dl/scripts/quantize.py b/catalyst/dl/scripts/quantize.py index 472355fc47..02afa0558b 100755 --- a/catalyst/dl/scripts/quantize.py +++ b/catalyst/dl/scripts/quantize.py @@ -5,7 +5,7 @@ import logging from pathlib import Path -from catalyst.dl.utils.quantization import ( +from catalyst.utils.quantization import ( quantize_model_from_checkpoint, save_quantized_model, ) diff --git a/catalyst/dl/utils/__init__.py b/catalyst/dl/utils/__init__.py deleted file mode 100644 index 22b2cc31e8..0000000000 --- a/catalyst/dl/utils/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -# flake8: noqa - -from catalyst.contrib.utils import * -from catalyst.core.utils import * -from catalyst.utils import * - -from catalyst.dl.utils.callbacks import ( - check_callback_isinstance, - get_original_callback, -) -from catalyst.dl.utils.torch import get_loader -from catalyst.dl.utils.trace import ( - get_trace_name, - load_traced_model, - save_traced_model, - trace_model, - trace_model_from_checkpoint, - trace_model_from_runner, -) - -from catalyst.tools.settings import IS_GIT_AVAILABLE, IS_QUANTIZATION_AVAILABLE - -if IS_GIT_AVAILABLE: - from catalyst.dl.utils.wizard import run_wizard, Wizard - -if IS_QUANTIZATION_AVAILABLE: - from catalyst.dl.utils.quantization import save_quantized_model diff --git a/catalyst/dl/utils/callbacks.py b/catalyst/dl/utils/callbacks.py deleted file mode 100644 index e6b3d51f84..0000000000 --- a/catalyst/dl/utils/callbacks.py +++ /dev/null @@ -1,32 +0,0 @@ -from catalyst.dl import Callback, WrapperCallback - - -def get_original_callback(callback: Callback) -> Callback: - """Get original callback (if it has wrapper) - - Args: - callback: callback to unpack - - Returns: - callback inside wrapper - """ - while isinstance(callback, WrapperCallback): - callback = callback.callback - return callback - - -def check_callback_isinstance(callback: Callback, class_or_tuple) -> bool: - """Check if callback is the same type as required ``class_or_tuple`` - - Args: - callback: callback to check - class_or_tuple: class_or_tuple to compare with - - Returns: - bool: true if first object has the required type - """ - callback = get_original_callback(callback) - return isinstance(callback, class_or_tuple) - - -__all__ = ["get_original_callback", "check_callback_isinstance"] diff --git a/catalyst/dl/utils/torch.py b/catalyst/dl/utils/torch.py deleted file mode 100644 index 944a643c6b..0000000000 --- a/catalyst/dl/utils/torch.py +++ /dev/null @@ -1,68 +0,0 @@ -from typing import Callable, Iterable - -import torch -from torch.utils.data.dataloader import default_collate as default_collate_fn - -from catalyst.data import ListDataset - - -def get_loader( - data_source: Iterable[dict], - open_fn: Callable, - dict_transform: Callable = None, - sampler=None, - collate_fn: Callable = default_collate_fn, - batch_size: int = 32, - num_workers: int = 4, - shuffle: bool = False, - drop_last: bool = False, -): - """Creates a DataLoader from given source and its open/transform params. - - Args: - data_source: and iterable containing your - data annotations, - (for example path to images, labels, bboxes, etc) - open_fn: function, that can open your - annotations dict and - transfer it to data, needed by your network - (for example open image by path, or tokenize read string) - dict_transform: transforms to use on dict - (for example normalize image, add blur, crop/resize/etc) - sampler (Sampler, optional): defines the strategy to draw samples from - the dataset - collate_fn (callable, optional): merges a list of samples to form a - mini-batch of Tensor(s). Used when using batched loading from a - map-style dataset - batch_size (int, optional): how many samples per batch to load - num_workers (int, optional): how many subprocesses to use for data - loading. ``0`` means that the data will be loaded - in the main process - shuffle (bool, optional): set to ``True`` to have the data reshuffled - at every epoch (default: ``False``). - drop_last (bool, optional): set to ``True`` to drop - the last incomplete batch, if the dataset size is not divisible - by the batch size. If ``False`` and the size of dataset - is not divisible by the batch size, then the last batch - will be smaller. (default: ``False``) - - Returns: - DataLoader with ``catalyst.data.ListDataset`` - """ - dataset = ListDataset( - list_data=data_source, open_fn=open_fn, dict_transform=dict_transform, - ) - loader = torch.utils.data.DataLoader( - dataset=dataset, - sampler=sampler, - collate_fn=collate_fn, - batch_size=batch_size, - num_workers=num_workers, - shuffle=shuffle, - pin_memory=torch.cuda.is_available(), - drop_last=drop_last, - ) - return loader - - -__all__ = ["get_loader"] diff --git a/catalyst/experiment/__init__.py b/catalyst/experiment/__init__.py new file mode 100644 index 0000000000..63c250c186 --- /dev/null +++ b/catalyst/experiment/__init__.py @@ -0,0 +1,6 @@ +# flake8: noqa + +from catalyst.experiment.supervised import SupervisedExperiment + + +__all__ = ["ConfigExperiment", "Experiment", "SupervisedExperiment"] diff --git a/catalyst/dl/experiment/config.py b/catalyst/experiment/config.py similarity index 99% rename from catalyst/dl/experiment/config.py rename to catalyst/experiment/config.py index 33cb07d6fc..37e83cef39 100644 --- a/catalyst/dl/experiment/config.py +++ b/catalyst/experiment/config.py @@ -37,7 +37,7 @@ SCHEDULERS, TRANSFORMS, ) -from catalyst.tools.typing import Criterion, Model, Optimizer, Scheduler +from catalyst.typing import Criterion, Model, Optimizer, Scheduler class ConfigExperiment(IExperiment): diff --git a/catalyst/dl/experiment/experiment.py b/catalyst/experiment/experiment.py similarity index 99% rename from catalyst/dl/experiment/experiment.py rename to catalyst/experiment/experiment.py index 025b339f7f..7602a9d321 100644 --- a/catalyst/dl/experiment/experiment.py +++ b/catalyst/experiment/experiment.py @@ -22,7 +22,7 @@ ) from catalyst.dl.utils import check_callback_isinstance from catalyst.tools import settings -from catalyst.tools.typing import Criterion, Model, Optimizer, Scheduler +from catalyst.typing import Criterion, Model, Optimizer, Scheduler class Experiment(IExperiment): diff --git a/catalyst/dl/experiment/supervised.py b/catalyst/experiment/supervised.py similarity index 96% rename from catalyst/dl/experiment/supervised.py rename to catalyst/experiment/supervised.py index 3581b509d3..62cc2187f6 100644 --- a/catalyst/dl/experiment/supervised.py +++ b/catalyst/experiment/supervised.py @@ -11,9 +11,9 @@ OptimizerCallback, SchedulerCallback, ) -from catalyst.dl.experiment.experiment import Experiment from catalyst.dl.utils import check_amp_available, check_callback_isinstance -from catalyst.tools.typing import Criterion, Optimizer, Scheduler +from catalyst.experiment import Experiment +from catalyst.typing import Criterion, Optimizer, Scheduler class SupervisedExperiment(Experiment): diff --git a/catalyst/core/tests/__init__.py b/catalyst/experiment/tests/__init__.py similarity index 100% rename from catalyst/core/tests/__init__.py rename to catalyst/experiment/tests/__init__.py diff --git a/catalyst/dl/experiment/tests/test_config.py b/catalyst/experiment/tests/test_config.py similarity index 98% rename from catalyst/dl/experiment/tests/test_config.py rename to catalyst/experiment/tests/test_config.py index 736853e6fa..6fcdb09ae4 100644 --- a/catalyst/dl/experiment/tests/test_config.py +++ b/catalyst/experiment/tests/test_config.py @@ -16,7 +16,7 @@ TensorboardLogger, ValidationManagerCallback, ) -from catalyst.dl.experiment.config import ConfigExperiment +from catalyst.experiment import ConfigExperiment DEFAULT_MINIMAL_CONFIG = { # noqa: WPS407 "model_params": {"model": "SomeModel"}, diff --git a/catalyst/dl/experiment/tests/test_core.py b/catalyst/experiment/tests/test_core.py similarity index 97% rename from catalyst/dl/experiment/tests/test_core.py rename to catalyst/experiment/tests/test_core.py index f8f5345299..47dc1e1f47 100644 --- a/catalyst/dl/experiment/tests/test_core.py +++ b/catalyst/experiment/tests/test_core.py @@ -8,7 +8,7 @@ MetricManagerCallback, ValidationManagerCallback, ) -from catalyst.dl.experiment.experiment import Experiment +from catalyst.experiment import Experiment def _test_callbacks(test_callbacks, exp, stage="train"): diff --git a/catalyst/dl/experiment/tests/test_supervised.py b/catalyst/experiment/tests/test_supervised.py similarity index 99% rename from catalyst/dl/experiment/tests/test_supervised.py rename to catalyst/experiment/tests/test_supervised.py index 9663c60fa9..37cced7ce1 100644 --- a/catalyst/dl/experiment/tests/test_supervised.py +++ b/catalyst/experiment/tests/test_supervised.py @@ -16,7 +16,7 @@ ValidationManagerCallback, VerboseLogger, ) -from catalyst.dl.experiment.supervised import SupervisedExperiment +from catalyst.experiment.supervised import SupervisedExperiment def _test_callbacks(test_callbacks, exp, stage="train"): diff --git a/catalyst/registry/registries.py b/catalyst/registry/registries.py index 53d42da5c9..59dbc5738e 100644 --- a/catalyst/registry/registries.py +++ b/catalyst/registry/registries.py @@ -173,7 +173,7 @@ def _experiments_loader(r: Registry): r.add(IExperiment) r.add(IStageBasedRunner) - from catalyst.dl import experiment as m # noqa: WPS347 + from catalyst import experiment as m r.add_from_module(m) @@ -193,7 +193,7 @@ def _runners_loader(r: Registry): r.add(IRunner) r.add(IStageBasedRunner) - from catalyst.dl import runner as m # noqa: WPS347 + from catalyst import runner as m r.add_from_module(m) @@ -216,7 +216,7 @@ def _callbacks_loader(r: Registry): r.add_from_module(m) - from catalyst.contrib.dl import callbacks as m # noqa: WPS347 + from catalyst.contrib import callbacks as m r.add_from_module(m) diff --git a/catalyst/runner/__init__.py b/catalyst/runner/__init__.py new file mode 100644 index 0000000000..ce5ff0a48d --- /dev/null +++ b/catalyst/runner/__init__.py @@ -0,0 +1,5 @@ +# flake8: noqa + +from catalyst.runner.supervised import SupervisedRunner + +__all__ = ["Runner", "SupervisedRunner"] diff --git a/catalyst/dl/runner/runner.py b/catalyst/runner/runner.py similarity index 98% rename from catalyst/dl/runner/runner.py rename to catalyst/runner/runner.py index d47f568c24..4e3cc75fd6 100644 --- a/catalyst/dl/runner/runner.py +++ b/catalyst/runner/runner.py @@ -7,14 +7,8 @@ from catalyst.core import Callback, CheckpointCallback, IStageBasedRunner from catalyst.dl import utils -from catalyst.dl.experiment.experiment import Experiment -from catalyst.tools.typing import ( - Criterion, - Device, - Model, - Optimizer, - Scheduler, -) +from catalyst.experiment import Experiment +from catalyst.typing import Criterion, Device, Model, Optimizer, Scheduler class Runner(IStageBasedRunner): diff --git a/catalyst/dl/runner/supervised.py b/catalyst/runner/supervised.py similarity index 97% rename from catalyst/dl/runner/supervised.py rename to catalyst/runner/supervised.py index b13798e2cd..0f1b201142 100644 --- a/catalyst/dl/runner/supervised.py +++ b/catalyst/runner/supervised.py @@ -3,9 +3,9 @@ import torch -from catalyst.dl.experiment.supervised import SupervisedExperiment -from catalyst.dl.runner.runner import Runner -from catalyst.tools.typing import Device, RunnerModel +from catalyst.experiment.supervised import SupervisedExperiment +from catalyst.runner.runner import Runner +from catalyst.typing import Device, RunnerModel logger = logging.getLogger(__name__) diff --git a/catalyst/tools/settings.py b/catalyst/settings.py similarity index 100% rename from catalyst/tools/settings.py rename to catalyst/settings.py diff --git a/catalyst/tools/__init__.py b/catalyst/tools/__init__.py index 4e4863ccb0..a8138e3620 100644 --- a/catalyst/tools/__init__.py +++ b/catalyst/tools/__init__.py @@ -1,23 +1,5 @@ # flake8: noqa from catalyst.tools.frozen_class import FrozenClass from catalyst.tools.time_manager import TimeManager -from catalyst.tools.typing import ( - Model, - Criterion, - Optimizer, - Scheduler, - Dataset, - Device, - RunnerModel, - RunnerCriterion, - RunnerOptimizer, - RunnerScheduler, -) from catalyst.tools.meters import * -from catalyst.tools.settings import ( - settings, - Settings, - ConfigFileFinder, - MergedConfigParser, -) diff --git a/catalyst/tools/typing.py b/catalyst/typing.py similarity index 100% rename from catalyst/tools/typing.py rename to catalyst/typing.py diff --git a/catalyst/utils/__init__.py b/catalyst/utils/__init__.py index 9cb70625b1..01defcc892 100644 --- a/catalyst/utils/__init__.py +++ b/catalyst/utils/__init__.py @@ -6,8 +6,6 @@ Everything from :py:mod:`catalyst.contrib.utils` is included in :py:mod:`catalyst.utils` """ -from catalyst.contrib.utils import * - from catalyst.utils.checkpoint import ( load_checkpoint, pack_checkpoint, @@ -99,12 +97,12 @@ detach, trim_tensors, ) -from catalyst.tools.settings import IS_PRUNING_AVAILABLE +from catalyst.settings import IS_PRUNING_AVAILABLE if IS_PRUNING_AVAILABLE: from catalyst.utils.pruning import prune_model, remove_reparametrization -from catalyst.tools.settings import IS_GIT_AVAILABLE +from catalyst.settings import IS_GIT_AVAILABLE if IS_GIT_AVAILABLE: from catalyst.utils.pipelines import clone_pipeline diff --git a/catalyst/core/utils/callbacks.py b/catalyst/utils/callbacks.py similarity index 69% rename from catalyst/core/utils/callbacks.py rename to catalyst/utils/callbacks.py index 2b5eca09dc..d8573e24cb 100644 --- a/catalyst/core/utils/callbacks.py +++ b/catalyst/utils/callbacks.py @@ -3,6 +3,35 @@ from catalyst.core.callback import CallbackNode from catalyst.core.utils import get_rank +from catalyst.dl import Callback, WrapperCallback + + +def get_original_callback(callback: Callback) -> Callback: + """Get original callback (if it has wrapper) + + Args: + callback: callback to unpack + + Returns: + callback inside wrapper + """ + while isinstance(callback, WrapperCallback): + callback = callback.callback + return callback + + +def check_callback_isinstance(callback: Callback, class_or_tuple) -> bool: + """Check if callback is the same type as required ``class_or_tuple`` + + Args: + callback: callback to check + class_or_tuple: class_or_tuple to compare with + + Returns: + bool: true if first object has the required type + """ + callback = get_original_callback(callback) + return isinstance(callback, class_or_tuple) def sort_callbacks_by_order( @@ -70,4 +99,9 @@ def filter_callbacks_by_node( return output -__all__ = ["sort_callbacks_by_order", "filter_callbacks_by_node"] +__all__ = [ + "sort_callbacks_by_order", + "filter_callbacks_by_node", + "get_original_callback", + "check_callback_isinstance", +] diff --git a/catalyst/utils/components.py b/catalyst/utils/components.py index ec979343f0..b820508e30 100644 --- a/catalyst/utils/components.py +++ b/catalyst/utils/components.py @@ -5,14 +5,8 @@ from torch import nn import torch.distributed -from catalyst.tools.settings import IS_XLA_AVAILABLE -from catalyst.tools.typing import ( - Criterion, - Device, - Model, - Optimizer, - Scheduler, -) +from catalyst.settings import IS_XLA_AVAILABLE +from catalyst.typing import Criterion, Device, Model, Optimizer, Scheduler from catalyst.utils.distributed import ( check_amp_available, check_apex_available, diff --git a/catalyst/utils/loader.py b/catalyst/utils/loader.py index 2633105a53..e69de29bb2 100644 --- a/catalyst/utils/loader.py +++ b/catalyst/utils/loader.py @@ -1,58 +0,0 @@ -from typing import Dict, Union # isort:skip - -from torch.utils.data import DataLoader - - -def get_native_batch_from_loader(loader: DataLoader, batch_index: int = 0): - """ - Returns a batch from experiment loader - - Args: - loader: Loader to get batch from - batch_index: Index of batch to take from dataset of the loader - - Returns: - batch from loader - """ - dataset = loader.dataset - collate_fn = loader.collate_fn - return collate_fn([dataset[batch_index]]) - - -def get_native_batch_from_loaders( - loaders: Dict[str, DataLoader], - loader: Union[str, int] = 0, - batch_index: int = 0, -): - """ - Returns a batch from experiment loaders by its index or name. - - Args: - loaders (Dict[str, DataLoader]): Loaders list to get loader from - loader (Union[str, int]): Loader name or its index, default is zero - batch_index: Index of batch to take from dataset of the loader - - Returns: - batch from loader - - Raises: - TypeError: if loader parameter is not a string or an integer - """ - if isinstance(loader, str): - loader_instance = loaders[loader] - elif isinstance(loader, int): - loader_instance = list(loaders.values())[loader] - else: - raise TypeError("Loader parameter must be a string or an integer") - - output = get_native_batch_from_loader( - loader=loader_instance, batch_index=batch_index - ) - - return output - - -__all__ = [ - "get_native_batch_from_loader", - "get_native_batch_from_loaders", -] diff --git a/catalyst/core/utils/data.py b/catalyst/utils/loaders.py similarity index 63% rename from catalyst/core/utils/data.py rename to catalyst/utils/loaders.py index 73e94fca7b..7ccb2e2036 100644 --- a/catalyst/core/utils/data.py +++ b/catalyst/utils/loaders.py @@ -1,15 +1,126 @@ -from typing import Any, Callable, Dict +from typing import Any, Callable, Dict, Iterable from collections import OrderedDict from copy import copy import warnings import torch from torch.utils.data import DataLoader, Dataset, DistributedSampler +from torch.utils.data.dataloader import default_collate as default_collate_fn -from catalyst.data import DistributedSamplerWrapper +from catalyst.data import DistributedSamplerWrapper, ListDataset from catalyst.registry import SAMPLER from catalyst.utils import get_rank, merge_dicts, set_global_seed +from typing import Dict, Union # isort:skip + + +def get_loader( + data_source: Iterable[dict], + open_fn: Callable, + dict_transform: Callable = None, + sampler=None, + collate_fn: Callable = default_collate_fn, + batch_size: int = 32, + num_workers: int = 4, + shuffle: bool = False, + drop_last: bool = False, +): + """Creates a DataLoader from given source and its open/transform params. + + Args: + data_source: and iterable containing your + data annotations, + (for example path to images, labels, bboxes, etc) + open_fn: function, that can open your + annotations dict and + transfer it to data, needed by your network + (for example open image by path, or tokenize read string) + dict_transform: transforms to use on dict + (for example normalize image, add blur, crop/resize/etc) + sampler (Sampler, optional): defines the strategy to draw samples from + the dataset + collate_fn (callable, optional): merges a list of samples to form a + mini-batch of Tensor(s). Used when using batched loading from a + map-style dataset + batch_size (int, optional): how many samples per batch to load + num_workers (int, optional): how many subprocesses to use for data + loading. ``0`` means that the data will be loaded + in the main process + shuffle (bool, optional): set to ``True`` to have the data reshuffled + at every epoch (default: ``False``). + drop_last (bool, optional): set to ``True`` to drop + the last incomplete batch, if the dataset size is not divisible + by the batch size. If ``False`` and the size of dataset + is not divisible by the batch size, then the last batch + will be smaller. (default: ``False``) + + Returns: + DataLoader with ``catalyst.data.ListDataset`` + """ + dataset = ListDataset( + list_data=data_source, open_fn=open_fn, dict_transform=dict_transform, + ) + loader = torch.utils.data.DataLoader( + dataset=dataset, + sampler=sampler, + collate_fn=collate_fn, + batch_size=batch_size, + num_workers=num_workers, + shuffle=shuffle, + pin_memory=torch.cuda.is_available(), + drop_last=drop_last, + ) + return loader + + +def get_native_batch_from_loader(loader: DataLoader, batch_index: int = 0): + """ + Returns a batch from experiment loader + + Args: + loader: Loader to get batch from + batch_index: Index of batch to take from dataset of the loader + + Returns: + batch from loader + """ + dataset = loader.dataset + collate_fn = loader.collate_fn + return collate_fn([dataset[batch_index]]) + + +def get_native_batch_from_loaders( + loaders: Dict[str, DataLoader], + loader: Union[str, int] = 0, + batch_index: int = 0, +): + """ + Returns a batch from experiment loaders by its index or name. + + Args: + loaders (Dict[str, DataLoader]): Loaders list to get loader from + loader (Union[str, int]): Loader name or its index, default is zero + batch_index: Index of batch to take from dataset of the loader + + Returns: + batch from loader + + Raises: + TypeError: if loader parameter is not a string or an integer + """ + if isinstance(loader, str): + loader_instance = loaders[loader] + elif isinstance(loader, int): + loader_instance = list(loaders.values())[loader] + else: + raise TypeError("Loader parameter must be a string or an integer") + + output = get_native_batch_from_loader( + loader=loader_instance, batch_index=batch_index + ) + + return output + def _force_make_distributed_loader(loader: DataLoader) -> DataLoader: """ @@ -208,4 +319,10 @@ def get_loaders_from_params( return loaders -__all__ = ["get_loaders_from_params", "validate_loaders"] +__all__ = [ + "get_loaders_from_params", + "validate_loaders", + "get_native_batch_from_loader", + "get_native_batch_from_loaders", + "get_loader", +] diff --git a/catalyst/dl/utils/quantization.py b/catalyst/utils/quantization.py similarity index 98% rename from catalyst/dl/utils/quantization.py rename to catalyst/utils/quantization.py index ea2f0a53b6..a94f9a4336 100644 --- a/catalyst/dl/utils/quantization.py +++ b/catalyst/utils/quantization.py @@ -15,7 +15,7 @@ ) if TYPE_CHECKING: - from catalyst.dl.experiment.config import ConfigExperiment + from catalyst.experiment import ConfigExperiment logger = logging.getLogger(__name__) diff --git a/catalyst/utils/torch.py b/catalyst/utils/torch.py index 3af7799625..0372f7bf69 100644 --- a/catalyst/utils/torch.py +++ b/catalyst/utils/torch.py @@ -10,8 +10,8 @@ import torch.backends from torch.backends import cudnn -from catalyst.tools.settings import IS_XLA_AVAILABLE -from catalyst.tools.typing import Device, Model, Optimizer +from catalyst.settings import IS_XLA_AVAILABLE +from catalyst.typing import Device, Model, Optimizer from catalyst.utils.dict import merge_dicts diff --git a/catalyst/dl/utils/trace.py b/catalyst/utils/tracing.py similarity index 99% rename from catalyst/dl/utils/trace.py rename to catalyst/utils/tracing.py index 5ae8f08781..fa386e31ec 100644 --- a/catalyst/dl/utils/trace.py +++ b/catalyst/utils/tracing.py @@ -12,8 +12,8 @@ from torch import jit, nn from catalyst.core.runner import IRunner -from catalyst.dl.experiment.config import ConfigExperiment -from catalyst.tools.typing import Device, Model +from catalyst.experiment import ConfigExperiment +from catalyst.typing import Device, Model from catalyst.utils import ( any2device, assert_fp16_available, diff --git a/catalyst/dl/utils/wizard.py b/catalyst/utils/wizard.py similarity index 100% rename from catalyst/dl/utils/wizard.py rename to catalyst/utils/wizard.py diff --git a/tests/_tests_cv_classification_transforms/experiment.py b/tests/_tests_cv_classification_transforms/experiment.py index 1fdeae9974..dead7e6618 100644 --- a/tests/_tests_cv_classification_transforms/experiment.py +++ b/tests/_tests_cv_classification_transforms/experiment.py @@ -4,7 +4,7 @@ from torch.utils.data import Dataset from catalyst.contrib.datasets import MNIST as _MNIST -from catalyst.dl.experiment import ConfigExperiment +from catalyst.experiment import ConfigExperiment class MNIST(_MNIST): diff --git a/tests/_tests_scripts/cv_z_kornia.py b/tests/_tests_scripts/cv_z_kornia.py index 0bd4f1ff07..3f96bb979c 100644 --- a/tests/_tests_scripts/cv_z_kornia.py +++ b/tests/_tests_scripts/cv_z_kornia.py @@ -6,10 +6,8 @@ from torch.utils.data import DataLoader from catalyst import dl +from catalyst.contrib.callbacks.kornia_transform import BatchTransformCallback from catalyst.contrib.datasets import MNIST -from catalyst.contrib.dl.callbacks.kornia_transform import ( - BatchTransformCallback, -) from catalyst.data.cv import ToTensor from catalyst.utils import metrics diff --git a/tests/_tests_scripts/cv_z_segmentation.py b/tests/_tests_scripts/cv_z_segmentation.py index 4df930e7c1..092e07474d 100644 --- a/tests/_tests_scripts/cv_z_segmentation.py +++ b/tests/_tests_scripts/cv_z_segmentation.py @@ -113,7 +113,7 @@ def get_loaders(transform): import torch import torch.nn as nn -from catalyst.dl.runner import SupervisedRunner +from catalyst.runner import SupervisedRunner # experiment setup num_epochs = 2 diff --git a/tests/_tests_scripts/dl_experiment.py b/tests/_tests_scripts/dl_experiment.py index b4e7ec1f1f..9c0fa90a19 100644 --- a/tests/_tests_scripts/dl_experiment.py +++ b/tests/_tests_scripts/dl_experiment.py @@ -1,2 +1 @@ # flake8: noqa -from catalyst.dl.experiment import * diff --git a/tests/_tests_scripts/dl_runner.py b/tests/_tests_scripts/dl_runner.py index 42e7c437d1..9c0fa90a19 100644 --- a/tests/_tests_scripts/dl_runner.py +++ b/tests/_tests_scripts/dl_runner.py @@ -1,2 +1 @@ # flake8: noqa -from catalyst.dl.runner import * diff --git a/tests/_tests_scripts/dl_z_classification.py b/tests/_tests_scripts/dl_z_classification.py index 6b0428dddb..6aba3f93eb 100644 --- a/tests/_tests_scripts/dl_z_classification.py +++ b/tests/_tests_scripts/dl_z_classification.py @@ -87,7 +87,7 @@ def forward(self, x): # In[ ]: -from catalyst.dl.runner import SupervisedRunner +from catalyst.runner import SupervisedRunner # experiment setup num_epochs = NUM_EPOCHS @@ -122,7 +122,7 @@ def forward(self, x): # In[ ]: -from catalyst.dl.runner import SupervisedRunner +from catalyst.runner import SupervisedRunner # experiment setup num_epochs = NUM_EPOCHS @@ -158,7 +158,7 @@ def forward(self, x): # In[ ]: -from catalyst.dl.runner import SupervisedRunner +from catalyst.runner import SupervisedRunner from catalyst.dl.callbacks import EarlyStoppingCallback # experiment setup @@ -197,7 +197,7 @@ def forward(self, x): # In[ ]: -from catalyst.dl.runner import SupervisedRunner +from catalyst.runner import SupervisedRunner from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback # experiment setup @@ -241,7 +241,7 @@ def forward(self, x): # In[ ]: -from catalyst.dl.runner import SupervisedRunner +from catalyst.runner import SupervisedRunner from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback from catalyst.contrib.nn.schedulers import OneCycleLRWithWarmup @@ -291,7 +291,7 @@ def forward(self, x): # In[ ]: -from catalyst.dl.runner import SupervisedRunner +from catalyst.runner import SupervisedRunner from catalyst.dl.callbacks import AccuracyCallback # experiment setup @@ -331,7 +331,7 @@ def forward(self, x): # In[ ]: -from catalyst.dl.runner import SupervisedRunner +from catalyst.runner import SupervisedRunner # experiment setup num_epochs = NUM_EPOCHS @@ -364,7 +364,7 @@ def forward(self, x): # In[ ]: -from catalyst.dl.runner import SupervisedRunner +from catalyst.runner import SupervisedRunner from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback # experiment setup From 4c9322aee86fc72b805b561d65bc0f4e32da7b6c Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Tue, 6 Oct 2020 10:09:44 +0300 Subject: [PATCH 03/30] one to many --- catalyst/contrib/{experiment => experiments}/__init__.py | 0 catalyst/contrib/{runner => runners}/__init__.py | 0 catalyst/{experiment => experiments}/__init__.py | 0 catalyst/{experiment => experiments}/config.py | 0 catalyst/{experiment => experiments}/experiment.py | 0 catalyst/{experiment => experiments}/supervised.py | 0 catalyst/{experiment => experiments}/tests/__init__.py | 0 catalyst/{experiment => experiments}/tests/test_config.py | 0 catalyst/{experiment => experiments}/tests/test_core.py | 0 catalyst/{experiment => experiments}/tests/test_supervised.py | 0 catalyst/{runner => runners}/__init__.py | 0 catalyst/{runner => runners}/runner.py | 0 catalyst/{runner => runners}/supervised.py | 0 13 files changed, 0 insertions(+), 0 deletions(-) rename catalyst/contrib/{experiment => experiments}/__init__.py (100%) rename catalyst/contrib/{runner => runners}/__init__.py (100%) rename catalyst/{experiment => experiments}/__init__.py (100%) rename catalyst/{experiment => experiments}/config.py (100%) rename catalyst/{experiment => experiments}/experiment.py (100%) rename catalyst/{experiment => experiments}/supervised.py (100%) rename catalyst/{experiment => experiments}/tests/__init__.py (100%) rename catalyst/{experiment => experiments}/tests/test_config.py (100%) rename catalyst/{experiment => experiments}/tests/test_core.py (100%) rename catalyst/{experiment => experiments}/tests/test_supervised.py (100%) rename catalyst/{runner => runners}/__init__.py (100%) rename catalyst/{runner => runners}/runner.py (100%) rename catalyst/{runner => runners}/supervised.py (100%) diff --git a/catalyst/contrib/experiment/__init__.py b/catalyst/contrib/experiments/__init__.py similarity index 100% rename from catalyst/contrib/experiment/__init__.py rename to catalyst/contrib/experiments/__init__.py diff --git a/catalyst/contrib/runner/__init__.py b/catalyst/contrib/runners/__init__.py similarity index 100% rename from catalyst/contrib/runner/__init__.py rename to catalyst/contrib/runners/__init__.py diff --git a/catalyst/experiment/__init__.py b/catalyst/experiments/__init__.py similarity index 100% rename from catalyst/experiment/__init__.py rename to catalyst/experiments/__init__.py diff --git a/catalyst/experiment/config.py b/catalyst/experiments/config.py similarity index 100% rename from catalyst/experiment/config.py rename to catalyst/experiments/config.py diff --git a/catalyst/experiment/experiment.py b/catalyst/experiments/experiment.py similarity index 100% rename from catalyst/experiment/experiment.py rename to catalyst/experiments/experiment.py diff --git a/catalyst/experiment/supervised.py b/catalyst/experiments/supervised.py similarity index 100% rename from catalyst/experiment/supervised.py rename to catalyst/experiments/supervised.py diff --git a/catalyst/experiment/tests/__init__.py b/catalyst/experiments/tests/__init__.py similarity index 100% rename from catalyst/experiment/tests/__init__.py rename to catalyst/experiments/tests/__init__.py diff --git a/catalyst/experiment/tests/test_config.py b/catalyst/experiments/tests/test_config.py similarity index 100% rename from catalyst/experiment/tests/test_config.py rename to catalyst/experiments/tests/test_config.py diff --git a/catalyst/experiment/tests/test_core.py b/catalyst/experiments/tests/test_core.py similarity index 100% rename from catalyst/experiment/tests/test_core.py rename to catalyst/experiments/tests/test_core.py diff --git a/catalyst/experiment/tests/test_supervised.py b/catalyst/experiments/tests/test_supervised.py similarity index 100% rename from catalyst/experiment/tests/test_supervised.py rename to catalyst/experiments/tests/test_supervised.py diff --git a/catalyst/runner/__init__.py b/catalyst/runners/__init__.py similarity index 100% rename from catalyst/runner/__init__.py rename to catalyst/runners/__init__.py diff --git a/catalyst/runner/runner.py b/catalyst/runners/runner.py similarity index 100% rename from catalyst/runner/runner.py rename to catalyst/runners/runner.py diff --git a/catalyst/runner/supervised.py b/catalyst/runners/supervised.py similarity index 100% rename from catalyst/runner/supervised.py rename to catalyst/runners/supervised.py From 19f29e5489a229b86a1e40f7f9b9f4ef393a8226 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Tue, 6 Oct 2020 10:25:04 +0300 Subject: [PATCH 04/30] nn --- .../contrib/{models/cv/classification => nn}/__init__.py | 0 catalyst/contrib/{ => nn}/criterion/__init__.py | 3 +-- catalyst/contrib/{ => nn}/criterion/ce.py | 0 catalyst/contrib/{ => nn}/criterion/circle.py | 0 catalyst/contrib/{ => nn}/criterion/contrastive.py | 0 catalyst/contrib/{ => nn}/criterion/dice.py | 0 catalyst/contrib/{ => nn}/criterion/focal.py | 0 catalyst/contrib/{ => nn}/criterion/functional.py | 0 catalyst/contrib/{ => nn}/criterion/gan.py | 0 catalyst/contrib/{ => nn}/criterion/huber.py | 0 catalyst/contrib/{ => nn}/criterion/iou.py | 0 catalyst/contrib/{ => nn}/criterion/lovasz.py | 0 catalyst/contrib/{ => nn}/criterion/margin.py | 0 catalyst/contrib/{ => nn}/criterion/triplet.py | 0 catalyst/contrib/{ => nn}/criterion/wing.py | 0 catalyst/contrib/{ => nn}/models/__init__.py | 0 catalyst/contrib/{ => nn}/models/cv/__init__.py | 0 .../encoders => nn/models/cv/classification}/__init__.py | 0 catalyst/contrib/{ => nn}/models/cv/encoders/__init__.py | 0 catalyst/contrib/{ => nn}/models/cv/encoders/resnet.py | 0 catalyst/contrib/{ => nn}/models/cv/segmentation/README.md | 0 .../contrib/{ => nn}/models/cv/segmentation/__init__.py | 0 catalyst/contrib/{ => nn}/models/cv/segmentation/abn.py | 0 .../{ => nn}/models/cv/segmentation/blocks/__init__.py | 6 +----- .../contrib/{ => nn}/models/cv/segmentation/blocks/core.py | 0 .../contrib/{ => nn}/models/cv/segmentation/blocks/fpn.py | 0 .../contrib/{ => nn}/models/cv/segmentation/blocks/psp.py | 0 .../contrib/{ => nn}/models/cv/segmentation/blocks/unet.py | 0 .../{ => nn}/models/cv/segmentation/bridge/__init__.py | 0 .../contrib/{ => nn}/models/cv/segmentation/bridge/core.py | 0 .../contrib/{ => nn}/models/cv/segmentation/bridge/unet.py | 0 catalyst/contrib/{ => nn}/models/cv/segmentation/core.py | 0 .../{ => nn}/models/cv/segmentation/decoder/__init__.py | 0 .../contrib/{ => nn}/models/cv/segmentation/decoder/core.py | 0 .../contrib/{ => nn}/models/cv/segmentation/decoder/fpn.py | 0 .../contrib/{ => nn}/models/cv/segmentation/decoder/psp.py | 0 .../contrib/{ => nn}/models/cv/segmentation/decoder/unet.py | 2 +- .../{ => nn}/models/cv/segmentation/encoder/__init__.py | 0 .../contrib/{ => nn}/models/cv/segmentation/encoder/core.py | 0 .../{ => nn}/models/cv/segmentation/encoder/resnet.py | 0 .../contrib/{ => nn}/models/cv/segmentation/encoder/unet.py | 2 +- catalyst/contrib/{ => nn}/models/cv/segmentation/fpn.py | 0 .../{ => nn}/models/cv/segmentation/head/__init__.py | 0 .../contrib/{ => nn}/models/cv/segmentation/head/core.py | 0 .../contrib/{ => nn}/models/cv/segmentation/head/fpn.py | 0 .../contrib/{ => nn}/models/cv/segmentation/head/unet.py | 0 catalyst/contrib/{ => nn}/models/cv/segmentation/linknet.py | 0 catalyst/contrib/{ => nn}/models/cv/segmentation/psp.py | 0 catalyst/contrib/{ => nn}/models/cv/segmentation/unet.py | 0 catalyst/contrib/{ => nn}/models/functional.py | 0 catalyst/contrib/{ => nn}/models/hydra.py | 0 catalyst/contrib/{ => nn}/models/nlp/__init__.py | 0 .../contrib/{ => nn}/models/nlp/classification/__init__.py | 0 catalyst/contrib/{ => nn}/models/nlp/classification/bert.py | 0 .../{models/tests => nn/models/nlp/encoders}/__init__.py | 0 catalyst/contrib/{ => nn}/models/sequential.py | 0 catalyst/contrib/{ => nn}/models/simple_conv.py | 0 catalyst/contrib/nn/models/tests/__init__.py | 0 catalyst/contrib/{ => nn}/models/tests/config3.yml | 0 catalyst/contrib/{ => nn}/models/tests/config4.yml | 0 catalyst/contrib/{ => nn}/models/tests/test_hydra.py | 0 catalyst/contrib/{ => nn}/modules/__init__.py | 0 catalyst/contrib/{ => nn}/modules/arcface.py | 0 catalyst/contrib/{ => nn}/modules/common.py | 0 catalyst/contrib/{ => nn}/modules/cosface.py | 0 catalyst/contrib/{ => nn}/modules/lama.py | 0 catalyst/contrib/{ => nn}/modules/pooling.py | 0 catalyst/contrib/{ => nn}/modules/rms_norm.py | 0 catalyst/contrib/{ => nn}/modules/se.py | 0 catalyst/contrib/{ => nn}/modules/softmax.py | 0 catalyst/contrib/{ => nn}/optimizers/__init__.py | 0 catalyst/contrib/{ => nn}/optimizers/adamp.py | 0 catalyst/contrib/{ => nn}/optimizers/lamb.py | 0 catalyst/contrib/{ => nn}/optimizers/lookahead.py | 0 catalyst/contrib/{ => nn}/optimizers/qhadamw.py | 0 catalyst/contrib/{ => nn}/optimizers/radam.py | 0 catalyst/contrib/{ => nn}/optimizers/ralamb.py | 0 catalyst/contrib/{ => nn}/optimizers/sgdp.py | 0 catalyst/contrib/{ => nn}/schedulers/__init__.py | 0 catalyst/contrib/{ => nn}/schedulers/base.py | 0 catalyst/contrib/{ => nn}/schedulers/onecycle.py | 0 81 files changed, 4 insertions(+), 9 deletions(-) rename catalyst/contrib/{models/cv/classification => nn}/__init__.py (100%) rename catalyst/contrib/{ => nn}/criterion/__init__.py (90%) rename catalyst/contrib/{ => nn}/criterion/ce.py (100%) rename catalyst/contrib/{ => nn}/criterion/circle.py (100%) rename catalyst/contrib/{ => nn}/criterion/contrastive.py (100%) rename catalyst/contrib/{ => nn}/criterion/dice.py (100%) rename catalyst/contrib/{ => nn}/criterion/focal.py (100%) rename catalyst/contrib/{ => nn}/criterion/functional.py (100%) rename catalyst/contrib/{ => nn}/criterion/gan.py (100%) rename catalyst/contrib/{ => nn}/criterion/huber.py (100%) rename catalyst/contrib/{ => nn}/criterion/iou.py (100%) rename catalyst/contrib/{ => nn}/criterion/lovasz.py (100%) rename catalyst/contrib/{ => nn}/criterion/margin.py (100%) rename catalyst/contrib/{ => nn}/criterion/triplet.py (100%) rename catalyst/contrib/{ => nn}/criterion/wing.py (100%) rename catalyst/contrib/{ => nn}/models/__init__.py (100%) rename catalyst/contrib/{ => nn}/models/cv/__init__.py (100%) rename catalyst/contrib/{models/nlp/encoders => nn/models/cv/classification}/__init__.py (100%) rename catalyst/contrib/{ => nn}/models/cv/encoders/__init__.py (100%) rename catalyst/contrib/{ => nn}/models/cv/encoders/resnet.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/README.md (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/__init__.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/abn.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/blocks/__init__.py (66%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/blocks/core.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/blocks/fpn.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/blocks/psp.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/blocks/unet.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/bridge/__init__.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/bridge/core.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/bridge/unet.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/core.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/decoder/__init__.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/decoder/core.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/decoder/fpn.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/decoder/psp.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/decoder/unet.py (97%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/encoder/__init__.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/encoder/core.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/encoder/resnet.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/encoder/unet.py (97%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/fpn.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/head/__init__.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/head/core.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/head/fpn.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/head/unet.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/linknet.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/psp.py (100%) rename catalyst/contrib/{ => nn}/models/cv/segmentation/unet.py (100%) rename catalyst/contrib/{ => nn}/models/functional.py (100%) rename catalyst/contrib/{ => nn}/models/hydra.py (100%) rename catalyst/contrib/{ => nn}/models/nlp/__init__.py (100%) rename catalyst/contrib/{ => nn}/models/nlp/classification/__init__.py (100%) rename catalyst/contrib/{ => nn}/models/nlp/classification/bert.py (100%) rename catalyst/contrib/{models/tests => nn/models/nlp/encoders}/__init__.py (100%) rename catalyst/contrib/{ => nn}/models/sequential.py (100%) rename catalyst/contrib/{ => nn}/models/simple_conv.py (100%) create mode 100644 catalyst/contrib/nn/models/tests/__init__.py rename catalyst/contrib/{ => nn}/models/tests/config3.yml (100%) rename catalyst/contrib/{ => nn}/models/tests/config4.yml (100%) rename catalyst/contrib/{ => nn}/models/tests/test_hydra.py (100%) rename catalyst/contrib/{ => nn}/modules/__init__.py (100%) rename catalyst/contrib/{ => nn}/modules/arcface.py (100%) rename catalyst/contrib/{ => nn}/modules/common.py (100%) rename catalyst/contrib/{ => nn}/modules/cosface.py (100%) rename catalyst/contrib/{ => nn}/modules/lama.py (100%) rename catalyst/contrib/{ => nn}/modules/pooling.py (100%) rename catalyst/contrib/{ => nn}/modules/rms_norm.py (100%) rename catalyst/contrib/{ => nn}/modules/se.py (100%) rename catalyst/contrib/{ => nn}/modules/softmax.py (100%) rename catalyst/contrib/{ => nn}/optimizers/__init__.py (100%) rename catalyst/contrib/{ => nn}/optimizers/adamp.py (100%) rename catalyst/contrib/{ => nn}/optimizers/lamb.py (100%) rename catalyst/contrib/{ => nn}/optimizers/lookahead.py (100%) rename catalyst/contrib/{ => nn}/optimizers/qhadamw.py (100%) rename catalyst/contrib/{ => nn}/optimizers/radam.py (100%) rename catalyst/contrib/{ => nn}/optimizers/ralamb.py (100%) rename catalyst/contrib/{ => nn}/optimizers/sgdp.py (100%) rename catalyst/contrib/{ => nn}/schedulers/__init__.py (100%) rename catalyst/contrib/{ => nn}/schedulers/base.py (100%) rename catalyst/contrib/{ => nn}/schedulers/onecycle.py (100%) diff --git a/catalyst/contrib/models/cv/classification/__init__.py b/catalyst/contrib/nn/__init__.py similarity index 100% rename from catalyst/contrib/models/cv/classification/__init__.py rename to catalyst/contrib/nn/__init__.py diff --git a/catalyst/contrib/criterion/__init__.py b/catalyst/contrib/nn/criterion/__init__.py similarity index 90% rename from catalyst/contrib/criterion/__init__.py rename to catalyst/contrib/nn/criterion/__init__.py index 044ec9b519..776c09b824 100644 --- a/catalyst/contrib/criterion/__init__.py +++ b/catalyst/contrib/nn/criterion/__init__.py @@ -1,6 +1,5 @@ # flake8: noqa -from torch.nn.modules.loss import * from catalyst.contrib.nn.criterion.circle import CircleLoss from catalyst.contrib.nn.criterion.contrastive import ( ContrastiveDistanceLoss, @@ -12,7 +11,7 @@ FocalLossBinary, FocalLossMultiClass, ) -from catalyst.contrib.criterion.gan import ( +from catalyst.contrib.nn.criterion.gan import ( GradientPenaltyLoss, MeanOutputLoss, ) diff --git a/catalyst/contrib/criterion/ce.py b/catalyst/contrib/nn/criterion/ce.py similarity index 100% rename from catalyst/contrib/criterion/ce.py rename to catalyst/contrib/nn/criterion/ce.py diff --git a/catalyst/contrib/criterion/circle.py b/catalyst/contrib/nn/criterion/circle.py similarity index 100% rename from catalyst/contrib/criterion/circle.py rename to catalyst/contrib/nn/criterion/circle.py diff --git a/catalyst/contrib/criterion/contrastive.py b/catalyst/contrib/nn/criterion/contrastive.py similarity index 100% rename from catalyst/contrib/criterion/contrastive.py rename to catalyst/contrib/nn/criterion/contrastive.py diff --git a/catalyst/contrib/criterion/dice.py b/catalyst/contrib/nn/criterion/dice.py similarity index 100% rename from catalyst/contrib/criterion/dice.py rename to catalyst/contrib/nn/criterion/dice.py diff --git a/catalyst/contrib/criterion/focal.py b/catalyst/contrib/nn/criterion/focal.py similarity index 100% rename from catalyst/contrib/criterion/focal.py rename to catalyst/contrib/nn/criterion/focal.py diff --git a/catalyst/contrib/criterion/functional.py b/catalyst/contrib/nn/criterion/functional.py similarity index 100% rename from catalyst/contrib/criterion/functional.py rename to catalyst/contrib/nn/criterion/functional.py diff --git a/catalyst/contrib/criterion/gan.py b/catalyst/contrib/nn/criterion/gan.py similarity index 100% rename from catalyst/contrib/criterion/gan.py rename to catalyst/contrib/nn/criterion/gan.py diff --git a/catalyst/contrib/criterion/huber.py b/catalyst/contrib/nn/criterion/huber.py similarity index 100% rename from catalyst/contrib/criterion/huber.py rename to catalyst/contrib/nn/criterion/huber.py diff --git a/catalyst/contrib/criterion/iou.py b/catalyst/contrib/nn/criterion/iou.py similarity index 100% rename from catalyst/contrib/criterion/iou.py rename to catalyst/contrib/nn/criterion/iou.py diff --git a/catalyst/contrib/criterion/lovasz.py b/catalyst/contrib/nn/criterion/lovasz.py similarity index 100% rename from catalyst/contrib/criterion/lovasz.py rename to catalyst/contrib/nn/criterion/lovasz.py diff --git a/catalyst/contrib/criterion/margin.py b/catalyst/contrib/nn/criterion/margin.py similarity index 100% rename from catalyst/contrib/criterion/margin.py rename to catalyst/contrib/nn/criterion/margin.py diff --git a/catalyst/contrib/criterion/triplet.py b/catalyst/contrib/nn/criterion/triplet.py similarity index 100% rename from catalyst/contrib/criterion/triplet.py rename to catalyst/contrib/nn/criterion/triplet.py diff --git a/catalyst/contrib/criterion/wing.py b/catalyst/contrib/nn/criterion/wing.py similarity index 100% rename from catalyst/contrib/criterion/wing.py rename to catalyst/contrib/nn/criterion/wing.py diff --git a/catalyst/contrib/models/__init__.py b/catalyst/contrib/nn/models/__init__.py similarity index 100% rename from catalyst/contrib/models/__init__.py rename to catalyst/contrib/nn/models/__init__.py diff --git a/catalyst/contrib/models/cv/__init__.py b/catalyst/contrib/nn/models/cv/__init__.py similarity index 100% rename from catalyst/contrib/models/cv/__init__.py rename to catalyst/contrib/nn/models/cv/__init__.py diff --git a/catalyst/contrib/models/nlp/encoders/__init__.py b/catalyst/contrib/nn/models/cv/classification/__init__.py similarity index 100% rename from catalyst/contrib/models/nlp/encoders/__init__.py rename to catalyst/contrib/nn/models/cv/classification/__init__.py diff --git a/catalyst/contrib/models/cv/encoders/__init__.py b/catalyst/contrib/nn/models/cv/encoders/__init__.py similarity index 100% rename from catalyst/contrib/models/cv/encoders/__init__.py rename to catalyst/contrib/nn/models/cv/encoders/__init__.py diff --git a/catalyst/contrib/models/cv/encoders/resnet.py b/catalyst/contrib/nn/models/cv/encoders/resnet.py similarity index 100% rename from catalyst/contrib/models/cv/encoders/resnet.py rename to catalyst/contrib/nn/models/cv/encoders/resnet.py diff --git a/catalyst/contrib/models/cv/segmentation/README.md b/catalyst/contrib/nn/models/cv/segmentation/README.md similarity index 100% rename from catalyst/contrib/models/cv/segmentation/README.md rename to catalyst/contrib/nn/models/cv/segmentation/README.md diff --git a/catalyst/contrib/models/cv/segmentation/__init__.py b/catalyst/contrib/nn/models/cv/segmentation/__init__.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/__init__.py rename to catalyst/contrib/nn/models/cv/segmentation/__init__.py diff --git a/catalyst/contrib/models/cv/segmentation/abn.py b/catalyst/contrib/nn/models/cv/segmentation/abn.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/abn.py rename to catalyst/contrib/nn/models/cv/segmentation/abn.py diff --git a/catalyst/contrib/models/cv/segmentation/blocks/__init__.py b/catalyst/contrib/nn/models/cv/segmentation/blocks/__init__.py similarity index 66% rename from catalyst/contrib/models/cv/segmentation/blocks/__init__.py rename to catalyst/contrib/nn/models/cv/segmentation/blocks/__init__.py index 7e1e1a4a27..a6cee31144 100644 --- a/catalyst/contrib/models/cv/segmentation/blocks/__init__.py +++ b/catalyst/contrib/nn/models/cv/segmentation/blocks/__init__.py @@ -1,8 +1,4 @@ # flake8: noqa -from catalyst.contrib.models.cv.segmentation.blocks.core import ( - EncoderBlock, - DecoderBlock, -) from catalyst.contrib.models.cv.segmentation.blocks.fpn import ( DecoderFPNBlock, Conv3x3GNReLU, @@ -12,7 +8,7 @@ PyramidBlock, PSPBlock, ) -from catalyst.contrib.models.cv.segmentation.blocks.unet import ( +from catalyst.contrib.nn.models.cv.segmentation.blocks.unet import ( EncoderDownsampleBlock, EncoderUpsampleBlock, DecoderConcatBlock, diff --git a/catalyst/contrib/models/cv/segmentation/blocks/core.py b/catalyst/contrib/nn/models/cv/segmentation/blocks/core.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/blocks/core.py rename to catalyst/contrib/nn/models/cv/segmentation/blocks/core.py diff --git a/catalyst/contrib/models/cv/segmentation/blocks/fpn.py b/catalyst/contrib/nn/models/cv/segmentation/blocks/fpn.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/blocks/fpn.py rename to catalyst/contrib/nn/models/cv/segmentation/blocks/fpn.py diff --git a/catalyst/contrib/models/cv/segmentation/blocks/psp.py b/catalyst/contrib/nn/models/cv/segmentation/blocks/psp.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/blocks/psp.py rename to catalyst/contrib/nn/models/cv/segmentation/blocks/psp.py diff --git a/catalyst/contrib/models/cv/segmentation/blocks/unet.py b/catalyst/contrib/nn/models/cv/segmentation/blocks/unet.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/blocks/unet.py rename to catalyst/contrib/nn/models/cv/segmentation/blocks/unet.py diff --git a/catalyst/contrib/models/cv/segmentation/bridge/__init__.py b/catalyst/contrib/nn/models/cv/segmentation/bridge/__init__.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/bridge/__init__.py rename to catalyst/contrib/nn/models/cv/segmentation/bridge/__init__.py diff --git a/catalyst/contrib/models/cv/segmentation/bridge/core.py b/catalyst/contrib/nn/models/cv/segmentation/bridge/core.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/bridge/core.py rename to catalyst/contrib/nn/models/cv/segmentation/bridge/core.py diff --git a/catalyst/contrib/models/cv/segmentation/bridge/unet.py b/catalyst/contrib/nn/models/cv/segmentation/bridge/unet.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/bridge/unet.py rename to catalyst/contrib/nn/models/cv/segmentation/bridge/unet.py diff --git a/catalyst/contrib/models/cv/segmentation/core.py b/catalyst/contrib/nn/models/cv/segmentation/core.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/core.py rename to catalyst/contrib/nn/models/cv/segmentation/core.py diff --git a/catalyst/contrib/models/cv/segmentation/decoder/__init__.py b/catalyst/contrib/nn/models/cv/segmentation/decoder/__init__.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/decoder/__init__.py rename to catalyst/contrib/nn/models/cv/segmentation/decoder/__init__.py diff --git a/catalyst/contrib/models/cv/segmentation/decoder/core.py b/catalyst/contrib/nn/models/cv/segmentation/decoder/core.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/decoder/core.py rename to catalyst/contrib/nn/models/cv/segmentation/decoder/core.py diff --git a/catalyst/contrib/models/cv/segmentation/decoder/fpn.py b/catalyst/contrib/nn/models/cv/segmentation/decoder/fpn.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/decoder/fpn.py rename to catalyst/contrib/nn/models/cv/segmentation/decoder/fpn.py diff --git a/catalyst/contrib/models/cv/segmentation/decoder/psp.py b/catalyst/contrib/nn/models/cv/segmentation/decoder/psp.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/decoder/psp.py rename to catalyst/contrib/nn/models/cv/segmentation/decoder/psp.py diff --git a/catalyst/contrib/models/cv/segmentation/decoder/unet.py b/catalyst/contrib/nn/models/cv/segmentation/decoder/unet.py similarity index 97% rename from catalyst/contrib/models/cv/segmentation/decoder/unet.py rename to catalyst/contrib/nn/models/cv/segmentation/decoder/unet.py index 470a41f5cf..8cca05ec71 100644 --- a/catalyst/contrib/models/cv/segmentation/decoder/unet.py +++ b/catalyst/contrib/nn/models/cv/segmentation/decoder/unet.py @@ -6,7 +6,7 @@ from torch import nn from catalyst.contrib.models.cv.segmentation.blocks.core import DecoderBlock -from catalyst.contrib.models.cv.segmentation.blocks.unet import ( +from catalyst.contrib.nn.models.cv.segmentation.blocks.unet import ( DecoderConcatBlock, ) from catalyst.contrib.models.cv.segmentation.decoder.core import DecoderSpec diff --git a/catalyst/contrib/models/cv/segmentation/encoder/__init__.py b/catalyst/contrib/nn/models/cv/segmentation/encoder/__init__.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/encoder/__init__.py rename to catalyst/contrib/nn/models/cv/segmentation/encoder/__init__.py diff --git a/catalyst/contrib/models/cv/segmentation/encoder/core.py b/catalyst/contrib/nn/models/cv/segmentation/encoder/core.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/encoder/core.py rename to catalyst/contrib/nn/models/cv/segmentation/encoder/core.py diff --git a/catalyst/contrib/models/cv/segmentation/encoder/resnet.py b/catalyst/contrib/nn/models/cv/segmentation/encoder/resnet.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/encoder/resnet.py rename to catalyst/contrib/nn/models/cv/segmentation/encoder/resnet.py diff --git a/catalyst/contrib/models/cv/segmentation/encoder/unet.py b/catalyst/contrib/nn/models/cv/segmentation/encoder/unet.py similarity index 97% rename from catalyst/contrib/models/cv/segmentation/encoder/unet.py rename to catalyst/contrib/nn/models/cv/segmentation/encoder/unet.py index 13b33c21f7..7959e8fb81 100644 --- a/catalyst/contrib/models/cv/segmentation/encoder/unet.py +++ b/catalyst/contrib/nn/models/cv/segmentation/encoder/unet.py @@ -5,7 +5,7 @@ import torch from torch import nn -from catalyst.contrib.models.cv.segmentation.blocks.unet import ( +from catalyst.contrib.nn.models.cv.segmentation.blocks.unet import ( EncoderDownsampleBlock, ) from catalyst.contrib.models.cv.segmentation.encoder.core import ( # noqa: WPS450, E501 diff --git a/catalyst/contrib/models/cv/segmentation/fpn.py b/catalyst/contrib/nn/models/cv/segmentation/fpn.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/fpn.py rename to catalyst/contrib/nn/models/cv/segmentation/fpn.py diff --git a/catalyst/contrib/models/cv/segmentation/head/__init__.py b/catalyst/contrib/nn/models/cv/segmentation/head/__init__.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/head/__init__.py rename to catalyst/contrib/nn/models/cv/segmentation/head/__init__.py diff --git a/catalyst/contrib/models/cv/segmentation/head/core.py b/catalyst/contrib/nn/models/cv/segmentation/head/core.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/head/core.py rename to catalyst/contrib/nn/models/cv/segmentation/head/core.py diff --git a/catalyst/contrib/models/cv/segmentation/head/fpn.py b/catalyst/contrib/nn/models/cv/segmentation/head/fpn.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/head/fpn.py rename to catalyst/contrib/nn/models/cv/segmentation/head/fpn.py diff --git a/catalyst/contrib/models/cv/segmentation/head/unet.py b/catalyst/contrib/nn/models/cv/segmentation/head/unet.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/head/unet.py rename to catalyst/contrib/nn/models/cv/segmentation/head/unet.py diff --git a/catalyst/contrib/models/cv/segmentation/linknet.py b/catalyst/contrib/nn/models/cv/segmentation/linknet.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/linknet.py rename to catalyst/contrib/nn/models/cv/segmentation/linknet.py diff --git a/catalyst/contrib/models/cv/segmentation/psp.py b/catalyst/contrib/nn/models/cv/segmentation/psp.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/psp.py rename to catalyst/contrib/nn/models/cv/segmentation/psp.py diff --git a/catalyst/contrib/models/cv/segmentation/unet.py b/catalyst/contrib/nn/models/cv/segmentation/unet.py similarity index 100% rename from catalyst/contrib/models/cv/segmentation/unet.py rename to catalyst/contrib/nn/models/cv/segmentation/unet.py diff --git a/catalyst/contrib/models/functional.py b/catalyst/contrib/nn/models/functional.py similarity index 100% rename from catalyst/contrib/models/functional.py rename to catalyst/contrib/nn/models/functional.py diff --git a/catalyst/contrib/models/hydra.py b/catalyst/contrib/nn/models/hydra.py similarity index 100% rename from catalyst/contrib/models/hydra.py rename to catalyst/contrib/nn/models/hydra.py diff --git a/catalyst/contrib/models/nlp/__init__.py b/catalyst/contrib/nn/models/nlp/__init__.py similarity index 100% rename from catalyst/contrib/models/nlp/__init__.py rename to catalyst/contrib/nn/models/nlp/__init__.py diff --git a/catalyst/contrib/models/nlp/classification/__init__.py b/catalyst/contrib/nn/models/nlp/classification/__init__.py similarity index 100% rename from catalyst/contrib/models/nlp/classification/__init__.py rename to catalyst/contrib/nn/models/nlp/classification/__init__.py diff --git a/catalyst/contrib/models/nlp/classification/bert.py b/catalyst/contrib/nn/models/nlp/classification/bert.py similarity index 100% rename from catalyst/contrib/models/nlp/classification/bert.py rename to catalyst/contrib/nn/models/nlp/classification/bert.py diff --git a/catalyst/contrib/models/tests/__init__.py b/catalyst/contrib/nn/models/nlp/encoders/__init__.py similarity index 100% rename from catalyst/contrib/models/tests/__init__.py rename to catalyst/contrib/nn/models/nlp/encoders/__init__.py diff --git a/catalyst/contrib/models/sequential.py b/catalyst/contrib/nn/models/sequential.py similarity index 100% rename from catalyst/contrib/models/sequential.py rename to catalyst/contrib/nn/models/sequential.py diff --git a/catalyst/contrib/models/simple_conv.py b/catalyst/contrib/nn/models/simple_conv.py similarity index 100% rename from catalyst/contrib/models/simple_conv.py rename to catalyst/contrib/nn/models/simple_conv.py diff --git a/catalyst/contrib/nn/models/tests/__init__.py b/catalyst/contrib/nn/models/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/catalyst/contrib/models/tests/config3.yml b/catalyst/contrib/nn/models/tests/config3.yml similarity index 100% rename from catalyst/contrib/models/tests/config3.yml rename to catalyst/contrib/nn/models/tests/config3.yml diff --git a/catalyst/contrib/models/tests/config4.yml b/catalyst/contrib/nn/models/tests/config4.yml similarity index 100% rename from catalyst/contrib/models/tests/config4.yml rename to catalyst/contrib/nn/models/tests/config4.yml diff --git a/catalyst/contrib/models/tests/test_hydra.py b/catalyst/contrib/nn/models/tests/test_hydra.py similarity index 100% rename from catalyst/contrib/models/tests/test_hydra.py rename to catalyst/contrib/nn/models/tests/test_hydra.py diff --git a/catalyst/contrib/modules/__init__.py b/catalyst/contrib/nn/modules/__init__.py similarity index 100% rename from catalyst/contrib/modules/__init__.py rename to catalyst/contrib/nn/modules/__init__.py diff --git a/catalyst/contrib/modules/arcface.py b/catalyst/contrib/nn/modules/arcface.py similarity index 100% rename from catalyst/contrib/modules/arcface.py rename to catalyst/contrib/nn/modules/arcface.py diff --git a/catalyst/contrib/modules/common.py b/catalyst/contrib/nn/modules/common.py similarity index 100% rename from catalyst/contrib/modules/common.py rename to catalyst/contrib/nn/modules/common.py diff --git a/catalyst/contrib/modules/cosface.py b/catalyst/contrib/nn/modules/cosface.py similarity index 100% rename from catalyst/contrib/modules/cosface.py rename to catalyst/contrib/nn/modules/cosface.py diff --git a/catalyst/contrib/modules/lama.py b/catalyst/contrib/nn/modules/lama.py similarity index 100% rename from catalyst/contrib/modules/lama.py rename to catalyst/contrib/nn/modules/lama.py diff --git a/catalyst/contrib/modules/pooling.py b/catalyst/contrib/nn/modules/pooling.py similarity index 100% rename from catalyst/contrib/modules/pooling.py rename to catalyst/contrib/nn/modules/pooling.py diff --git a/catalyst/contrib/modules/rms_norm.py b/catalyst/contrib/nn/modules/rms_norm.py similarity index 100% rename from catalyst/contrib/modules/rms_norm.py rename to catalyst/contrib/nn/modules/rms_norm.py diff --git a/catalyst/contrib/modules/se.py b/catalyst/contrib/nn/modules/se.py similarity index 100% rename from catalyst/contrib/modules/se.py rename to catalyst/contrib/nn/modules/se.py diff --git a/catalyst/contrib/modules/softmax.py b/catalyst/contrib/nn/modules/softmax.py similarity index 100% rename from catalyst/contrib/modules/softmax.py rename to catalyst/contrib/nn/modules/softmax.py diff --git a/catalyst/contrib/optimizers/__init__.py b/catalyst/contrib/nn/optimizers/__init__.py similarity index 100% rename from catalyst/contrib/optimizers/__init__.py rename to catalyst/contrib/nn/optimizers/__init__.py diff --git a/catalyst/contrib/optimizers/adamp.py b/catalyst/contrib/nn/optimizers/adamp.py similarity index 100% rename from catalyst/contrib/optimizers/adamp.py rename to catalyst/contrib/nn/optimizers/adamp.py diff --git a/catalyst/contrib/optimizers/lamb.py b/catalyst/contrib/nn/optimizers/lamb.py similarity index 100% rename from catalyst/contrib/optimizers/lamb.py rename to catalyst/contrib/nn/optimizers/lamb.py diff --git a/catalyst/contrib/optimizers/lookahead.py b/catalyst/contrib/nn/optimizers/lookahead.py similarity index 100% rename from catalyst/contrib/optimizers/lookahead.py rename to catalyst/contrib/nn/optimizers/lookahead.py diff --git a/catalyst/contrib/optimizers/qhadamw.py b/catalyst/contrib/nn/optimizers/qhadamw.py similarity index 100% rename from catalyst/contrib/optimizers/qhadamw.py rename to catalyst/contrib/nn/optimizers/qhadamw.py diff --git a/catalyst/contrib/optimizers/radam.py b/catalyst/contrib/nn/optimizers/radam.py similarity index 100% rename from catalyst/contrib/optimizers/radam.py rename to catalyst/contrib/nn/optimizers/radam.py diff --git a/catalyst/contrib/optimizers/ralamb.py b/catalyst/contrib/nn/optimizers/ralamb.py similarity index 100% rename from catalyst/contrib/optimizers/ralamb.py rename to catalyst/contrib/nn/optimizers/ralamb.py diff --git a/catalyst/contrib/optimizers/sgdp.py b/catalyst/contrib/nn/optimizers/sgdp.py similarity index 100% rename from catalyst/contrib/optimizers/sgdp.py rename to catalyst/contrib/nn/optimizers/sgdp.py diff --git a/catalyst/contrib/schedulers/__init__.py b/catalyst/contrib/nn/schedulers/__init__.py similarity index 100% rename from catalyst/contrib/schedulers/__init__.py rename to catalyst/contrib/nn/schedulers/__init__.py diff --git a/catalyst/contrib/schedulers/base.py b/catalyst/contrib/nn/schedulers/base.py similarity index 100% rename from catalyst/contrib/schedulers/base.py rename to catalyst/contrib/nn/schedulers/base.py diff --git a/catalyst/contrib/schedulers/onecycle.py b/catalyst/contrib/nn/schedulers/onecycle.py similarity index 100% rename from catalyst/contrib/schedulers/onecycle.py rename to catalyst/contrib/nn/schedulers/onecycle.py From 10c33e2ac80d228370568d32ac99dd1479c3aae3 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 12:15:27 +0300 Subject: [PATCH 05/30] imports --- bin/tests/check_core_settings.sh | 8 +- catalyst/callbacks/checkpoint.py | 35 +++++---- catalyst/callbacks/control_flow.py | 4 +- catalyst/callbacks/criterion.py | 2 +- catalyst/callbacks/exception.py | 4 +- catalyst/callbacks/formatters.py | 7 +- catalyst/callbacks/logging.py | 11 +-- catalyst/callbacks/meter.py | 5 +- catalyst/callbacks/{metrics.py => metric.py} | 15 ++-- catalyst/callbacks/metrics/__init__.py | 7 -- catalyst/callbacks/optimizer.py | 13 ++-- catalyst/callbacks/pruning.py | 5 +- catalyst/callbacks/quantization.py | 4 +- catalyst/callbacks/scheduler.py | 7 +- .../callbacks/tests/test_wrapper_callback.py | 6 +- catalyst/callbacks/tracing.py | 5 +- catalyst/contrib/__main__.py | 4 +- catalyst/contrib/callbacks/__init__.py | 18 ++--- .../callbacks/confusion_matrix.py | 16 ++-- catalyst/{ => contrib}/callbacks/inference.py | 0 catalyst/{ => contrib}/callbacks/mixup.py | 4 +- catalyst/contrib/callbacks/telegram_logger.py | 6 +- catalyst/contrib/datasets/__init__.py | 4 +- catalyst/contrib/nn/models/__init__.py | 14 ++-- .../nn/models/cv/segmentation/decoder/unet.py | 2 +- .../nn/models/cv/segmentation/encoder/unet.py | 6 +- catalyst/contrib/utils/__init__.py | 4 +- catalyst/contrib/utils/compression.py | 10 +-- catalyst/contrib/utils/cv/__init__.py | 4 +- catalyst/contrib/utils/cv/image.py | 6 +- catalyst/contrib/utils/nlp/__init__.py | 4 +- catalyst/contrib/utils/serialization.py | 6 +- catalyst/core/__init__.py | 6 +- catalyst/core/callback.py | 6 +- catalyst/core/legacy.py | 3 + catalyst/core/runner.py | 66 ++++++++-------- catalyst/data/__main__.py | 6 +- catalyst/data/cv/__init__.py | 4 +- catalyst/data/cv/dataset.py | 8 +- catalyst/data/cv/reader.py | 8 +- catalyst/data/cv/transforms/albumentations.py | 4 +- catalyst/data/dataset/torch.py | 2 +- catalyst/data/nlp/__init__.py | 4 +- catalyst/data/reader.py | 2 +- catalyst/data/sampler.py | 2 +- catalyst/data/scripts/project_embeddings.py | 4 +- catalyst/data/utils.py | 2 - catalyst/dl/__init__.py | 5 +- catalyst/dl/scripts/init.py | 7 +- catalyst/dl/scripts/run.py | 50 +++++++------ catalyst/dl/scripts/trace.py | 5 +- catalyst/dl/scripts/tune.py | 56 +++++++------- catalyst/experiments/__init__.py | 4 +- catalyst/experiments/config.py | 75 ++++++++++--------- catalyst/experiments/experiment.py | 39 +++++----- catalyst/experiments/supervised.py | 14 ++-- catalyst/registry/registries.py | 12 +-- catalyst/runners/__init__.py | 3 +- catalyst/runners/runner.py | 47 +++++++----- catalyst/runners/supervised.py | 4 +- catalyst/settings.py | 12 ++- catalyst/tools/time_manager.py | 2 +- catalyst/utils/__init__.py | 35 +++++++-- catalyst/utils/callbacks.py | 7 +- catalyst/utils/checkpoint.py | 1 - catalyst/utils/distributed.py | 55 -------------- catalyst/utils/loader.py | 0 catalyst/utils/loaders.py | 11 +-- catalyst/utils/parser.py | 1 - catalyst/utils/quantization.py | 4 +- catalyst/utils/tracing.py | 34 ++++----- catalyst/utils/wizard.py | 4 +- 72 files changed, 440 insertions(+), 420 deletions(-) rename catalyst/callbacks/{metrics.py => metric.py} (97%) rename catalyst/{ => contrib}/callbacks/confusion_matrix.py (92%) rename catalyst/{ => contrib}/callbacks/inference.py (100%) rename catalyst/{ => contrib}/callbacks/mixup.py (96%) delete mode 100644 catalyst/utils/loader.py diff --git a/bin/tests/check_core_settings.sh b/bin/tests/check_core_settings.sh index 7fef42b0f5..3b9666f8f1 100644 --- a/bin/tests/check_core_settings.sh +++ b/bin/tests/check_core_settings.sh @@ -45,9 +45,9 @@ EOT # check if fail if requirements not installed python -c """ -from catalyst.tools import settings +from catalyst.settings import SETTINGS -assert settings.use_lz4 == False and settings.use_pyarrow == False +assert SETTINGS.use_lz4 == False and SETTINGS.use_pyarrow == False try: from catalyst.contrib.dl.callbacks import AlchemyLogger, VisdomLogger @@ -77,9 +77,9 @@ EOT # check if fail if requirements not installed python -c """ -from catalyst.tools import settings +from catalyst.settings import SETTINGS -assert settings.use_libjpeg_turbo == False +assert SETTINGS.use_libjpeg_turbo == False try: from catalyst.contrib.data import cv as cv_data diff --git a/catalyst/callbacks/checkpoint.py b/catalyst/callbacks/checkpoint.py index 922d6bb8ba..2758be7c6c 100644 --- a/catalyst/callbacks/checkpoint.py +++ b/catalyst/callbacks/checkpoint.py @@ -3,13 +3,20 @@ import os from pathlib import Path -from catalyst.core import utils from catalyst.core.callback import Callback, CallbackNode, CallbackOrder from catalyst.core.runner import IRunner +from catalyst.utils.checkpoint import ( + load_checkpoint, + pack_checkpoint, + save_checkpoint, + unpack_checkpoint, +) +from catalyst.utils.config import save_config +from catalyst.utils.misc import is_exception def _pack_runner(runner: IRunner): - checkpoint = utils.pack_checkpoint( + checkpoint = pack_checkpoint( model=runner.model, criterion=runner.criterion, optimizer=runner.optimizer, @@ -54,7 +61,7 @@ def _load_checkpoint( raise FileNotFoundError(f"No checkpoint found at {filename}!") print(f"=> Loading checkpoint {filename}") - checkpoint = utils.load_checkpoint(filename) + checkpoint = load_checkpoint(filename) if not runner.stage_name.startswith("infer") and load_full: runner.stage_name = checkpoint["stage_name"] @@ -65,7 +72,7 @@ def _load_checkpoint( # epoch_metrics, valid_metrics ? if load_full: - utils.unpack_checkpoint( + unpack_checkpoint( checkpoint, model=runner.model, criterion=runner.criterion, @@ -80,7 +87,7 @@ def _load_checkpoint( f"stage {checkpoint['stage_name']})" ) else: - utils.unpack_checkpoint( + unpack_checkpoint( checkpoint, model=runner.model, ) @@ -167,9 +174,9 @@ def _load_states_from_file_map( # extracting parts from files for filename, parts_to_load in required_files.items(): print(f"=> Loading {', '.join(parts_to_load)} from {filename}") - checkpoint = utils.load_checkpoint(filename) + checkpoint = load_checkpoint(filename) to_unpack = {part: getattr(runner, part) for part in parts_to_load} - utils.unpack_checkpoint(checkpoint, **to_unpack) + unpack_checkpoint(checkpoint, **to_unpack) print(f" loaded: {', '.join(parts_to_load)}") @@ -200,9 +207,7 @@ def _get_checkpoint_suffix(self, checkpoint: dict) -> str: return "checkpoint" def _save_metric(self, logdir: Union[str, Path], metrics: Dict) -> None: - utils.save_config( - metrics, f"{logdir}/checkpoints/{self.metrics_filename}" - ) + save_config(metrics, f"{logdir}/checkpoints/{self.metrics_filename}") def on_exception(self, runner: IRunner): """ @@ -213,7 +218,7 @@ def on_exception(self, runner: IRunner): """ exception = runner.exception - if not utils.is_exception(exception): + if not is_exception(exception): return if runner.device.type == "xla": @@ -225,7 +230,7 @@ def on_exception(self, runner: IRunner): checkpoint = _pack_runner(runner) suffix = self._get_checkpoint_suffix(checkpoint) suffix = f"{suffix}.exception_{exception.__class__.__name__}" - utils.save_checkpoint( + save_checkpoint( logdir=Path(f"{runner.logdir}/checkpoints/"), checkpoint=checkpoint, suffix=suffix, @@ -452,7 +457,7 @@ def _save_checkpoint( if true then will be saved two additional checkpoints - ``last`` and ``last_full``. """ - full_checkpoint_path = utils.save_checkpoint( + full_checkpoint_path = save_checkpoint( logdir=Path(f"{logdir}/checkpoints/"), checkpoint=checkpoint, suffix=f"{suffix}_full", @@ -462,7 +467,7 @@ def _save_checkpoint( saver_fn=self._save_fn, ) exclude = ["criterion", "optimizer", "scheduler"] - checkpoint_path = utils.save_checkpoint( + checkpoint_path = save_checkpoint( checkpoint={ key: value for key, value in checkpoint.items() @@ -791,7 +796,7 @@ def process_checkpoint( checkpoint: dict with checkpoint data batch_metrics: dict with metrics based on a few batches """ - filepath = utils.save_checkpoint( + filepath = save_checkpoint( logdir=Path(f"{logdir}/checkpoints/"), checkpoint=checkpoint, suffix=self._get_checkpoint_suffix(checkpoint), diff --git a/catalyst/callbacks/control_flow.py b/catalyst/callbacks/control_flow.py index 5edb52ef68..bce7d30a1d 100644 --- a/catalyst/callbacks/control_flow.py +++ b/catalyst/callbacks/control_flow.py @@ -1,7 +1,7 @@ from typing import Callable, Mapping, Sequence, Union from collections import OrderedDict -from catalyst.core.callback import Callback, WrapperCallback +from catalyst.core.callback import Callback, CallbackWrapper from catalyst.core.runner import IRunner LOADERS = Union[str, Sequence[str], Mapping[str, Union[int, Sequence[int]]]] @@ -151,7 +151,7 @@ def _filter_fn_from_arg(filter_fn: Union[str, FILTER_FN]) -> FILTER_FN: return filter_fn -class ControlFlowCallback(WrapperCallback): +class ControlFlowCallback(CallbackWrapper): """Enable/disable callback execution on different stages, loaders and epochs. diff --git a/catalyst/callbacks/criterion.py b/catalyst/callbacks/criterion.py index bf1feafbc1..3b97ede75d 100644 --- a/catalyst/callbacks/criterion.py +++ b/catalyst/callbacks/criterion.py @@ -1,6 +1,6 @@ from typing import Dict, List, Union -from catalyst.core.callbacks.metrics import IBatchMetricCallback +from catalyst.callbacks.metric import IBatchMetricCallback from catalyst.core.runner import IRunner diff --git a/catalyst/callbacks/exception.py b/catalyst/callbacks/exception.py index 8ecd4ee69a..ee1976bb9a 100644 --- a/catalyst/callbacks/exception.py +++ b/catalyst/callbacks/exception.py @@ -1,6 +1,6 @@ -from catalyst.core import utils from catalyst.core.callback import Callback, CallbackNode, CallbackOrder from catalyst.core.runner import IRunner +from catalyst.utils.misc import is_exception class ExceptionCallback(Callback): @@ -22,7 +22,7 @@ def on_exception(self, runner: IRunner) -> None: Exception """ exception = runner.exception - if not utils.is_exception(exception): + if not is_exception(exception): return if runner.need_exception_reraise: diff --git a/catalyst/callbacks/formatters.py b/catalyst/callbacks/formatters.py index 8066f00e21..363ae23941 100644 --- a/catalyst/callbacks/formatters.py +++ b/catalyst/callbacks/formatters.py @@ -2,8 +2,9 @@ from abc import ABC, abstractmethod import logging -from catalyst.core import utils from catalyst.core.runner import IRunner +from catalyst.utils.dict import split_dict_to_subdicts +from catalyst.utils.misc import format_metric class MetricsFormatter(ABC, logging.Formatter): @@ -52,7 +53,7 @@ def _format_metrics(self, metrics: Dict[str, Dict[str, float]]): metrics_formatted = {} for key, value in metrics.items(): metrics_formatted_part = [ - utils.format_metric(m_name, m_value) + format_metric(m_name, m_value) for m_name, m_value in sorted(value.items()) ] metrics_formatted_part = " | ".join(metrics_formatted_part) @@ -62,7 +63,7 @@ def _format_metrics(self, metrics: Dict[str, Dict[str, float]]): def _format_message(self, runner: IRunner): message = [""] - mode_metrics = utils.split_dict_to_subdicts( + mode_metrics = split_dict_to_subdicts( dct=runner.epoch_metrics, prefixes=list(runner.loaders.keys()), extra_key="_base", diff --git a/catalyst/callbacks/logging.py b/catalyst/callbacks/logging.py index 22cd0e8655..0ec7ec510d 100644 --- a/catalyst/callbacks/logging.py +++ b/catalyst/callbacks/logging.py @@ -5,11 +5,12 @@ from tqdm import tqdm +from catalyst.callbacks.formatters import TxtMetricsFormatter from catalyst.contrib.tools.tensorboard import SummaryWriter -from catalyst.core import utils from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.callbacks import formatters from catalyst.core.runner import IRunner +from catalyst.utils.dict import split_dict_to_subdicts +from catalyst.utils.misc import is_exception class ILoggerCallback(Callback): @@ -93,7 +94,7 @@ def on_loader_end(self, runner: IRunner): def on_exception(self, runner: IRunner): """Called if an Exception was raised.""" exception = runner.exception - if not utils.is_exception(exception): + if not is_exception(exception): return if isinstance(exception, KeyboardInterrupt): @@ -123,7 +124,7 @@ def _setup_logger(logger, logdir: str): ch = logging.StreamHandler(sys.stdout) ch.setLevel(logging.INFO) - txt_formatter = formatters.TxtMetricsFormatter() + txt_formatter = TxtMetricsFormatter() ch.setFormatter(txt_formatter) # add the handlers to the logger @@ -244,7 +245,7 @@ def on_epoch_end(self, runner: IRunner): return if self.log_on_epoch_end: - per_mode_metrics = utils.split_dict_to_subdicts( + per_mode_metrics = split_dict_to_subdicts( dct=runner.epoch_metrics, prefixes=list(runner.loaders.keys()), extra_key="_base", diff --git a/catalyst/callbacks/meter.py b/catalyst/callbacks/meter.py index cebf72be85..dcca9f5b95 100644 --- a/catalyst/callbacks/meter.py +++ b/catalyst/callbacks/meter.py @@ -3,8 +3,9 @@ import numpy as np -from catalyst.core import Callback, CallbackOrder, IRunner -from catalyst.dl.utils import get_activation_fn +from catalyst.core.callback import Callback, CallbackOrder +from catalyst.core.runner import IRunner +from catalyst.utils.torch import get_activation_fn class MeterMetricsCallback(Callback): diff --git a/catalyst/callbacks/metrics.py b/catalyst/callbacks/metric.py similarity index 97% rename from catalyst/callbacks/metrics.py rename to catalyst/callbacks/metric.py index 0fd46df5ff..dea09670fe 100644 --- a/catalyst/callbacks/metrics.py +++ b/catalyst/callbacks/metric.py @@ -7,10 +7,11 @@ import torch -from catalyst.core import utils from catalyst.core.callback import Callback, CallbackNode, CallbackOrder from catalyst.core.runner import IRunner -from catalyst.tools import meters +from catalyst.tools.meters.averagevaluemeter import AverageValueMeter +from catalyst.utils.dict import get_dictkey_auto_fn +from catalyst.utils.distributed import get_distributed_mean logger = logging.getLogger(__name__) @@ -45,8 +46,8 @@ def __init__( self.multiplier = multiplier self.metrics_kwargs = metrics_kwargs - self._get_input = utils.get_dictkey_auto_fn(self.input_key) - self._get_output = utils.get_dictkey_auto_fn(self.output_key) + self._get_input = get_dictkey_auto_fn(self.input_key) + self._get_output = get_dictkey_auto_fn(self.output_key) kv_types = (dict, tuple, list, type(None)) @@ -423,7 +424,7 @@ def __init__(self): super().__init__( order=CallbackOrder.logging - 1, node=CallbackNode.all, ) - self.meters: Dict[str, meters.AverageValueMeter] = None + self.meters: Dict[str, AverageValueMeter] = None @staticmethod def to_single_value(value: Any) -> float: @@ -445,7 +446,7 @@ def to_single_value(value: Any) -> float: def _process_metrics(metrics: Dict[str, Any]): output = {} for key, value in metrics.items(): - value = utils.get_distributed_mean(value) + value = get_distributed_mean(value) value = MetricManagerCallback.to_single_value(value) output[key] = value return output @@ -465,7 +466,7 @@ def on_loader_start(self, runner: IRunner) -> None: runner: current runner """ runner.loader_metrics = defaultdict(None) - self.meters = defaultdict(meters.AverageValueMeter) + self.meters = defaultdict(AverageValueMeter) def on_batch_start(self, runner: IRunner) -> None: """Batch start hook. diff --git a/catalyst/callbacks/metrics/__init__.py b/catalyst/callbacks/metrics/__init__.py index 1c095e0410..9c0fa90a19 100644 --- a/catalyst/callbacks/metrics/__init__.py +++ b/catalyst/callbacks/metrics/__init__.py @@ -1,8 +1 @@ # flake8: noqa - -from catalyst.callbacks.metrics import ( - AccuracyCallback, - MultiLabelAccuracyCallback, -) -from catalyst.callbacks.metrics import CMCScoreCallback -from catalyst.callbacks.metrics import PrecisionRecallF1ScoreCallback diff --git a/catalyst/callbacks/optimizer.py b/catalyst/callbacks/optimizer.py index 83ca0f1a87..8545df90c5 100644 --- a/catalyst/callbacks/optimizer.py +++ b/catalyst/callbacks/optimizer.py @@ -5,10 +5,11 @@ import torch from catalyst import registry -from catalyst.core import utils from catalyst.core.callback import Callback, CallbackNode, CallbackOrder from catalyst.core.runner import IRunner from catalyst.typing import Optimizer +from catalyst.utils.misc import maybe_recursive_call +from catalyst.utils.torch import get_optimizer_momentum logger = logging.getLogger(__name__) @@ -215,9 +216,9 @@ def on_batch_end(self, runner: IRunner) -> None: grad_clip_fn=self.grad_clip_fn, ) if not self.use_fast_zero_grad: - utils.maybe_recursive_call(self._optimizer, "zero_grad") + maybe_recursive_call(self._optimizer, "zero_grad") else: - utils.maybe_recursive_call(self._optimizer, zero_grad) + maybe_recursive_call(self._optimizer, zero_grad) self._accumulation_counter = 0 def on_epoch_end(self, runner: IRunner) -> None: @@ -238,7 +239,7 @@ def on_epoch_end(self, runner: IRunner) -> None: ) runner.epoch_metrics[lr_name] = lr - momentum = utils.get_optimizer_momentum(self._optimizer) + momentum = get_optimizer_momentum(self._optimizer) if momentum is not None: momentum_name = ( f"momentum/{self.optimizer_key}" @@ -368,7 +369,7 @@ def on_batch_end(self, runner: IRunner) -> None: optimizer=self._optimizer, grad_clip_fn=self.grad_clip_fn, ) - utils.maybe_recursive_call(self._optimizer, "zero_grad") + maybe_recursive_call(self._optimizer, "zero_grad") self._accumulation_counter = 0 def on_epoch_end(self, runner: IRunner) -> None: @@ -385,7 +386,7 @@ def on_epoch_end(self, runner: IRunner) -> None: ) runner.epoch_metrics[lr_name] = lr - momentum = utils.get_optimizer_momentum(self._optimizer) + momentum = get_optimizer_momentum(self._optimizer) if momentum is not None: momentum_name = ( f"momentum/{self.optimizer_key}" diff --git a/catalyst/callbacks/pruning.py b/catalyst/callbacks/pruning.py index 71c38bb3ba..a6658cda56 100644 --- a/catalyst/callbacks/pruning.py +++ b/catalyst/callbacks/pruning.py @@ -3,8 +3,9 @@ from torch.nn.utils import prune -from catalyst.core import Callback, CallbackOrder, IRunner -from catalyst.utils import prune_model, remove_reparametrization +from catalyst.core.callback import Callback, CallbackOrder +from catalyst.core.runner import IRunner +from catalyst.utils.pruning import prune_model, remove_reparametrization PRUNING_FN = { # noqa: WPS407 "l1_unstructured": prune.l1_unstructured, diff --git a/catalyst/callbacks/quantization.py b/catalyst/callbacks/quantization.py index 29cd4ec53c..e73608f323 100644 --- a/catalyst/callbacks/quantization.py +++ b/catalyst/callbacks/quantization.py @@ -4,9 +4,9 @@ import torch from torch import quantization -from catalyst.core import IRunner from catalyst.core.callback import Callback, CallbackOrder -from catalyst.dl.utils import save_quantized_model +from catalyst.core.runner import IRunner +from catalyst.utils.quantization import save_quantized_model class DynamicQuantizationCallback(Callback): diff --git a/catalyst/callbacks/scheduler.py b/catalyst/callbacks/scheduler.py index 77970ff60f..fbfd1d4aff 100644 --- a/catalyst/callbacks/scheduler.py +++ b/catalyst/callbacks/scheduler.py @@ -4,10 +4,9 @@ import torch from catalyst.contrib.nn.schedulers import BatchScheduler, OneCycleLRWithWarmup -from catalyst.core import IRunner, utils from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.callbacks import LRUpdater from catalyst.core.runner import IRunner +from catalyst.utils.torch import get_optimizer_momentum class ISchedulerCallback(Callback): @@ -119,7 +118,7 @@ def _scheduler_step( scheduler.step() lr = scheduler.get_lr()[0] - momentum = utils.get_optimizer_momentum(scheduler.optimizer) + momentum = get_optimizer_momentum(scheduler.optimizer) return lr, momentum @@ -271,7 +270,7 @@ def _update_optimizer(self, optimizer) -> Tuple[float, float]: if new_momentum is not None: self._update_momentum(optimizer, new_momentum) else: - new_momentum = utils.get_optimizer_momentum(optimizer) + new_momentum = get_optimizer_momentum(optimizer) return new_lr, new_momentum diff --git a/catalyst/callbacks/tests/test_wrapper_callback.py b/catalyst/callbacks/tests/test_wrapper_callback.py index ee235672c0..02614d77e6 100644 --- a/catalyst/callbacks/tests/test_wrapper_callback.py +++ b/catalyst/callbacks/tests/test_wrapper_callback.py @@ -3,7 +3,7 @@ import unittest from unittest.mock import Mock -from catalyst.core.callback import Callback, CallbackOrder, WrapperCallback +from catalyst.core.callback import Callback, CallbackOrder, CallbackWrapper class Dummy(Exception): @@ -50,7 +50,7 @@ def test_enabled(self): for event in events: for order in orders: callback = RaiserCallback(order, event) - wrapper = WrapperCallback(callback, enable_callback=True) + wrapper = CallbackWrapper(callback, enable_callback=True) with self.assertRaises(Dummy): wrapper.__getattribute__(event)(runner) @@ -84,5 +84,5 @@ def test_disabled(self): for event in events: for order in orders: callback = RaiserCallback(order, event) - wrapper = WrapperCallback(callback, enable_callback=False) + wrapper = CallbackWrapper(callback, enable_callback=False) wrapper.__getattribute__(event)(runner) diff --git a/catalyst/callbacks/tracing.py b/catalyst/callbacks/tracing.py index 50bbcf6702..1a8873b1b6 100644 --- a/catalyst/callbacks/tracing.py +++ b/catalyst/callbacks/tracing.py @@ -2,8 +2,9 @@ from pathlib import Path import warnings -from catalyst.core import Callback, CallbackNode, CallbackOrder, IRunner -from catalyst.dl.utils import save_traced_model, trace_model_from_runner +from catalyst.core.callback import Callback, CallbackNode, CallbackOrder +from catalyst.core.runner import IRunner +from catalyst.utils.tracing import save_traced_model, trace_model_from_runner class TracerCallback(Callback): diff --git a/catalyst/contrib/__main__.py b/catalyst/contrib/__main__.py index 42aacae6ee..6b019348bf 100644 --- a/catalyst/contrib/__main__.py +++ b/catalyst/contrib/__main__.py @@ -3,7 +3,7 @@ import logging from catalyst.contrib.scripts import collect_env, find_thresholds -from catalyst.tools import settings +from catalyst.settings import SETTINGS logger = logging.getLogger(__name__) @@ -18,7 +18,7 @@ COMMANDS["check-index-model"] = check_index_model COMMANDS["create-index-model"] = create_index_model except ImportError as ex: - if settings.nmslib_required: + if SETTINGS.nmslib_required: logger.warning( "nmslib not available, to install nmslib," " run `pip install nmslib`." diff --git a/catalyst/contrib/callbacks/__init__.py b/catalyst/contrib/callbacks/__init__.py index 9227e5aeb0..bbcced8d9c 100644 --- a/catalyst/contrib/callbacks/__init__.py +++ b/catalyst/contrib/callbacks/__init__.py @@ -3,7 +3,7 @@ from torch.jit.frontend import UnsupportedNodeError -from catalyst.tools import settings +from catalyst.settings import SETTINGS from catalyst.contrib.callbacks.gradnorm_logger import GradNormLogger @@ -13,7 +13,7 @@ import imageio from catalyst.contrib.callbacks import InferMaskCallback except ImportError as ex: - if settings.cv_required: + if SETTINGS.cv_required: logger.warning( "some of catalyst-cv dependencies are not available," " to install dependencies, run `pip install catalyst[cv]`." @@ -26,7 +26,7 @@ BatchTransformCallback, ) except ImportError as ex: - if settings.cv_required: + if SETTINGS.cv_required: logger.warning( "some of catalyst-cv dependencies are not available," " to install dependencies, run `pip install catalyst[cv]`." @@ -38,14 +38,14 @@ " probably you have an old version of torch which is incompatible.\n" "To update pytorch, run `pip install -U 'torch>=1.5.0'`." ) - if settings.kornia_required: + if SETTINGS.kornia_required: raise ex try: import alchemy from catalyst.contrib.callbacks.alchemy_logger import AlchemyLogger except ImportError as ex: - if settings.alchemy_logger_required: + if SETTINGS.alchemy_logger_required: logger.warning( "alchemy not available, to install alchemy, " "run `pip install alchemy`." @@ -56,7 +56,7 @@ import visdom from catalyst.contrib.callbacks.visdom_logger import VisdomLogger except ImportError as ex: - if settings.visdom_logger_required: + if SETTINGS.visdom_logger_required: logger.warning( "visdom not available, to install visdom, " "run `pip install visdom`." @@ -67,7 +67,7 @@ import neptune from catalyst.contrib.callbacks import NeptuneLogger except ImportError as ex: - if settings.neptune_logger_required: + if SETTINGS.neptune_logger_required: logger.warning( "neptune not available, to install neptune, " "run `pip install neptune-client`." @@ -78,7 +78,7 @@ import wandb from catalyst.contrib.callbacks.wandb_logger import WandbLogger except ImportError as ex: - if settings.wandb_logger_required: + if SETTINGS.wandb_logger_required: logger.warning( "wandb not available, to install wandb, " "run `pip install wandb`." @@ -92,7 +92,7 @@ OptunaCallback, ) except ImportError as ex: - if settings.optuna_required: + if SETTINGS.optuna_required: logger.warning( "optuna not available, to install optuna, " "run `pip install optuna`." diff --git a/catalyst/callbacks/confusion_matrix.py b/catalyst/contrib/callbacks/confusion_matrix.py similarity index 92% rename from catalyst/callbacks/confusion_matrix.py rename to catalyst/contrib/callbacks/confusion_matrix.py index fc5a3e350b..5e74486258 100644 --- a/catalyst/callbacks/confusion_matrix.py +++ b/catalyst/contrib/callbacks/confusion_matrix.py @@ -1,4 +1,4 @@ -from typing import Dict, List +from typing import Dict, List, TYPE_CHECKING import numpy as np from sklearn.metrics import confusion_matrix as confusion_matrix_fn @@ -6,10 +6,16 @@ import torch import torch.distributed # noqa: WPS301 -from catalyst.core import Callback, CallbackNode, CallbackOrder, IRunner -from catalyst.dl import utils +from catalyst.contrib.utils.visualization import ( + plot_confusion_matrix, + render_figure_to_tensor, +) +from catalyst.core.callback import Callback, CallbackNode, CallbackOrder from catalyst.tools import meters +if TYPE_CHECKING: + from catalyst.core.runner import IRunner + class ConfusionMatrixCallback(Callback): """Callback to plot your confusion matrix to the Tensorboard. @@ -91,14 +97,14 @@ def _compute_confusion_matrix(self): def _plot_confusion_matrix( self, logger, epoch, confusion_matrix, class_names=None ): - fig = utils.plot_confusion_matrix( + fig = plot_confusion_matrix( confusion_matrix, class_names=class_names, normalize=True, show=False, **self._plot_params, ) - fig = utils.render_figure_to_tensor(fig) + fig = render_figure_to_tensor(fig) logger.add_image(f"{self.prefix}/epoch", fig, global_step=epoch) def on_loader_start(self, runner: IRunner): diff --git a/catalyst/callbacks/inference.py b/catalyst/contrib/callbacks/inference.py similarity index 100% rename from catalyst/callbacks/inference.py rename to catalyst/contrib/callbacks/inference.py diff --git a/catalyst/callbacks/mixup.py b/catalyst/contrib/callbacks/mixup.py similarity index 96% rename from catalyst/callbacks/mixup.py rename to catalyst/contrib/callbacks/mixup.py index 9307dbac6e..4621b65b4b 100644 --- a/catalyst/callbacks/mixup.py +++ b/catalyst/contrib/callbacks/mixup.py @@ -4,8 +4,8 @@ import torch -from catalyst.core import IRunner -from catalyst.dl import CriterionCallback +from catalyst.callbacks.criterion import CriterionCallback +from catalyst.core.runner import IRunner class MixupCallback(CriterionCallback): diff --git a/catalyst/contrib/callbacks/telegram_logger.py b/catalyst/contrib/callbacks/telegram_logger.py index 1a56fb37de..a2b0331411 100644 --- a/catalyst/contrib/callbacks/telegram_logger.py +++ b/catalyst/contrib/callbacks/telegram_logger.py @@ -8,7 +8,7 @@ from catalyst import utils from catalyst.core.callback import Callback, CallbackNode, CallbackOrder from catalyst.core.runner import IRunner -from catalyst.tools import settings +from catalyst.settings import SETTINGS class TelegramLogger(Callback): @@ -42,8 +42,8 @@ def __init__( """ super().__init__(order=CallbackOrder.logging, node=CallbackNode.master) # @TODO: replace this logic with global catalyst config at ~/.catalyst - self._token = token or settings.telegram_logger_token - self._chat_id = chat_id or settings.telegram_logger_chat_id + self._token = token or SETTINGS.telegram_logger_token + self._chat_id = chat_id or SETTINGS.telegram_logger_chat_id assert self._token is not None and self._chat_id is not None self._base_url = ( f"https://api.telegram.org/bot{self._token}/sendMessage" diff --git a/catalyst/contrib/datasets/__init__.py b/catalyst/contrib/datasets/__init__.py index 1defcdfbcb..5b240ef60b 100644 --- a/catalyst/contrib/datasets/__init__.py +++ b/catalyst/contrib/datasets/__init__.py @@ -1,7 +1,7 @@ # flake8: noqa import logging -from catalyst.tools import settings +from catalyst.settings import SETTINGS from catalyst.contrib.datasets.mnist import ( MnistMLDataset, @@ -14,7 +14,7 @@ try: from catalyst.contrib.datasets.cv import * except ImportError as ex: - if settings.cv_required: + if SETTINGS.cv_required: logger.warning( "some of catalyst-cv dependencies are not available," " to install dependencies, run `pip install catalyst[cv]`." diff --git a/catalyst/contrib/nn/models/__init__.py b/catalyst/contrib/nn/models/__init__.py index 5550a77aea..48e4265909 100644 --- a/catalyst/contrib/nn/models/__init__.py +++ b/catalyst/contrib/nn/models/__init__.py @@ -1,25 +1,25 @@ # flake8: noqa import logging -from catalyst.tools import settings +from catalyst.settings import SETTINGS -from catalyst.contrib.models.functional import ( +from catalyst.contrib.nn.models.functional import ( get_convolution_net, get_linear_net, ) -from catalyst.contrib.models.hydra import Hydra -from catalyst.contrib.models.sequential import ( +from catalyst.contrib.nn.models.hydra import Hydra +from catalyst.contrib.nn.models.sequential import ( ResidualWrapper, SequentialNet, ) -from catalyst.contrib.models.simple_conv import SimpleConv +from catalyst.contrib.nn.models.simple_conv import SimpleConv logger = logging.getLogger(__name__) try: from catalyst.contrib.models.cv import * except ImportError as ex: - if settings.cv_required: + if SETTINGS.cv_required: logger.warning( "some of catalyst-cv dependencies are not available," " to install dependencies, run `pip install catalyst[cv]`." @@ -30,7 +30,7 @@ try: from catalyst.contrib.models.nlp import * except ImportError as ex: - if settings.nlp_required: + if SETTINGS.nlp_required: logger.warning( "some of catalyst-nlp dependencies not available," " to install dependencies, run `pip install catalyst[nlp]`." diff --git a/catalyst/contrib/nn/models/cv/segmentation/decoder/unet.py b/catalyst/contrib/nn/models/cv/segmentation/decoder/unet.py index 8cca05ec71..e535c43d1a 100644 --- a/catalyst/contrib/nn/models/cv/segmentation/decoder/unet.py +++ b/catalyst/contrib/nn/models/cv/segmentation/decoder/unet.py @@ -6,10 +6,10 @@ from torch import nn from catalyst.contrib.models.cv.segmentation.blocks.core import DecoderBlock +from catalyst.contrib.models.cv.segmentation.decoder.core import DecoderSpec from catalyst.contrib.nn.models.cv.segmentation.blocks.unet import ( DecoderConcatBlock, ) -from catalyst.contrib.models.cv.segmentation.decoder.core import DecoderSpec class UNetDecoder(DecoderSpec): diff --git a/catalyst/contrib/nn/models/cv/segmentation/encoder/unet.py b/catalyst/contrib/nn/models/cv/segmentation/encoder/unet.py index 7959e8fb81..674cb43b4e 100644 --- a/catalyst/contrib/nn/models/cv/segmentation/encoder/unet.py +++ b/catalyst/contrib/nn/models/cv/segmentation/encoder/unet.py @@ -5,13 +5,13 @@ import torch from torch import nn -from catalyst.contrib.nn.models.cv.segmentation.blocks.unet import ( - EncoderDownsampleBlock, -) from catalyst.contrib.models.cv.segmentation.encoder.core import ( # noqa: WPS450, E501 _take, EncoderSpec, ) +from catalyst.contrib.nn.models.cv.segmentation.blocks.unet import ( + EncoderDownsampleBlock, +) class UnetEncoder(EncoderSpec): diff --git a/catalyst/contrib/utils/__init__.py b/catalyst/contrib/utils/__init__.py index ec7b229e62..31e034abe3 100644 --- a/catalyst/contrib/utils/__init__.py +++ b/catalyst/contrib/utils/__init__.py @@ -4,7 +4,7 @@ logger = logging.getLogger(__name__) -from catalyst.tools import settings +from catalyst.settings import SETTINGS from catalyst.contrib.utils.argparse import boolean_flag from catalyst.contrib.utils.compression import ( @@ -66,7 +66,7 @@ plot_metrics, ) except ImportError as ex: - if settings.plotly_required: + if SETTINGS.plotly_required: logger.warning( "plotly not available, to install plotly," " run `pip install plotly`." diff --git a/catalyst/contrib/utils/compression.py b/catalyst/contrib/utils/compression.py index 9364b6f260..561f40ada0 100644 --- a/catalyst/contrib/utils/compression.py +++ b/catalyst/contrib/utils/compression.py @@ -7,11 +7,11 @@ from six import string_types from catalyst.contrib.utils.serialization import deserialize, serialize -from catalyst.tools import settings +from catalyst.settings import SETTINGS logger = logging.getLogger(__name__) -if settings.use_lz4: +if SETTINGS.use_lz4: try: import lz4.frame except ImportError as ex: @@ -28,7 +28,7 @@ def is_compressed(data): def compress(data): """@TODO: Docs. Contribution is welcome.""" - if settings.use_lz4: + if SETTINGS.use_lz4: data = serialize(data) data = lz4.frame.compress(data) data = base64.b64encode(data).decode("ascii") @@ -44,7 +44,7 @@ def compress_if_needed(data): def decompress(data): """@TODO: Docs. Contribution is welcome.""" - if settings.use_lz4: + if SETTINGS.use_lz4: data = base64.b64decode(data) data = lz4.frame.decompress(data) data = deserialize(data) @@ -58,7 +58,7 @@ def decompress_if_needed(data): return data -if settings.use_lz4: +if SETTINGS.use_lz4: pack = compress pack_if_needed = compress_if_needed unpack = decompress diff --git a/catalyst/contrib/utils/cv/__init__.py b/catalyst/contrib/utils/cv/__init__.py index 0b682a889f..49d7289b7d 100644 --- a/catalyst/contrib/utils/cv/__init__.py +++ b/catalyst/contrib/utils/cv/__init__.py @@ -4,7 +4,7 @@ logger = logging.getLogger(__name__) -from catalyst.tools import settings +from catalyst.settings import SETTINGS try: from catalyst.contrib.utils.cv.image import ( @@ -17,7 +17,7 @@ mimwrite_with_meta, ) except ImportError as ex: - if settings.cv_required: + if SETTINGS.cv_required: logger.warning( "some of catalyst-cv dependencies are not available," " to install dependencies, run `pip install catalyst[cv]`." diff --git a/catalyst/contrib/utils/cv/image.py b/catalyst/contrib/utils/cv/image.py index 38b07d3988..a7345840a4 100644 --- a/catalyst/contrib/utils/cv/image.py +++ b/catalyst/contrib/utils/cv/image.py @@ -10,11 +10,11 @@ import numpy as np from skimage.color import label2rgb, rgb2gray -from catalyst.tools import settings +from catalyst.settings import SETTINGS logger = logging.getLogger(__name__) -if settings.use_libjpeg_turbo: +if SETTINGS.use_libjpeg_turbo: try: import jpeg4py as jpeg @@ -69,7 +69,7 @@ def imread( rootpath = str(rootpath) uri = uri if uri.startswith(rootpath) else os.path.join(rootpath, uri) - if settings.use_libjpeg_turbo and uri.endswith( + if SETTINGS.use_libjpeg_turbo and uri.endswith( ("jpg", "JPG", "jpeg", "JPEG") ): img = jpeg.JPEG(uri).decode() diff --git a/catalyst/contrib/utils/nlp/__init__.py b/catalyst/contrib/utils/nlp/__init__.py index 9d4e20b1bb..de96c6418b 100644 --- a/catalyst/contrib/utils/nlp/__init__.py +++ b/catalyst/contrib/utils/nlp/__init__.py @@ -4,7 +4,7 @@ logger = logging.getLogger(__name__) -from catalyst.tools import settings +from catalyst.settings import SETTINGS try: import transformers # noqa: F401 @@ -13,7 +13,7 @@ process_bert_output, ) except ImportError as ex: - if settings.transformers_required: + if SETTINGS.transformers_required: logger.warning( "transformers not available, to install transformers," " run `pip install transformers`." diff --git a/catalyst/contrib/utils/serialization.py b/catalyst/contrib/utils/serialization.py index 1573b118c3..456788cf45 100644 --- a/catalyst/contrib/utils/serialization.py +++ b/catalyst/contrib/utils/serialization.py @@ -1,11 +1,11 @@ import logging import pickle -from catalyst.tools import settings +from catalyst.settings import SETTINGS logger = logging.getLogger(__name__) -if settings.use_pyarrow: +if SETTINGS.use_pyarrow: try: import pyarrow except ImportError as ex: @@ -64,7 +64,7 @@ def pickle_deserialize(bytes): return pickle.loads(bytes) -if settings.use_pyarrow: +if SETTINGS.use_pyarrow: serialize = pyarrow_serialize deserialize = pyarrow_deserialize else: diff --git a/catalyst/core/__init__.py b/catalyst/core/__init__.py index ff13904ba1..8c8287b2d3 100644 --- a/catalyst/core/__init__.py +++ b/catalyst/core/__init__.py @@ -1,9 +1,8 @@ # flake8: noqa # import order: -# callback -# callbacks # experiment # runner +# callback from catalyst.core.experiment import IExperiment from catalyst.core.runner import IRunner, IStageBasedRunner, RunnerException @@ -12,7 +11,6 @@ CallbackNode, CallbackOrder, CallbackScope, - WrapperCallback, + CallbackWrapper, ) -from catalyst.core.callbacks import * from catalyst.core.state import State diff --git a/catalyst/core/callback.py b/catalyst/core/callback.py index 8d80394dac..b5793ddf82 100644 --- a/catalyst/core/callback.py +++ b/catalyst/core/callback.py @@ -209,7 +209,7 @@ def on_exception(self, runner: "IRunner"): pass -class WrapperCallback(Callback): +class CallbackWrapper(Callback): """Enable/disable callback execution.""" def __init__(self, base_callback: Callback, enable_callback: bool = True): @@ -316,10 +316,12 @@ def on_exception(self, runner: "IRunner") -> None: self.callback.on_exception(runner) +WrapperCallback = CallbackWrapper + __all__ = [ "Callback", "CallbackNode", "CallbackOrder", "CallbackScope", - "WrapperCallback", + "CallbackWrapper", ] diff --git a/catalyst/core/legacy.py b/catalyst/core/legacy.py index de85395ed4..550d5f68af 100644 --- a/catalyst/core/legacy.py +++ b/catalyst/core/legacy.py @@ -85,3 +85,6 @@ def state(self): DeprecationWarning, ) return self + + +__all__ = ["IRunnerLegacy"] diff --git a/catalyst/core/runner.py b/catalyst/core/runner.py index 3d054472d2..2b5e26c684 100644 --- a/catalyst/core/runner.py +++ b/catalyst/core/runner.py @@ -7,11 +7,10 @@ from torch import nn from torch.utils.data import DataLoader, DistributedSampler -from catalyst.core import utils from catalyst.core.callback import Callback, CallbackScope from catalyst.core.experiment import IExperiment from catalyst.core.legacy import IRunnerLegacy -from catalyst.tools import settings +from catalyst.settings import SETTINGS from catalyst.tools.frozen_class import FrozenClass from catalyst.typing import ( Criterion, @@ -24,6 +23,16 @@ RunnerScheduler, Scheduler, ) +from catalyst.utils.callbacks import ( + filter_callbacks_by_node, + sort_callbacks_by_order, +) +from catalyst.utils.components import process_components +from catalyst.utils.distributed import get_rank +from catalyst.utils.loaders import validate_loaders +from catalyst.utils.misc import maybe_recursive_call +from catalyst.utils.seed import set_global_seed +from catalyst.utils.torch import any2device class RunnerException(Exception): @@ -370,7 +379,7 @@ def __init__( def _prepare_inner_state( self, - stage: str = settings.stage_infer_prefix, + stage: str = SETTINGS.stage_infer_prefix, device: Device = None, model: RunnerModel = None, criterion: RunnerCriterion = None, @@ -382,7 +391,7 @@ def _prepare_inner_state( num_epochs: int = 1, main_metric: str = "loss", minimize_metric: bool = True, - valid_loader: str = settings.loader_valid_prefix, + valid_loader: str = SETTINGS.loader_valid_prefix, checkpoint_data: Dict = None, is_check_run: bool = False, verbose: bool = False, @@ -436,7 +445,7 @@ def _prepare_inner_state( self.best_valid_metrics: Dict = defaultdict(None) # distributed info - self.distributed_rank: int = utils.get_rank() + self.distributed_rank: int = get_rank() self.is_distributed_master: bool = ~(self.distributed_rank > 0) self.is_distributed_worker: bool = self.distributed_rank > 0 # experiment info @@ -451,7 +460,7 @@ def _prepare_inner_state( self.num_epochs: int = num_epochs self.stage_name: str = stage self.is_infer_stage: bool = self.stage_name.startswith( - settings.stage_infer_prefix + SETTINGS.stage_infer_prefix ) # epoch info self.epoch: int = 1 @@ -528,7 +537,7 @@ def model(self, value: Union[Model, Dict[str, Model]]): ) if model is not None and self._device is not None: - model: Model = utils.maybe_recursive_call( + model: Model = maybe_recursive_call( model, "to", device=self._device ) @@ -564,7 +573,7 @@ def device(self, value: Device): ) if self._model is not None: - self._model = utils.maybe_recursive_call( + self._model = maybe_recursive_call( self._model, "to", device=self._device or "cpu" ) @@ -590,13 +599,7 @@ def _get_experiment_components( criterion = experiment.get_criterion(stage) optimizer = experiment.get_optimizer(stage, model) scheduler = experiment.get_scheduler(stage, optimizer) - ( - model, - criterion, - optimizer, - scheduler, - device, - ) = utils.process_components( + (model, criterion, optimizer, scheduler, device,) = process_components( model=model, criterion=criterion, optimizer=optimizer, @@ -624,8 +627,8 @@ def _get_experiment_callbacks( with callbacks for current experiment stage. """ callbacks = experiment.get_callbacks(stage) - callbacks = utils.filter_callbacks_by_node(callbacks) - callbacks = utils.sort_callbacks_by_order(callbacks) + callbacks = filter_callbacks_by_node(callbacks) + callbacks = sort_callbacks_by_order(callbacks) return callbacks def get_attr(self, key: str, inner_key: str = None) -> Any: @@ -735,7 +738,7 @@ def _batch2device( Mapping[str, Any]: same structure as value, but all tensors and np.arrays moved to device """ - output = utils.any2device(batch, device) + output = any2device(batch, device) return output @abstractmethod @@ -827,7 +830,7 @@ def _run_epoch(self, stage: str, epoch: int) -> None: ) else: assert not any( - x.startswith(settings.loader_train_prefix) + x.startswith(SETTINGS.loader_train_prefix) for x in self.loaders.keys() ), "for inference no train loader should be passed" @@ -835,15 +838,15 @@ def _run_epoch(self, stage: str, epoch: int) -> None: self.loader_name = loader_name self.loader_len = len(loader) self.is_train_loader = loader_name.startswith( - settings.loader_train_prefix + SETTINGS.loader_train_prefix ) self.is_valid_loader = loader_name.startswith( - settings.loader_valid_prefix + SETTINGS.loader_valid_prefix ) self.is_infer_loader = loader_name.startswith( - settings.loader_infer_prefix + SETTINGS.loader_infer_prefix ) - utils.maybe_recursive_call( + maybe_recursive_call( self.model, "train", mode=self.is_train_loader, ) @@ -853,7 +856,7 @@ def _run_epoch(self, stage: str, epoch: int) -> None: ): loader.sampler.set_epoch(self.epoch) - utils.set_global_seed( + set_global_seed( self.experiment.initial_seed + self.global_epoch + 1 ) self._run_event("on_loader_start") @@ -875,7 +878,7 @@ def _run_stage(self, stage: str) -> None: self._run_event("on_stage_start") while self.epoch < self.num_epochs + 1: - utils.set_global_seed( + set_global_seed( self.experiment.initial_seed + self.global_epoch + 1 ) self._run_event("on_epoch_start") @@ -937,8 +940,7 @@ class IStageBasedRunner(IRunner): """ def _prepare_for_stage(self, stage: str): - """ - Inner method to prepare `Runner` for the specified stage. + """Inner method to prepare `Runner` for the specified stage. Sets `Experiment` initial seed. Prepares experiment components with `self._get_experiment_components`. @@ -950,12 +952,12 @@ def _prepare_for_stage(self, stage: str): stage: stage name of interest, like "pretrain" / "train" / "finetune" / etc """ - utils.set_global_seed(self.experiment.initial_seed) + set_global_seed(self.experiment.initial_seed) loaders = self.experiment.get_loaders(stage=stage) - loaders = utils.validate_loaders(loaders) + loaders = validate_loaders(loaders) self.loaders = loaders - utils.set_global_seed(self.experiment.initial_seed) + set_global_seed(self.experiment.initial_seed) ( model, criterion, @@ -966,7 +968,7 @@ def _prepare_for_stage(self, stage: str): experiment=self.experiment, stage=stage, device=self.device ) - utils.set_global_seed(self.experiment.initial_seed) + set_global_seed(self.experiment.initial_seed) callbacks = self._get_experiment_callbacks( experiment=self.experiment, stage=stage ) @@ -983,7 +985,7 @@ def _prepare_for_stage(self, stage: str): if value.scope == CallbackScope.experiment: callbacks[key] = value - callbacks = utils.sort_callbacks_by_order(callbacks) + callbacks = sort_callbacks_by_order(callbacks) if migrate_from_previous_stage: migrating_params.update( diff --git a/catalyst/data/__main__.py b/catalyst/data/__main__.py index 67091ba636..e33df8f904 100644 --- a/catalyst/data/__main__.py +++ b/catalyst/data/__main__.py @@ -80,7 +80,7 @@ split_dataframe, tag2label, ) -from catalyst.tools import settings +from catalyst.settings import SETTINGS logger = logging.getLogger(__name__) @@ -102,7 +102,7 @@ COMMANDS["process-images"] = process_images COMMANDS["image2embedding"] = image2embedding except ImportError as ex: # noqa: WPS440 - if settings.cv_required: + if SETTINGS.cv_required: logger.warning( "some of catalyst-cv dependencies are not available," + " to install dependencies, run `pip install catalyst[cv]`." @@ -115,7 +115,7 @@ COMMANDS["text2embedding"] = text2embedding except ImportError as ex: # noqa: WPS440 - if settings.transformers_required: + if SETTINGS.transformers_required: logger.warning( "transformers not available, to install transformers," + " run `pip install transformers`." diff --git a/catalyst/data/cv/__init__.py b/catalyst/data/cv/__init__.py index 4e178aa928..ee58a06651 100644 --- a/catalyst/data/cv/__init__.py +++ b/catalyst/data/cv/__init__.py @@ -1,7 +1,7 @@ # flake8: noqa import logging -from catalyst.tools import settings +from catalyst.settings import SETTINGS from catalyst.data.cv.transforms.torch import ( Compose, @@ -24,7 +24,7 @@ ImageToTensor, ) except ImportError as ex: - if settings.cv_required: + if SETTINGS.cv_required: logger.warning( "some of catalyst-cv dependencies are not available," " to install dependencies, run `pip install catalyst[cv]`." diff --git a/catalyst/data/cv/dataset.py b/catalyst/data/cv/dataset.py index 7f218354b1..39f003a834 100644 --- a/catalyst/data/cv/dataset.py +++ b/catalyst/data/cv/dataset.py @@ -2,9 +2,9 @@ import glob from pathlib import Path -from catalyst import utils -from catalyst.data.cv import ImageReader -from catalyst.data.dataset import PathsDataset +from catalyst.contrib.utils.cv.image import has_image_extension +from catalyst.data.cv.reader import ImageReader +from catalyst.data.dataset.torch import PathsDataset from catalyst.data.reader import ReaderCompose, ScalarReader @@ -48,7 +48,7 @@ def __init__( to use on dict """ files = glob.iglob(f"{rootpath}/**/*") - images = sorted(filter(utils.has_image_extension, files)) + images = sorted(filter(has_image_extension, files)) if dir2class is None: dirs = sorted({Path(f).parent.name for f in images}) diff --git a/catalyst/data/cv/reader.py b/catalyst/data/cv/reader.py index 00c24124d4..68d0e56415 100644 --- a/catalyst/data/cv/reader.py +++ b/catalyst/data/cv/reader.py @@ -1,6 +1,6 @@ from typing import Optional, Tuple, Union -from catalyst import utils +from catalyst.contrib.utils.cv.image import imread from catalyst.data.reader import ReaderSpec @@ -39,7 +39,7 @@ def __call__(self, element): np.ndarray: Image """ image_name = str(element[self.input_key]) - img = utils.imread( + img = imread( image_name, rootpath=self.rootpath, grayscale=self.grayscale ) @@ -83,9 +83,7 @@ def __call__(self, element): np.ndarray: Mask """ mask_name = str(element[self.input_key]) - mask = utils.mimread( - mask_name, rootpath=self.rootpath, clip_range=self.clip - ) + mask = mimread(mask_name, rootpath=self.rootpath, clip_range=self.clip) output = {self.output_key: mask} return output diff --git a/catalyst/data/cv/transforms/albumentations.py b/catalyst/data/cv/transforms/albumentations.py index b15c94232e..7e2c2f70b4 100644 --- a/catalyst/data/cv/transforms/albumentations.py +++ b/catalyst/data/cv/transforms/albumentations.py @@ -4,7 +4,7 @@ from albumentations.pytorch import ToTensorV2 import torch -from catalyst import utils +from catalyst.contrib.utils.cv.tensor import tensor_to_ndimage class TensorToImage(ImageOnlyTransform): @@ -35,7 +35,7 @@ def apply(self, img: torch.Tensor, **params) -> np.ndarray: if len(img.shape) == 2: img = img.unsqueeze(0) - return utils.tensor_to_ndimage( + return tensor_to_ndimage( img, denormalize=self.denormalize, move_channels_dim=self.move_channels_dim, diff --git a/catalyst/data/dataset/torch.py b/catalyst/data/dataset/torch.py index 903710cf06..657d991924 100644 --- a/catalyst/data/dataset/torch.py +++ b/catalyst/data/dataset/torch.py @@ -5,7 +5,7 @@ from torch.utils.data import Dataset, Sampler -from catalyst.utils import merge_dicts +from catalyst.utils.dict import merge_dicts _Path = Union[str, Path] diff --git a/catalyst/data/nlp/__init__.py b/catalyst/data/nlp/__init__.py index 9c2267de66..eade0ffcff 100644 --- a/catalyst/data/nlp/__init__.py +++ b/catalyst/data/nlp/__init__.py @@ -1,7 +1,7 @@ # flake8: noqa import logging -from catalyst.tools import settings +from catalyst.settings import SETTINGS logger = logging.getLogger(__name__) @@ -13,7 +13,7 @@ TextClassificationDataset, ) except ImportError as ex: - if settings.nlp_required: + if SETTINGS.nlp_required: logger.warning( "some of catalyst-nlp dependencies not available," " to install dependencies, run `pip install catalyst[nlp]`." diff --git a/catalyst/data/reader.py b/catalyst/data/reader.py index 38841f4fd0..46400436f8 100644 --- a/catalyst/data/reader.py +++ b/catalyst/data/reader.py @@ -3,7 +3,7 @@ import numpy as np -from catalyst.utils import get_one_hot +from catalyst.utils.numpy import get_one_hot class ReaderSpec: diff --git a/catalyst/data/sampler.py b/catalyst/data/sampler.py index 3efac8625d..b95961c2ac 100644 --- a/catalyst/data/sampler.py +++ b/catalyst/data/sampler.py @@ -10,7 +10,7 @@ from torch.utils.data.sampler import BatchSampler, Sampler from catalyst.contrib.utils.misc import find_value_ids -from catalyst.data import DatasetFromSampler +from catalyst.data.dataset.torch import DatasetFromSampler class BalanceClassSampler(Sampler): diff --git a/catalyst/data/scripts/project_embeddings.py b/catalyst/data/scripts/project_embeddings.py index 07ef7414e6..0d6edbd216 100644 --- a/catalyst/data/scripts/project_embeddings.py +++ b/catalyst/data/scripts/project_embeddings.py @@ -10,7 +10,7 @@ import torch from catalyst.contrib.tools.tensorboard import SummaryWriter -from catalyst.tools import settings +from catalyst.settings import SETTINGS logger = logging.getLogger(__name__) @@ -103,7 +103,7 @@ def _load_image(filename, size): img_data = torch.from_numpy(img_data) except ImportError as ex: - if settings.cv_required: + if SETTINGS.cv_required: logger.warning( "some of catalyst-cv dependencies are not available," + " to install dependencies, run `pip install catalyst[cv]`." diff --git a/catalyst/data/utils.py b/catalyst/data/utils.py index a7f3eda9d1..9b58157a83 100644 --- a/catalyst/data/utils.py +++ b/catalyst/data/utils.py @@ -23,10 +23,8 @@ def convert_labels2list(labels: Union[Tensor, List[int]]) -> List[int]: labels.dtype in [short, tint, long] ), "Labels cannot be interpreted as indices." labels_list = labels.tolist() - elif isinstance(labels, list): labels_list = labels.copy() - else: raise TypeError(f"Unexpected type of labels: {type(labels)}).") diff --git a/catalyst/dl/__init__.py b/catalyst/dl/__init__.py index 21d8795f2e..dd5b785a3a 100644 --- a/catalyst/dl/__init__.py +++ b/catalyst/dl/__init__.py @@ -1,3 +1,6 @@ # flake8: noqa -from catalyst.dl.callbacks import * +from catalyst.core import * +from catalyst.experiments import * +from catalyst.runners import * +from catalyst.callbacks import * diff --git a/catalyst/dl/scripts/init.py b/catalyst/dl/scripts/init.py index 9fc5314a1f..eab2105a8c 100755 --- a/catalyst/dl/scripts/init.py +++ b/catalyst/dl/scripts/init.py @@ -3,7 +3,8 @@ import argparse from pathlib import Path -from catalyst.dl import utils +from catalyst.utils.pipelines import clone_pipeline +from catalyst.utils.wizard import run_wizard def build_args(parser): @@ -40,9 +41,9 @@ def parse_args(): def main(args, _): """Runs the ``catalyst-dl init`` script.""" if args.interactive: - utils.run_wizard() + run_wizard() else: - utils.clone_pipeline(args.pipeline, args.out_dir) + clone_pipeline(args.pipeline, args.out_dir) if __name__ == "__main__": diff --git a/catalyst/dl/scripts/run.py b/catalyst/dl/scripts/run.py index d82acb6d09..fc596b6031 100755 --- a/catalyst/dl/scripts/run.py +++ b/catalyst/dl/scripts/run.py @@ -5,7 +5,17 @@ import os from pathlib import Path -from catalyst.dl import utils +from catalyst.contrib.utils.argparse import boolean_flag +from catalyst.utils.distributed import get_rank +from catalyst.utils.parser import parse_args_uargs +from catalyst.utils.scripts import ( + distributed_cmd_run, + dump_code, + prepare_config_api_components, +) +from catalyst.utils.seed import set_global_seed +from catalyst.utils.sys import dump_environment +from catalyst.utils.torch import prepare_cudnn def build_args(parser: ArgumentParser): @@ -55,38 +65,36 @@ def build_args(parser: ArgumentParser): default=None, ) parser.add_argument("--seed", type=int, default=42) - utils.boolean_flag( + boolean_flag( parser, "apex", default=os.getenv("USE_APEX", "0") == "1", help="Enable/disable using of Apex extension", ) - utils.boolean_flag( + boolean_flag( parser, "amp", default=os.getenv("USE_AMP", "0") == "1", help="Enable/disable using of PyTorch AMP extension", ) - utils.boolean_flag( + boolean_flag( parser, "distributed", shorthand="ddp", default=os.getenv("USE_DDP", "0") == "1", help="Run in distributed mode", ) - utils.boolean_flag(parser, "verbose", default=None) - utils.boolean_flag(parser, "timeit", default=None) - utils.boolean_flag(parser, "check", default=None) - utils.boolean_flag(parser, "overfit", default=None) - utils.boolean_flag( + boolean_flag(parser, "verbose", default=None) + boolean_flag(parser, "timeit", default=None) + boolean_flag(parser, "check", default=None) + boolean_flag(parser, "overfit", default=None) + boolean_flag( parser, "deterministic", default=None, help="Deterministic mode if running in CuDNN backend", ) - utils.boolean_flag( - parser, "benchmark", default=None, help="Use CuDNN benchmark" - ) + boolean_flag(parser, "benchmark", default=None, help="Use CuDNN benchmark") return parser @@ -101,29 +109,27 @@ def parse_args(): def main_worker(args, unknown_args): """Runs main worker thread from model training.""" - args, config = utils.parse_args_uargs(args, unknown_args) - utils.set_global_seed(args.seed) - utils.prepare_cudnn(args.deterministic, args.benchmark) + args, config = parse_args_uargs(args, unknown_args) + set_global_seed(args.seed) + prepare_cudnn(args.deterministic, args.benchmark) config.setdefault("distributed_params", {})["apex"] = args.apex config.setdefault("distributed_params", {})["amp"] = args.amp - experiment, runner, config = utils.prepare_config_api_components( + experiment, runner, config = prepare_config_api_components( expdir=Path(args.expdir), config=config ) - if experiment.logdir is not None and utils.get_rank() <= 0: - utils.dump_environment(config, experiment.logdir, args.configs) - utils.dump_code(args.expdir, experiment.logdir) + if experiment.logdir is not None and get_rank() <= 0: + dump_environment(config, experiment.logdir, args.configs) + dump_code(args.expdir, experiment.logdir) runner.run_experiment(experiment) def main(args, unknown_args): """Runs the ``catalyst-dl run`` script.""" - utils.distributed_cmd_run( - main_worker, args.distributed, args, unknown_args - ) + distributed_cmd_run(main_worker, args.distributed, args, unknown_args) if __name__ == "__main__": diff --git a/catalyst/dl/scripts/trace.py b/catalyst/dl/scripts/trace.py index bae304192d..0a08c85373 100755 --- a/catalyst/dl/scripts/trace.py +++ b/catalyst/dl/scripts/trace.py @@ -4,7 +4,10 @@ from argparse import ArgumentParser from pathlib import Path -from catalyst.dl.utils import save_traced_model, trace_model_from_checkpoint +from catalyst.utils.tracing import ( + save_traced_model, + trace_model_from_checkpoint, +) def build_args(parser: ArgumentParser): diff --git a/catalyst/dl/scripts/tune.py b/catalyst/dl/scripts/tune.py index c76ce17f0e..38b7b4ed52 100755 --- a/catalyst/dl/scripts/tune.py +++ b/catalyst/dl/scripts/tune.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -# Experimental API for Optuna integration with Catalyst Config API -# for AutoML hyperparameters tuning. +# Config API and Optuna integration for AutoML hyperparameters tuning. from typing import Dict, Tuple import argparse from argparse import ArgumentParser @@ -9,7 +8,14 @@ import optuna -from catalyst.dl import utils +from catalyst.contrib.utils.argparse import boolean_flag +from catalyst.utils.distributed import get_rank +from catalyst.utils.misc import maybe_recursive_call +from catalyst.utils.parser import parse_args_uargs +from catalyst.utils.scripts import dump_code, prepare_config_api_components +from catalyst.utils.seed import set_global_seed +from catalyst.utils.sys import dump_environment +from catalyst.utils.torch import prepare_cudnn def build_args(parser: ArgumentParser): @@ -59,38 +65,36 @@ def build_args(parser: ArgumentParser): # default=None, # ) parser.add_argument("--seed", type=int, default=42) - utils.boolean_flag( + boolean_flag( parser, "apex", default=os.getenv("USE_APEX", "0") == "1", help="Enable/disable using of Apex extension", ) - utils.boolean_flag( + boolean_flag( parser, "amp", default=os.getenv("USE_AMP", "0") == "1", help="Enable/disable using of PyTorch AMP extension", ) - # utils.boolean_flag( + # boolean_flag( # parser, # "distributed", # shorthand="ddp", # default=os.getenv("USE_DDP", "0") == "1", # help="Run in distributed mode", # ) - utils.boolean_flag(parser, "verbose", default=None) - utils.boolean_flag(parser, "timeit", default=None) - # utils.boolean_flag(parser, "check", default=None) - # utils.boolean_flag(parser, "overfit", default=None) - utils.boolean_flag( + boolean_flag(parser, "verbose", default=None) + boolean_flag(parser, "timeit", default=None) + # boolean_flag(parser, "check", default=None) + # boolean_flag(parser, "overfit", default=None) + boolean_flag( parser, "deterministic", default=None, help="Deterministic mode if running in CuDNN backend", ) - utils.boolean_flag( - parser, "benchmark", default=None, help="Use CuDNN benchmark" - ) + boolean_flag(parser, "benchmark", default=None, help="Use CuDNN benchmark") parser.add_argument("--storage", type=int, default=None) parser.add_argument("--study-name", type=int, default=None) @@ -98,8 +102,8 @@ def build_args(parser: ArgumentParser): parser.add_argument("--n-trials", type=int, default=None) parser.add_argument("--timeout", type=int, default=None) parser.add_argument("--n-jobs", type=int, default=None) - utils.boolean_flag(parser, "gc-after-trial", default=False) - utils.boolean_flag(parser, "show-progress-bar", default=False) + boolean_flag(parser, "gc-after-trial", default=False) + boolean_flag(parser, "show-progress-bar", default=False) return parser @@ -119,15 +123,15 @@ def _eval_trial_suggestions(x): x = eval(x) return x - config = utils.maybe_recursive_call(config, _eval_trial_suggestions) + config = maybe_recursive_call(config, _eval_trial_suggestions) return trial, config def main_worker(args, unknown_args): """Runs main worker thread from model training.""" - args, config = utils.parse_args_uargs(args, unknown_args) - utils.set_global_seed(args.seed) - utils.prepare_cudnn(args.deterministic, args.benchmark) + args, config = parse_args_uargs(args, unknown_args) + set_global_seed(args.seed) + prepare_cudnn(args.deterministic, args.benchmark) config.setdefault("distributed_params", {})["apex"] = args.apex config.setdefault("distributed_params", {})["amp"] = args.amp @@ -136,17 +140,15 @@ def main_worker(args, unknown_args): # optuna objective def objective(trial: optuna.trial): trial, trial_config = _process_trial_config(trial, config.copy()) - experiment, runner, trial_config = utils.prepare_config_api_components( + experiment, runner, trial_config = prepare_config_api_components( expdir=expdir, config=trial_config ) # @TODO: here we need better solution. experiment._trial = trial # noqa: WPS437 - if experiment.logdir is not None and utils.get_rank() <= 0: - utils.dump_environment( - trial_config, experiment.logdir, args.configs - ) - utils.dump_code(args.expdir, experiment.logdir) + if experiment.logdir is not None and get_rank() <= 0: + dump_environment(trial_config, experiment.logdir, args.configs) + dump_code(args.expdir, experiment.logdir) runner.run_experiment(experiment) @@ -202,7 +204,7 @@ def objective(trial: optuna.trial): def main(args, unknown_args): """Runs the ``catalyst-dl tune`` script.""" main_worker(args, unknown_args) - # utils.distributed_cmd_run( + # distributed_cmd_run( # main_worker, args.distributed, args, unknown_args # ) diff --git a/catalyst/experiments/__init__.py b/catalyst/experiments/__init__.py index 63c250c186..1708357cb5 100644 --- a/catalyst/experiments/__init__.py +++ b/catalyst/experiments/__init__.py @@ -1,6 +1,8 @@ # flake8: noqa -from catalyst.experiment.supervised import SupervisedExperiment +from catalyst.experiments.experiment import Experiment +from catalyst.experiments.supervised import SupervisedExperiment +from catalyst.experiments.config import ConfigExperiment __all__ = ["ConfigExperiment", "Experiment", "SupervisedExperiment"] diff --git a/catalyst/experiments/config.py b/catalyst/experiments/config.py index 37e83cef39..3d07f6f3e5 100644 --- a/catalyst/experiments/config.py +++ b/catalyst/experiments/config.py @@ -6,29 +6,28 @@ from torch import nn from torch.utils.data import DataLoader -from catalyst.core import IExperiment -from catalyst.data import Augmentor, AugmentorCompose -from catalyst.dl import ( - AMPOptimizerCallback, - BatchOverfitCallback, - Callback, - CheckpointCallback, - CheckRunCallback, +from catalyst.callbacks.batch_overfit import BatchOverfitCallback +from catalyst.callbacks.checkpoint import CheckpointCallback +from catalyst.callbacks.criterion import CriterionCallback +from catalyst.callbacks.early_stop import CheckRunCallback +from catalyst.callbacks.exception import ExceptionCallback +from catalyst.callbacks.logging import ( ConsoleLogger, - CriterionCallback, - ExceptionCallback, - IOptimizerCallback, - ISchedulerCallback, - MetricManagerCallback, - OptimizerCallback, - SchedulerCallback, TensorboardLogger, - TimerCallback, - utils, - ValidationManagerCallback, VerboseLogger, ) -from catalyst.dl.utils import check_amp_available, check_callback_isinstance +from catalyst.callbacks.metric import MetricManagerCallback +from catalyst.callbacks.optimizer import ( + AMPOptimizerCallback, + IOptimizerCallback, + OptimizerCallback, +) +from catalyst.callbacks.scheduler import ISchedulerCallback, SchedulerCallback +from catalyst.callbacks.timer import TimerCallback +from catalyst.callbacks.validation import ValidationManagerCallback +from catalyst.core.callback import Callback +from catalyst.core.experiment import IExperiment +from catalyst.data.augmentor import Augmentor, AugmentorCompose from catalyst.registry import ( CALLBACKS, CRITERIONS, @@ -38,6 +37,14 @@ TRANSFORMS, ) from catalyst.typing import Criterion, Model, Optimizer, Scheduler +from catalyst.utils.callbacks import check_callback_isinstance +from catalyst.utils.checkpoint import load_checkpoint, unpack_checkpoint +from catalyst.utils.dict import merge_dicts +from catalyst.utils.distributed import check_amp_available, get_rank +from catalyst.utils.hash import get_short_hash +from catalyst.utils.loaders import get_loaders_from_params +from catalyst.utils.misc import get_utcnow_time +from catalyst.utils.torch import any2device, get_device, process_model_params class ConfigExperiment(IExperiment): @@ -78,7 +85,7 @@ def __init__(self, config: Dict): self._prepare_logdir() - self._config["stages"]["stage_params"] = utils.merge_dicts( + self._config["stages"]["stage_params"] = merge_dicts( deepcopy( self._config["stages"].get("state_params", {}) ), # saved for backward compatibility @@ -91,8 +98,8 @@ def __init__(self, config: Dict): ) def _get_logdir(self, config: Dict) -> str: - timestamp = utils.get_utcnow_time() - config_hash = utils.get_short_hash(config) + timestamp = get_utcnow_time() + config_hash = get_short_hash(config) logdir = f"{timestamp}.{config_hash}" return logdir @@ -116,7 +123,7 @@ def _get_stages_config(self, stages_config: Dict): for key in self.STAGE_KEYWORDS: if key == "stage_params": # backward compatibility - stages_defaults[key] = utils.merge_dicts( + stages_defaults[key] = merge_dicts( deepcopy(stages_config.get("state_params", {})), deepcopy(stages_config.get(key, {})), ) @@ -133,14 +140,14 @@ def _get_stages_config(self, stages_config: Dict): for key2 in self.STAGE_KEYWORDS: if key2 == "stage_params": # backward compatibility - stages_config_out[stage][key2] = utils.merge_dicts( + stages_config_out[stage][key2] = merge_dicts( deepcopy(stages_defaults.get("state_params", {})), deepcopy(stages_defaults.get(key2, {})), deepcopy(stages_config[stage].get("state_params", {})), deepcopy(stages_config[stage].get(key2, {})), ) else: - stages_config_out[stage][key2] = utils.merge_dicts( + stages_config_out[stage][key2] = merge_dicts( deepcopy(stages_defaults.get(key2, {})), deepcopy(stages_config[stage].get(key2, {})), ) @@ -255,7 +262,7 @@ def _get_optimizer( data_params = dict(self.stages_config[stage]["data_params"]) batch_size = data_params.get("batch_size") per_gpu_scaling = data_params.get("per_gpu_scaling", False) - distributed_rank = utils.get_rank() + distributed_rank = get_rank() distributed = distributed_rank > -1 if per_gpu_scaling and not distributed: num_gpus = max(1, torch.cuda.device_count()) @@ -274,11 +281,11 @@ def _get_optimizer( assert isinstance( model, nn.Module ), "model is key-value, but optimizer has no specified model" - model_params = utils.process_model_params( + model_params = process_model_params( model, layerwise_params, no_bias_weight_decay, lr_scaling ) elif isinstance(model_key, str): - model_params = utils.process_model_params( + model_params = process_model_params( model[model_key], layerwise_params, no_bias_weight_decay, @@ -287,7 +294,7 @@ def _get_optimizer( elif isinstance(model_key, (list, tuple)): model_params = [] for model_key_el in model_key: - model_params_el = utils.process_model_params( + model_params_el = process_model_params( model[model_key_el], layerwise_params, no_bias_weight_decay, @@ -305,20 +312,20 @@ def _get_optimizer( if load_from_previous_stage and self.stages.index(stage) != 0: checkpoint_path = f"{self.logdir}/checkpoints/best_full.pth" - checkpoint = utils.load_checkpoint(checkpoint_path) + checkpoint = load_checkpoint(checkpoint_path) dict2load = optimizer if optimizer_key is not None: dict2load = {optimizer_key: optimizer} - utils.unpack_checkpoint(checkpoint, optimizer=dict2load) + unpack_checkpoint(checkpoint, optimizer=dict2load) # move optimizer to device - device = utils.get_device() + device = get_device() for param in model_params: param = param["params"][0] optimizer_state = optimizer.state[param] for state_key, state_value in optimizer_state.items(): - optimizer_state[state_key] = utils.any2device( + optimizer_state[state_key] = any2device( state_value, device ) @@ -467,7 +474,7 @@ def get_loaders( ) -> "OrderedDict[str, DataLoader]": """Returns the loaders for a given stage.""" data_params = dict(self.stages_config[stage]["data_params"]) - loaders = utils.get_loaders_from_params( + loaders = get_loaders_from_params( get_datasets_fn=self.get_datasets, initial_seed=self.initial_seed, stage=stage, diff --git a/catalyst/experiments/experiment.py b/catalyst/experiments/experiment.py index 7602a9d321..9d99315827 100644 --- a/catalyst/experiments/experiment.py +++ b/catalyst/experiments/experiment.py @@ -5,31 +5,30 @@ from torch import nn from torch.utils.data import DataLoader, Dataset -from catalyst.core import IExperiment -from catalyst.dl import ( - BatchOverfitCallback, - Callback, - CheckpointCallback, - CheckRunCallback, +from catalyst.callbacks.batch_overfit import BatchOverfitCallback +from catalyst.callbacks.checkpoint import CheckpointCallback +from catalyst.callbacks.early_stop import CheckRunCallback +from catalyst.callbacks.exception import ExceptionCallback +from catalyst.callbacks.logging import ( ConsoleLogger, - ExceptionCallback, - MetricManagerCallback, TensorboardLogger, - TimerCallback, - utils, - ValidationManagerCallback, VerboseLogger, ) -from catalyst.dl.utils import check_callback_isinstance -from catalyst.tools import settings +from catalyst.callbacks.metric import MetricManagerCallback +from catalyst.callbacks.timer import TimerCallback +from catalyst.callbacks.validation import ValidationManagerCallback +from catalyst.core.experiment import IExperiment +from catalyst.settings import SETTINGS from catalyst.typing import Criterion, Model, Optimizer, Scheduler +from catalyst.utils.callbacks import ( + check_callback_isinstance, + sort_callbacks_by_order, +) +from catalyst.utils.loaders import get_loaders_from_params class Experiment(IExperiment): - """ - Super-simple one-staged experiment, - you can use to declare experiment in code. - """ + """One-staged experiment, you can use it to declare experiments in code.""" def __init__( self, @@ -113,7 +112,7 @@ def __init__( valid_loader=valid_loader, initial_seed=initial_seed, ) - self._callbacks = utils.sort_callbacks_by_order(callbacks) + self._callbacks = sort_callbacks_by_order(callbacks) self._criterion = criterion self._optimizer = optimizer @@ -199,10 +198,10 @@ def _get_loaders( ) -> "Tuple[OrderedDict[str, DataLoader], str]": """Prepares loaders for a given stage.""" if datasets is not None: - loaders = utils.get_loaders_from_params( + loaders = get_loaders_from_params( initial_seed=initial_seed, **datasets, ) - if not stage.startswith(settings.stage_infer_prefix): # train stage + if not stage.startswith(SETTINGS.stage_infer_prefix): # train stage if len(loaders) == 1: valid_loader = list(loaders.keys())[0] warnings.warn( diff --git a/catalyst/experiments/supervised.py b/catalyst/experiments/supervised.py index 62cc2187f6..073ba2e194 100644 --- a/catalyst/experiments/supervised.py +++ b/catalyst/experiments/supervised.py @@ -2,18 +2,18 @@ from torch.optim.lr_scheduler import ReduceLROnPlateau -from catalyst.dl import ( +from catalyst.callbacks.criterion import CriterionCallback +from catalyst.callbacks.optimizer import ( AMPOptimizerCallback, - Callback, - CriterionCallback, IOptimizerCallback, - ISchedulerCallback, OptimizerCallback, - SchedulerCallback, ) -from catalyst.dl.utils import check_amp_available, check_callback_isinstance -from catalyst.experiment import Experiment +from catalyst.callbacks.scheduler import ISchedulerCallback, SchedulerCallback +from catalyst.core.callback import Callback +from catalyst.experiments.experiment import Experiment from catalyst.typing import Criterion, Optimizer, Scheduler +from catalyst.utils.callbacks import check_callback_isinstance +from catalyst.utils.distributed import check_amp_available class SupervisedExperiment(Experiment): diff --git a/catalyst/registry/registries.py b/catalyst/registry/registries.py index 59dbc5738e..3981cc4543 100644 --- a/catalyst/registry/registries.py +++ b/catalyst/registry/registries.py @@ -1,7 +1,7 @@ import logging from catalyst.registry.registry import Registry -from catalyst.tools import settings +from catalyst.settings import SETTINGS logger = logging.getLogger(__name__) @@ -26,7 +26,7 @@ def _transforms_loader(r: Registry): r.add_from_module(t, prefix=["catalyst.", "C."]) except ImportError as ex: - if settings.albumentations_required: + if SETTINGS.albumentations_required: logger.warning( "albumentations not available, to install albumentations, " "run `pip install albumentations`." @@ -38,7 +38,7 @@ def _transforms_loader(r: Registry): r.add_from_module(k, prefix=["kornia."]) except ImportError as ex: - if settings.kornia_required: + if SETTINGS.kornia_required: logger.warning( "kornia not available, to install kornia, " "run `pip install kornia`." @@ -50,7 +50,7 @@ def _transforms_loader(r: Registry): " an old version of torch which is incompatible.\n" "To update pytorch, run `pip install -U 'torch>=1.5.0'`." ) - if settings.kornia_required: + if SETTINGS.kornia_required: raise ex @@ -111,7 +111,7 @@ def _modules_loader(r: Registry): def _model_loader(r: Registry): - from catalyst.contrib import models as m + from catalyst.contrib.nn import models as m r.add_from_module(m) @@ -120,7 +120,7 @@ def _model_loader(r: Registry): r.add_from_module(smp, prefix="smp.") except ImportError as ex: - if settings.segmentation_models_required: + if SETTINGS.segmentation_models_required: logger.warning( "segmentation_models_pytorch not available," " to install segmentation_models_pytorch," diff --git a/catalyst/runners/__init__.py b/catalyst/runners/__init__.py index ce5ff0a48d..e90266d9f6 100644 --- a/catalyst/runners/__init__.py +++ b/catalyst/runners/__init__.py @@ -1,5 +1,6 @@ # flake8: noqa -from catalyst.runner.supervised import SupervisedRunner +from catalyst.runners.runner import Runner +from catalyst.runners.supervised import SupervisedRunner __all__ = ["Runner", "SupervisedRunner"] diff --git a/catalyst/runners/runner.py b/catalyst/runners/runner.py index 4e3cc75fd6..bb3929de6b 100644 --- a/catalyst/runners/runner.py +++ b/catalyst/runners/runner.py @@ -5,10 +5,23 @@ from torch.jit import ScriptModule from torch.utils.data import DataLoader, Dataset -from catalyst.core import Callback, CheckpointCallback, IStageBasedRunner -from catalyst.dl import utils -from catalyst.experiment import Experiment +from catalyst.callbacks.checkpoint import CheckpointCallback +from catalyst.core.callback import Callback +from catalyst.core.runner import IStageBasedRunner +from catalyst.experiments.experiment import Experiment from catalyst.typing import Criterion, Device, Model, Optimizer, Scheduler +from catalyst.utils.callbacks import sort_callbacks_by_order +from catalyst.utils.checkpoint import load_checkpoint, unpack_checkpoint +from catalyst.utils.components import process_components +from catalyst.utils.misc import maybe_recursive_call +from catalyst.utils.scripts import distributed_cmd_run +from catalyst.utils.seed import set_global_seed +from catalyst.utils.torch import ( + get_device, + get_requires_grad, + set_requires_grad, +) +from catalyst.utils.tracing import save_traced_model, trace_model class Runner(IStageBasedRunner): @@ -119,7 +132,7 @@ def train( "For ``load_best_on_end`` feature " "you need to specify ``logdir``" ) - callbacks = utils.sort_callbacks_by_order(callbacks) + callbacks = sort_callbacks_by_order(callbacks) checkpoint_callback_flag = any( isinstance(x, CheckpointCallback) for x in callbacks.values() ) @@ -154,7 +167,7 @@ def train( initial_seed=initial_seed, ) self.experiment = experiment - utils.distributed_cmd_run(self.run_experiment, distributed) + distributed_cmd_run(self.run_experiment, distributed) def infer( self, @@ -213,7 +226,7 @@ def infer( fp16 = {"opt_level": "O1"} if resume is not None: - callbacks = utils.sort_callbacks_by_order(callbacks) + callbacks = sort_callbacks_by_order(callbacks) checkpoint_callback_flag = any( isinstance(x, CheckpointCallback) for x in callbacks.values() ) @@ -296,12 +309,12 @@ def predict_loader( assert self.model is not None if resume is not None: - checkpoint = utils.load_checkpoint(resume) - utils.unpack_checkpoint(checkpoint, model=self.model) + checkpoint = load_checkpoint(resume) + unpack_checkpoint(checkpoint, model=self.model) self.experiment = None - utils.set_global_seed(initial_seed) - (model, _, _, _, device) = utils.process_components( # noqa: WPS122 + set_global_seed(initial_seed) + (model, _, _, _, device) = process_components( # noqa: WPS122 model=self.model, distributed_params=fp16, device=self.device, ) self._prepare_inner_state( @@ -312,9 +325,9 @@ def predict_loader( is_valid_loader=False, is_infer_loader=True, ) - utils.maybe_recursive_call(self.model, "train", mode=False) + maybe_recursive_call(self.model, "train", mode=False) - utils.set_global_seed(initial_seed) + set_global_seed(initial_seed) for batch in loader: yield self.predict_batch(batch) @@ -380,14 +393,14 @@ def trace( device = "cuda" elif device is None: if self.device is None: - self.device = utils.get_device() + self.device = get_device() device = self.device # Dumping previous state of the model, we will need it to restore device_dump, is_training_dump, requires_grad_dump = ( self.device, self.model.training, - utils.get_requires_grad(self.model), + get_requires_grad(self.model), ) self.model.to(device) @@ -400,7 +413,7 @@ def predict_fn(model, inputs, **kwargs): # noqa: WPS442 self.model = model_dump return result - traced_model = utils.trace_model( + traced_model = trace_model( model=self.model, predict_fn=predict_fn, batch=batch, @@ -413,7 +426,7 @@ def predict_fn(model, inputs, **kwargs): # noqa: WPS442 ) if logdir is not None: - utils.save_traced_model( + save_traced_model( model=traced_model, logdir=logdir, method_name=method_name, @@ -424,7 +437,7 @@ def predict_fn(model, inputs, **kwargs): # noqa: WPS442 # Restore previous state of the model getattr(self.model, "train" if is_training_dump else "eval")() - utils.set_requires_grad(self.model, requires_grad_dump) + set_requires_grad(self.model, requires_grad_dump) self.model.to(device_dump) return traced_model diff --git a/catalyst/runners/supervised.py b/catalyst/runners/supervised.py index 0f1b201142..1a1e9d9763 100644 --- a/catalyst/runners/supervised.py +++ b/catalyst/runners/supervised.py @@ -3,8 +3,8 @@ import torch -from catalyst.experiment.supervised import SupervisedExperiment -from catalyst.runner.runner import Runner +from catalyst.experiments.supervised import SupervisedExperiment +from catalyst.runners.runner import Runner from catalyst.typing import Device, RunnerModel logger = logging.getLogger(__name__) diff --git a/catalyst/settings.py b/catalyst/settings.py index 2d8206d4ec..08c582ea06 100644 --- a/catalyst/settings.py +++ b/catalyst/settings.py @@ -158,7 +158,7 @@ def parse() -> "Settings": return Settings(**kwargrs) -default_settings = Settings() +DEFAULT_SETTINGS = Settings() class ConfigFileFinder: @@ -311,7 +311,7 @@ def _parse_config(self, config_parser): config_dict: Dict[str, Any] = {} if config_parser.has_section(self.program_name): for option_name in config_parser.options(self.program_name): - type_ = default_settings.type_hint(option_name) + type_ = DEFAULT_SETTINGS.type_hint(option_name) method = type2method.get(type_, config_parser.get) config_dict[option_name] = method( self.program_name, option_name @@ -338,11 +338,15 @@ def parse(self) -> dict: return config -settings = Settings.parse() +SETTINGS = Settings.parse() +setattr(SETTINGS, "IS_GIT_AVAILABLE", IS_GIT_AVAILABLE) +setattr(SETTINGS, "IS_XLA_AVAILABLE", IS_XLA_AVAILABLE) +setattr(SETTINGS, "IS_PRUNING_AVAILABLE", IS_PRUNING_AVAILABLE) +setattr(SETTINGS, "IS_QUANTIZATION_AVAILABLE", IS_QUANTIZATION_AVAILABLE) __all__ = [ - "settings", + "SETTINGS", "Settings", "ConfigFileFinder", "MergedConfigParser", diff --git a/catalyst/tools/time_manager.py b/catalyst/tools/time_manager.py index 8f47fa8a4f..6ac05a4791 100644 --- a/catalyst/tools/time_manager.py +++ b/catalyst/tools/time_manager.py @@ -8,7 +8,7 @@ class TimeManager(object): """@TODO: Docs. Contribution is welcome.""" def __init__(self): - """@TODO: Docs. Contribution is welcome.""" + """Initialization""" self._starts = {} self.elapsed = {} diff --git a/catalyst/utils/__init__.py b/catalyst/utils/__init__.py index 01defcc892..038d4e47aa 100644 --- a/catalyst/utils/__init__.py +++ b/catalyst/utils/__init__.py @@ -6,6 +6,7 @@ Everything from :py:mod:`catalyst.contrib.utils` is included in :py:mod:`catalyst.utils` """ + from catalyst.utils.checkpoint import ( load_checkpoint, pack_checkpoint, @@ -39,10 +40,6 @@ check_amp_available, initialize_apex, assert_fp16_available, - is_wrapped_with_ddp, - is_torch_distributed_initialized, - is_slurm_available, - is_apex_available, ) from catalyst.utils.hash import get_hash, get_short_hash from catalyst.utils.initialization import ( @@ -50,7 +47,10 @@ outer_init, reset_weights_if_possible, ) -from catalyst.utils.loader import ( +from catalyst.utils.loaders import ( + get_loaders_from_params, + validate_loaders, + get_loader, get_native_batch_from_loader, get_native_batch_from_loaders, ) @@ -97,12 +97,37 @@ detach, trim_tensors, ) +from catalyst.utils.tracing import ( + trace_model, + trace_model_from_checkpoint, + trace_model_from_runner, + get_trace_name, + save_traced_model, + load_traced_model, +) + from catalyst.settings import IS_PRUNING_AVAILABLE if IS_PRUNING_AVAILABLE: from catalyst.utils.pruning import prune_model, remove_reparametrization +from catalyst.settings import IS_QUANTIZATION_AVAILABLE + +if IS_QUANTIZATION_AVAILABLE: + from catalyst.utils.quantization import ( + save_quantized_model, + quantize_model_from_checkpoint, + ) + from catalyst.settings import IS_GIT_AVAILABLE if IS_GIT_AVAILABLE: from catalyst.utils.pipelines import clone_pipeline + from catalyst.utils.wizard import run_wizard, Wizard + +from catalyst.utils.callbacks import ( + sort_callbacks_by_order, + filter_callbacks_by_node, + get_original_callback, + check_callback_isinstance, +) diff --git a/catalyst/utils/callbacks.py b/catalyst/utils/callbacks.py index d8573e24cb..2fa62a3a04 100644 --- a/catalyst/utils/callbacks.py +++ b/catalyst/utils/callbacks.py @@ -1,9 +1,8 @@ from typing import Dict, List, Union from collections import OrderedDict -from catalyst.core.callback import CallbackNode -from catalyst.core.utils import get_rank -from catalyst.dl import Callback, WrapperCallback +from catalyst.core.callback import Callback, CallbackNode, CallbackWrapper +from catalyst.utils.distributed import get_rank def get_original_callback(callback: Callback) -> Callback: @@ -15,7 +14,7 @@ def get_original_callback(callback: Callback) -> Callback: Returns: callback inside wrapper """ - while isinstance(callback, WrapperCallback): + while isinstance(callback, CallbackWrapper): callback = callback.callback return callback diff --git a/catalyst/utils/checkpoint.py b/catalyst/utils/checkpoint.py index e6ca8599dc..a0b53e0afa 100644 --- a/catalyst/utils/checkpoint.py +++ b/catalyst/utils/checkpoint.py @@ -1,4 +1,3 @@ -# flake8: noqa from typing import Callable, Dict, Union from collections import OrderedDict import os diff --git a/catalyst/utils/distributed.py b/catalyst/utils/distributed.py index 7703be184b..546bdf8c60 100644 --- a/catalyst/utils/distributed.py +++ b/catalyst/utils/distributed.py @@ -5,14 +5,12 @@ import socket import subprocess -import deprecation from packaging.version import parse, Version import torch from torch import nn import torch.distributed -from catalyst import __version__ from catalyst.utils.misc import get_fn_default_params from catalyst.utils.torch import get_available_gpus @@ -173,7 +171,6 @@ def get_distributed_mean(value: Union[float, torch.Tensor]): def get_slurm_params(): - """@TODO: Docs. Contribution is welcome.""" cmd = "scontrol show hostnames '%s'" % os.environ["SLURM_JOB_NODELIST"] nodes = subprocess.getoutput(cmd).split() num_nodes = int(os.environ["SLURM_JOB_NUM_NODES"]) @@ -186,7 +183,6 @@ def get_slurm_params(): def get_distributed_params(): - """@TODO: Docs. Contribution is welcome.""" master_port = str(random.randint(5 * 10 ** 4, 6 * 10 ** 4)) master_addr = "127.0.0.1" cur_node, num_nodes = 0, 1 @@ -220,7 +216,6 @@ def get_distributed_params(): def get_distributed_env( local_rank, rank, world_size, use_cuda_visible_devices=True ): - """@TODO: Docs. Contribution is welcome.""" env = os.environ.copy() env["RANK"] = str(rank) env["WORLD_SIZE"] = str(world_size) @@ -232,52 +227,6 @@ def get_distributed_env( return env -@deprecation.deprecated( - deprecated_in="20.05", - removed_in="20.06", - current_version=__version__, - details="Use check_ddp_wrapped instead.", -) -def is_wrapped_with_ddp(model: nn.Module) -> bool: - """ - Checks whether model is wrapped with DataParallel/DistributedDataParallel. - """ - return check_ddp_wrapped(model) - - -@deprecation.deprecated( - deprecated_in="20.05", - removed_in="20.06", - current_version=__version__, - details="Use check_torch_distributed_initialized instead.", -) -def is_torch_distributed_initialized() -> bool: - """Checks if torch.distributed is available and initialized.""" - return check_torch_distributed_initialized() - - -@deprecation.deprecated( - deprecated_in="20.05", - removed_in="20.06", - current_version=__version__, - details="Use check_slurm_available instead.", -) -def is_slurm_available() -> bool: - """Checks if slurm is available.""" - return check_slurm_available() - - -@deprecation.deprecated( - deprecated_in="20.05", - removed_in="20.06", - current_version=__version__, - details="Use check_apex_available instead.", -) -def is_apex_available() -> bool: - """Checks if apex is available.""" - return check_apex_available() - - __all__ = [ "check_ddp_wrapped", "check_apex_available", @@ -292,8 +241,4 @@ def is_apex_available() -> bool: "get_distributed_env", "get_distributed_params", "get_slurm_params", - "is_wrapped_with_ddp", - "is_torch_distributed_initialized", - "is_slurm_available", - "is_apex_available", ] diff --git a/catalyst/utils/loader.py b/catalyst/utils/loader.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/catalyst/utils/loaders.py b/catalyst/utils/loaders.py index 7ccb2e2036..ce4cf80a5a 100644 --- a/catalyst/utils/loaders.py +++ b/catalyst/utils/loaders.py @@ -1,4 +1,4 @@ -from typing import Any, Callable, Dict, Iterable +from typing import Any, Callable, Dict, Iterable, Union from collections import OrderedDict from copy import copy import warnings @@ -7,11 +7,12 @@ from torch.utils.data import DataLoader, Dataset, DistributedSampler from torch.utils.data.dataloader import default_collate as default_collate_fn -from catalyst.data import DistributedSamplerWrapper, ListDataset +from catalyst.data.dataset import ListDataset +from catalyst.data.sampler import DistributedSamplerWrapper from catalyst.registry import SAMPLER -from catalyst.utils import get_rank, merge_dicts, set_global_seed - -from typing import Dict, Union # isort:skip +from catalyst.utils.dict import merge_dicts +from catalyst.utils.distributed import get_rank +from catalyst.utils.seed import set_global_seed def get_loader( diff --git a/catalyst/utils/parser.py b/catalyst/utils/parser.py index 44068d08f0..82f5033dc4 100644 --- a/catalyst/utils/parser.py +++ b/catalyst/utils/parser.py @@ -6,7 +6,6 @@ def parse_config_args(*, config, args, unknown_args): - """@TODO: Docs. Contribution is welcome.""" for arg in unknown_args: arg_name, value = arg.split("=") arg_name = arg_name.lstrip("-").strip("/") diff --git a/catalyst/utils/quantization.py b/catalyst/utils/quantization.py index a94f9a4336..de7f73a6d5 100644 --- a/catalyst/utils/quantization.py +++ b/catalyst/utils/quantization.py @@ -6,7 +6,7 @@ from torch import quantization from torch.nn import Module -from catalyst.tools import Model +from catalyst.typing import Model from catalyst.utils import ( load_checkpoint, load_config, @@ -15,7 +15,7 @@ ) if TYPE_CHECKING: - from catalyst.experiment import ConfigExperiment + from catalyst.experiments import ConfigExperiment logger = logging.getLogger(__name__) diff --git a/catalyst/utils/tracing.py b/catalyst/utils/tracing.py index fa386e31ec..c6fff48dad 100644 --- a/catalyst/utils/tracing.py +++ b/catalyst/utils/tracing.py @@ -1,10 +1,4 @@ -from typing import ( # isort:skip - Any, - Callable, - Dict, - List, - Union, -) +from typing import Any, Callable, Dict, List, TYPE_CHECKING, Union import inspect import logging from pathlib import Path @@ -12,23 +6,29 @@ from torch import jit, nn from catalyst.core.runner import IRunner -from catalyst.experiment import ConfigExperiment from catalyst.typing import Device, Model -from catalyst.utils import ( - any2device, +from catalyst.utils.checkpoint import ( + load_checkpoint, + pack_checkpoint, + unpack_checkpoint, +) +from catalyst.utils.config import load_config +from catalyst.utils.distributed import ( assert_fp16_available, - get_fn_argsnames, - get_native_batch_from_loaders, get_nn_from_ddp_module, +) +from catalyst.utils.loaders import get_native_batch_from_loaders +from catalyst.utils.misc import get_fn_argsnames +from catalyst.utils.scripts import prepare_config_api_components +from catalyst.utils.torch import ( + any2device, get_requires_grad, - load_checkpoint, - load_config, - pack_checkpoint, - prepare_config_api_components, set_requires_grad, - unpack_checkpoint, ) +if TYPE_CHECKING: + from catalyst.experiments import ConfigExperiment + logger = logging.getLogger(__name__) diff --git a/catalyst/utils/wizard.py b/catalyst/utils/wizard.py index c17fb14383..610bf2e2e0 100644 --- a/catalyst/utils/wizard.py +++ b/catalyst/utils/wizard.py @@ -5,8 +5,8 @@ import yaml from catalyst import registry -from catalyst.utils import clone_pipeline, import_module -from catalyst.utils.pipelines import URLS +from catalyst.utils.pipelines import clone_pipeline, URLS +from catalyst.utils.scripts import import_module yaml.add_representer( OrderedDict, From fcd3843c721066600dcb38fe0398ab9952152348 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 13:24:18 +0300 Subject: [PATCH 06/30] imports2 --- catalyst/callbacks/__init__.py | 56 +++++- catalyst/callbacks/batch_overfit.py | 9 +- catalyst/callbacks/checkpoint.py | 28 +-- catalyst/callbacks/control_flow.py | 10 +- catalyst/callbacks/criterion.py | 8 +- catalyst/callbacks/early_stop.py | 12 +- catalyst/callbacks/exception.py | 8 +- catalyst/callbacks/logging.py | 30 +-- catalyst/callbacks/meter.py | 12 +- catalyst/callbacks/metric.py | 30 +-- catalyst/callbacks/metrics/__init__.py | 23 +++ catalyst/callbacks/metrics/accuracy.py | 12 +- catalyst/callbacks/metrics/auc.py | 10 +- catalyst/callbacks/metrics/cmc_score.py | 10 +- catalyst/callbacks/metrics/dice.py | 26 ++- catalyst/callbacks/metrics/f1_score.py | 6 +- catalyst/callbacks/metrics/iou.py | 6 +- catalyst/callbacks/metrics/ppv_tpr_f1.py | 7 +- catalyst/callbacks/metrics/precision.py | 8 +- catalyst/callbacks/optimizer.py | 24 +-- catalyst/callbacks/periodic_loader.py | 12 +- catalyst/callbacks/pruning.py | 9 +- catalyst/callbacks/quantization.py | 11 +- catalyst/callbacks/scheduler.py | 36 ++-- catalyst/callbacks/tests/test_early_stop.py | 2 +- .../tests/test_optimizer_callback.py | 2 +- catalyst/callbacks/timer.py | 14 +- catalyst/callbacks/tracing.py | 23 ++- catalyst/callbacks/validation.py | 9 +- catalyst/contrib/callbacks/__init__.py | 25 +-- catalyst/contrib/callbacks/alchemy_logger.py | 12 +- ...n_matrix.py => confusion_matrix_logger.py} | 6 +- catalyst/contrib/callbacks/cutmix_callback.py | 14 +- catalyst/contrib/callbacks/gradnorm_logger.py | 8 +- .../{inference.py => inference_callback.py} | 14 +- catalyst/contrib/callbacks/knn_metric.py | 12 +- .../contrib/callbacks/kornia_transform.py | 14 +- catalyst/contrib/callbacks/mask_inference.py | 15 +- .../callbacks/{mixup.py => mixup_callback.py} | 0 catalyst/contrib/callbacks/neptune_logger.py | 10 +- catalyst/contrib/callbacks/optuna_callback.py | 7 +- .../contrib/callbacks/perplexity_metric.py | 2 +- catalyst/contrib/callbacks/telegram_logger.py | 22 ++- .../callbacks/tests/test_gradnorm_logger.py | 3 +- .../callbacks/tests/test_optuna_callback.py | 2 +- .../callbacks/tests/test_tracer_callback.py | 13 +- catalyst/contrib/callbacks/wandb_logger.py | 20 +- catalyst/{utils => }/metrics/accuracy.py | 0 catalyst/{utils => }/metrics/auc.py | 0 catalyst/{utils => }/metrics/cmc_score.py | 0 catalyst/{utils => }/metrics/dice.py | 0 catalyst/{utils => }/metrics/f1_score.py | 0 catalyst/{utils => }/metrics/focal.py | 0 catalyst/metrics/functional.py | 180 ++++++++++++++++- catalyst/{utils => }/metrics/iou.py | 0 catalyst/{utils => }/metrics/precision.py | 0 .../{utils => }/metrics/tests/__init__.py | 0 .../metrics/tests/test_accuracy.py | 0 .../{utils => }/metrics/tests/test_auc.py | 0 .../metrics/tests/test_average_precision.py | 0 .../metrics/tests/test_cmc_metric.py | 0 .../{utils => }/metrics/tests/test_dice.py | 0 .../{utils => }/metrics/tests/test_iou.py | 0 catalyst/utils/metrics/__init__.py | 18 +- catalyst/utils/metrics/functional.py | 181 ------------------ docs/api/dl.rst | 2 +- tests/_tests_dl_callbacks/config20.yml | 2 +- 67 files changed, 586 insertions(+), 449 deletions(-) rename catalyst/contrib/callbacks/{confusion_matrix.py => confusion_matrix_logger.py} (96%) rename catalyst/contrib/callbacks/{inference.py => inference_callback.py} (84%) rename catalyst/contrib/callbacks/{mixup.py => mixup_callback.py} (100%) rename catalyst/{utils => }/metrics/accuracy.py (100%) rename catalyst/{utils => }/metrics/auc.py (100%) rename catalyst/{utils => }/metrics/cmc_score.py (100%) rename catalyst/{utils => }/metrics/dice.py (100%) rename catalyst/{utils => }/metrics/f1_score.py (100%) rename catalyst/{utils => }/metrics/focal.py (100%) rename catalyst/{utils => }/metrics/iou.py (100%) rename catalyst/{utils => }/metrics/precision.py (100%) rename catalyst/{utils => }/metrics/tests/__init__.py (100%) rename catalyst/{utils => }/metrics/tests/test_accuracy.py (100%) rename catalyst/{utils => }/metrics/tests/test_auc.py (100%) rename catalyst/{utils => }/metrics/tests/test_average_precision.py (100%) rename catalyst/{utils => }/metrics/tests/test_cmc_metric.py (100%) rename catalyst/{utils => }/metrics/tests/test_dice.py (100%) rename catalyst/{utils => }/metrics/tests/test_iou.py (100%) delete mode 100644 catalyst/utils/metrics/functional.py diff --git a/catalyst/callbacks/__init__.py b/catalyst/callbacks/__init__.py index ca3d04b802..b8c117bd36 100644 --- a/catalyst/callbacks/__init__.py +++ b/catalyst/callbacks/__init__.py @@ -5,16 +5,56 @@ IS_PRUNING_AVAILABLE, ) -from catalyst.dl.callbacks.confusion_matrix import ConfusionMatrixCallback -from catalyst.dl.callbacks.inference import InferCallback -from catalyst.dl.callbacks.meter import MeterMetricsCallback -from catalyst.dl.callbacks.mixup import MixupCallback -from catalyst.dl.callbacks.scheduler import LRFinder -from catalyst.dl.callbacks.tracing import TracerCallback +from catalyst.callbacks.batch_overfit import BatchOverfitCallback +from catalyst.callbacks.checkpoint import ( + ICheckpointCallback, + BaseCheckpointCallback, + CheckpointCallback, + IterationCheckpointCallback, +) +from catalyst.callbacks.control_flow import ControlFlowCallback +from catalyst.callbacks.criterion import CriterionCallback +from catalyst.callbacks.early_stop import ( + EarlyStoppingCallback, + CheckRunCallback, +) +from catalyst.callbacks.logging import ( + ILoggerCallback, + VerboseLogger, + ConsoleLogger, + TensorboardLogger, +) +from catalyst.callbacks.meter import MeterMetricsCallback +from catalyst.callbacks.metric import ( + IMetricCallback, + IBatchMetricCallback, + ILoaderMetricCallback, + BatchMetricCallback, + LoaderMetricCallback, + MetricCallback, + MetricAggregationCallback, + MetricManagerCallback, +) +from catalyst.callbacks.optimizer import ( + IOptimizerCallback, + OptimizerCallback, + AMPOptimizerCallback, +) +from catalyst.callbacks.periodic_loader import PeriodicLoaderCallback +from catalyst.callbacks.scheduler import ( + ISchedulerCallback, + ILRUpdater, + SchedulerCallback, + LRFinder, +) +from catalyst.callbacks.timer import TimerCallback +from catalyst.callbacks.tracing import TracingCallback, TracerCallback +from catalyst.callbacks.validation import ValidationManagerCallback + from catalyst.callbacks.metrics import * if IS_QUANTIZATION_AVAILABLE: - from catalyst.dl.callbacks.quantization import DynamicQuantizationCallback + from catalyst.callbacks.quantization import DynamicQuantizationCallback if IS_PRUNING_AVAILABLE: - from catalyst.dl.callbacks.pruning import PruningCallback + from catalyst.callbacks.pruning import PruningCallback diff --git a/catalyst/callbacks/batch_overfit.py b/catalyst/callbacks/batch_overfit.py index 01558300a4..76a137b563 100644 --- a/catalyst/callbacks/batch_overfit.py +++ b/catalyst/callbacks/batch_overfit.py @@ -1,9 +1,12 @@ +from typing import TYPE_CHECKING from collections import OrderedDict from catalyst.core.callback import Callback, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.data.loader import BatchLimitLoaderWrapper +if TYPE_CHECKING: + from catalyst.core.runner import IRunner + class BatchOverfitCallback(Callback): """Callback for ovefitting loaders with specified number of batches. @@ -96,7 +99,7 @@ def __init__(self, **kwargs): ) self.loader_batches[loader] = num_batches - def on_epoch_start(self, runner: IRunner) -> None: + def on_epoch_start(self, runner: "IRunner") -> None: """ Wraps loaders for current epoch. If number-of-batches for loader is not provided then the first batch @@ -117,7 +120,7 @@ def on_epoch_start(self, runner: IRunner) -> None: runner.loaders = epoch_loaders - def on_epoch_end(self, runner: IRunner): + def on_epoch_end(self, runner: "IRunner"): """ Unwraps loaders for current epoch. diff --git a/catalyst/callbacks/checkpoint.py b/catalyst/callbacks/checkpoint.py index 2758be7c6c..46a17fe2dc 100644 --- a/catalyst/callbacks/checkpoint.py +++ b/catalyst/callbacks/checkpoint.py @@ -1,10 +1,9 @@ -from typing import Callable, Dict, Tuple, Union +from typing import Callable, Dict, Tuple, TYPE_CHECKING, Union from collections import OrderedDict import os from pathlib import Path from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.utils.checkpoint import ( load_checkpoint, pack_checkpoint, @@ -14,8 +13,11 @@ from catalyst.utils.config import save_config from catalyst.utils.misc import is_exception +if TYPE_CHECKING: + from catalyst.core.runner import IRunner -def _pack_runner(runner: IRunner): + +def _pack_runner(runner: "IRunner"): checkpoint = pack_checkpoint( model=runner.model, criterion=runner.criterion, @@ -37,7 +39,7 @@ def _pack_runner(runner: IRunner): def _load_checkpoint( - *, filename, runner: IRunner, load_full: bool = True + *, filename, runner: "IRunner", load_full: bool = True ) -> None: """ Load checkpoint from a file. @@ -143,7 +145,7 @@ def _required_files(logdir: str, load_map: Dict[str, str]) -> Dict[str, str]: def _load_states_from_file_map( - *, runner: IRunner, load_map: Dict[str, str] + *, runner: "IRunner", load_map: Dict[str, str] ) -> None: """ Load state of a model, criterion, optimizer, scheduler @@ -209,7 +211,7 @@ def _get_checkpoint_suffix(self, checkpoint: dict) -> str: def _save_metric(self, logdir: Union[str, Path], metrics: Dict) -> None: save_config(metrics, f"{logdir}/checkpoints/{self.metrics_filename}") - def on_exception(self, runner: IRunner): + def on_exception(self, runner: "IRunner"): """ Expection handler. @@ -521,7 +523,7 @@ def process_checkpoint( @staticmethod def _load_runner( - runner: IRunner, + runner: "IRunner", mapping: Union[str, Dict[str, str]], load_full: bool = False, ) -> None: @@ -547,7 +549,7 @@ def _load_runner( runner=runner, load_map=mapping, ) - def on_stage_start(self, runner: IRunner) -> None: + def on_stage_start(self, runner: "IRunner") -> None: """Setup model for stage. .. note:: @@ -611,7 +613,7 @@ def on_stage_start(self, runner: IRunner) -> None: load_full=need_load_full, ) - def on_epoch_end(self, runner: IRunner) -> None: + def on_epoch_end(self, runner: "IRunner") -> None: """ Collect and save checkpoint after epoch. @@ -634,7 +636,7 @@ def on_epoch_end(self, runner: IRunner) -> None: minimize_metric=runner.minimize_metric, ) - def on_stage_end(self, runner: IRunner) -> None: + def on_stage_end(self, runner: "IRunner") -> None: """ Show information about best checkpoints during the stage and load model specified in ``load_on_stage_end``. @@ -814,7 +816,7 @@ def process_checkpoint( self._save_metric(logdir, metrics) print(f"\nSaved checkpoint at {filepath}") - def on_stage_start(self, runner: IRunner): + def on_stage_start(self, runner: "IRunner"): """ Reset iterations counter. @@ -830,7 +832,7 @@ def on_stage_start(self, runner: IRunner): from torch import save self._save_fn = save - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): """ Save checkpoint based on batches count. @@ -846,7 +848,7 @@ def on_batch_end(self, runner: IRunner): batch_metrics=runner.batch_metrics, ) - def on_stage_end(self, runner: IRunner): + def on_stage_end(self, runner: "IRunner"): """ Load model specified in ``load_on_stage_end``. diff --git a/catalyst/callbacks/control_flow.py b/catalyst/callbacks/control_flow.py index bce7d30a1d..2909df0bf0 100644 --- a/catalyst/callbacks/control_flow.py +++ b/catalyst/callbacks/control_flow.py @@ -1,12 +1,14 @@ -from typing import Callable, Mapping, Sequence, Union +from typing import Callable, Mapping, Sequence, TYPE_CHECKING, Union from collections import OrderedDict from catalyst.core.callback import Callback, CallbackWrapper -from catalyst.core.runner import IRunner LOADERS = Union[str, Sequence[str], Mapping[str, Union[int, Sequence[int]]]] FILTER_FN = Callable[[str, int, str], bool] +if TYPE_CHECKING: + from catalyst.core.runner import IRunner + def _filter_fn_from_epochs( epochs: Union[int, float, Sequence[int]], reverse_condition: bool @@ -369,7 +371,7 @@ def __init__( elif filter_fn is not None: self.filter_fn = _filter_fn_from_arg(filter_fn) - def on_loader_start(self, runner: IRunner) -> None: + def on_loader_start(self, runner: "IRunner") -> None: """ Check if current epoch should be skipped. @@ -386,7 +388,7 @@ def on_loader_start(self, runner: IRunner) -> None: if self._is_enabled: self.callback.on_loader_start(runner) - def on_loader_end(self, runner: IRunner) -> None: + def on_loader_end(self, runner: "IRunner") -> None: """ Reset status of callback diff --git a/catalyst/callbacks/criterion.py b/catalyst/callbacks/criterion.py index 3b97ede75d..0014d50360 100644 --- a/catalyst/callbacks/criterion.py +++ b/catalyst/callbacks/criterion.py @@ -1,7 +1,9 @@ -from typing import Dict, List, Union +from typing import Dict, List, TYPE_CHECKING, Union from catalyst.callbacks.metric import IBatchMetricCallback -from catalyst.core.runner import IRunner + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class CriterionCallback(IBatchMetricCallback): @@ -47,7 +49,7 @@ def metric_fn(self): """Criterion function.""" return self._criterion - def on_stage_start(self, runner: IRunner): + def on_stage_start(self, runner: "IRunner"): """Checks that the current stage has correct criterion. Args: diff --git a/catalyst/callbacks/early_stop.py b/catalyst/callbacks/early_stop.py index b941fd88e5..11e3986197 100644 --- a/catalyst/callbacks/early_stop.py +++ b/catalyst/callbacks/early_stop.py @@ -1,5 +1,9 @@ +from typing import TYPE_CHECKING + from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.runner import IRunner + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class CheckRunCallback(Callback): @@ -15,7 +19,7 @@ def __init__(self, num_batch_steps: int = 3, num_epoch_steps: int = 2): self.num_batch_steps = num_batch_steps self.num_epoch_steps = num_epoch_steps - def on_epoch_end(self, runner: IRunner): + def on_epoch_end(self, runner: "IRunner"): """Check if iterated specified number of epochs. Args: @@ -24,7 +28,7 @@ def on_epoch_end(self, runner: IRunner): if runner.epoch >= self.num_epoch_steps: runner.need_early_stop = True - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): """Check if iterated specified number of batches. Args: @@ -110,7 +114,7 @@ def __init__( else: self.is_better = lambda score, best: score >= (best + min_delta) - def on_epoch_end(self, runner: IRunner) -> None: + def on_epoch_end(self, runner: "IRunner") -> None: """Check if should be performed early stopping. Args: diff --git a/catalyst/callbacks/exception.py b/catalyst/callbacks/exception.py index ee1976bb9a..72a2c46213 100644 --- a/catalyst/callbacks/exception.py +++ b/catalyst/callbacks/exception.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.utils.misc import is_exception +if TYPE_CHECKING: + from catalyst.core.runner import IRunner + class ExceptionCallback(Callback): """Handles python exceptions during run.""" @@ -12,7 +16,7 @@ def __init__(self): order=CallbackOrder.external + 1, node=CallbackNode.all ) - def on_exception(self, runner: IRunner) -> None: + def on_exception(self, runner: "IRunner") -> None: """Exception handle hook. Args: diff --git a/catalyst/callbacks/logging.py b/catalyst/callbacks/logging.py index 0ec7ec510d..6e2a24b2d1 100644 --- a/catalyst/callbacks/logging.py +++ b/catalyst/callbacks/logging.py @@ -1,4 +1,4 @@ -from typing import Dict, List +from typing import Dict, List, TYPE_CHECKING import logging import os import sys @@ -8,10 +8,12 @@ from catalyst.callbacks.formatters import TxtMetricsFormatter from catalyst.contrib.tools.tensorboard import SummaryWriter from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.utils.dict import split_dict_to_subdicts from catalyst.utils.misc import is_exception +if TYPE_CHECKING: + from catalyst.core.runner import IRunner + class ILoggerCallback(Callback): """Logger callback interface, abstraction over logging step""" @@ -58,7 +60,7 @@ def _need_show(self, key: str): return result - def on_loader_start(self, runner: IRunner): + def on_loader_start(self, runner: "IRunner"): """Init tqdm progress bar.""" self.step = 0 self.tqdm = tqdm( @@ -70,7 +72,7 @@ def on_loader_start(self, runner: IRunner): file=sys.stdout, ) - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): """Update tqdm progress bar at the end of each batch.""" self.tqdm.set_postfix( **{ @@ -81,7 +83,7 @@ def on_batch_end(self, runner: IRunner): ) self.tqdm.update() - def on_loader_end(self, runner: IRunner): + def on_loader_end(self, runner: "IRunner"): """Cleanup and close tqdm progress bar.""" # self.tqdm.visible = False # self.tqdm.leave = True @@ -91,7 +93,7 @@ def on_loader_end(self, runner: IRunner): self.tqdm = None self.step = 0 - def on_exception(self, runner: IRunner): + def on_exception(self, runner: "IRunner"): """Called if an Exception was raised.""" exception = runner.exception if not is_exception(exception): @@ -143,7 +145,7 @@ def _clean_logger(logger): handler.close() logger.handlers = [] - def on_stage_start(self, runner: IRunner): + def on_stage_start(self, runner: "IRunner"): """Prepare ``runner.logdir`` for the current stage.""" if runner.logdir: runner.logdir.mkdir(parents=True, exist_ok=True) @@ -151,7 +153,7 @@ def on_stage_start(self, runner: IRunner): self._clean_logger(self.logger) self._setup_logger(self.logger, runner.logdir) - def on_epoch_end(self, runner: IRunner): + def on_epoch_end(self, runner: "IRunner"): """ Translate ``runner.metric_manager`` to console and text file at the end of an epoch. @@ -161,7 +163,7 @@ def on_epoch_end(self, runner: IRunner): """ self.logger.info("", extra={"runner": runner}) - def on_stage_end(self, runner: IRunner): + def on_stage_end(self, runner: "IRunner"): """Called at the end of each stage.""" self._clean_logger(self.logger) @@ -206,7 +208,7 @@ def _log_metrics( f"{name}{suffix}", metrics[name], step ) - def on_stage_start(self, runner: IRunner) -> None: + def on_stage_start(self, runner: "IRunner") -> None: """Stage start hook. Check ``logdir`` correctness. Args: @@ -218,13 +220,13 @@ def on_stage_start(self, runner: IRunner) -> None: log_dir = os.path.join(runner.logdir, f"{extra_mode}_log") self.loggers[extra_mode] = SummaryWriter(log_dir) - def on_loader_start(self, runner: IRunner): + def on_loader_start(self, runner: "IRunner"): """Prepare tensorboard writers for the current stage.""" if runner.loader_name not in self.loggers: log_dir = os.path.join(runner.logdir, f"{runner.loader_name}_log") self.loggers[runner.loader_name] = SummaryWriter(log_dir) - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): """Translate batch metrics to tensorboard.""" if runner.logdir is None: return @@ -239,7 +241,7 @@ def on_batch_end(self, runner: IRunner): suffix="/batch", ) - def on_epoch_end(self, runner: IRunner): + def on_epoch_end(self, runner: "IRunner"): """Translate epoch metrics to tensorboard.""" if runner.logdir is None: return @@ -263,7 +265,7 @@ def on_epoch_end(self, runner: IRunner): for logger in self.loggers.values(): logger.flush() - def on_stage_end(self, runner: IRunner): + def on_stage_end(self, runner: "IRunner"): """Close opened tensorboard writers.""" if runner.logdir is None: return diff --git a/catalyst/callbacks/meter.py b/catalyst/callbacks/meter.py index dcca9f5b95..94ecc9dce9 100644 --- a/catalyst/callbacks/meter.py +++ b/catalyst/callbacks/meter.py @@ -1,12 +1,14 @@ -from typing import List +from typing import List, TYPE_CHECKING from collections import defaultdict import numpy as np from catalyst.core.callback import Callback, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.utils.torch import get_activation_fn +if TYPE_CHECKING: + from catalyst.core.runner import IRunner + class MeterMetricsCallback(Callback): """ @@ -58,7 +60,7 @@ def _reset_stats(self): for meter in self.meters: meter.reset() - def on_loader_start(self, runner: IRunner): + def on_loader_start(self, runner: "IRunner"): """Loader start hook. Args: @@ -66,7 +68,7 @@ def on_loader_start(self, runner: IRunner): """ self._reset_stats() - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): """Batch end hook. Computes batch metrics. Args: @@ -79,7 +81,7 @@ def on_batch_end(self, runner: IRunner): for i in range(self.num_classes): self.meters[i].add(probabilities[:, i], targets[:, i]) - def on_loader_end(self, runner: IRunner): + def on_loader_end(self, runner: "IRunner"): """Loader end hook. Computes loader metrics. Args: diff --git a/catalyst/callbacks/metric.py b/catalyst/callbacks/metric.py index dea09670fe..43ef3a9e6e 100644 --- a/catalyst/callbacks/metric.py +++ b/catalyst/callbacks/metric.py @@ -1,4 +1,4 @@ -from typing import Any, Callable, Dict, List, Union +from typing import Any, Callable, Dict, List, TYPE_CHECKING, Union from abc import ABC, abstractmethod from collections import defaultdict import logging @@ -8,11 +8,13 @@ import torch from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.tools.meters.averagevaluemeter import AverageValueMeter from catalyst.utils.dict import get_dictkey_auto_fn from catalyst.utils.distributed import get_distributed_mean +if TYPE_CHECKING: + from catalyst.core.runner import IRunner + logger = logging.getLogger(__name__) @@ -149,7 +151,7 @@ class IBatchMetricCallback(IMetricCallback): Computes metric on batch and saves for logging. """ - def on_batch_end(self, runner: IRunner) -> None: + def on_batch_end(self, runner: "IRunner") -> None: """Computes metrics and add them to batch metrics.""" metrics = self._compute_metric(runner.output, runner.input) metrics = self._process_computed_metric(metrics) @@ -174,12 +176,12 @@ def __init__(self, **kwargs): self.input = defaultdict(lambda: []) self.output = defaultdict(lambda: []) - def on_loader_start(self, runner: IRunner): + def on_loader_start(self, runner: "IRunner"): """Reinitialises internal storage.""" self.input = defaultdict(lambda: []) self.output = defaultdict(lambda: []) - def on_batch_end(self, runner: IRunner) -> None: + def on_batch_end(self, runner: "IRunner") -> None: """Stores new input/output for the metric computation.""" output = self._get_output(runner.output, self.output_key) input = self._get_input(runner.input, self.input_key) @@ -191,7 +193,7 @@ def on_batch_end(self, runner: IRunner) -> None: else: storage["_data"].append(data.detach().cpu().numpy()) - def on_loader_end(self, runner: IRunner): + def on_loader_end(self, runner: "IRunner"): """Computes loader-based metric. Args: @@ -386,7 +388,7 @@ def _process_metrics(self, metrics: Dict): metric_aggregated = self.aggregation_fn(metrics_processed) metrics[self.prefix] = metric_aggregated - def on_batch_end(self, runner: IRunner) -> None: + def on_batch_end(self, runner: "IRunner") -> None: """Computes the metric and add it to the batch metrics. Args: @@ -395,7 +397,7 @@ def on_batch_end(self, runner: IRunner) -> None: if self.scope == "batch": self._process_metrics(runner.batch_metrics) - def on_loader_end(self, runner: IRunner): + def on_loader_end(self, runner: "IRunner"): """Computes the metric and add it to the loader metrics. Args: @@ -404,7 +406,7 @@ def on_loader_end(self, runner: IRunner): if self.scope == "loader": self._process_metrics(runner.loader_metrics) - def on_epoch_end(self, runner: IRunner): + def on_epoch_end(self, runner: "IRunner"): """Computes the metric and add it to the epoch metrics. Args: @@ -451,7 +453,7 @@ def _process_metrics(metrics: Dict[str, Any]): output[key] = value return output - def on_epoch_start(self, runner: IRunner) -> None: + def on_epoch_start(self, runner: "IRunner") -> None: """Epoch start hook. Args: @@ -459,7 +461,7 @@ def on_epoch_start(self, runner: IRunner) -> None: """ runner.epoch_metrics = defaultdict(None) - def on_loader_start(self, runner: IRunner) -> None: + def on_loader_start(self, runner: "IRunner") -> None: """Loader start hook. Args: @@ -468,7 +470,7 @@ def on_loader_start(self, runner: IRunner) -> None: runner.loader_metrics = defaultdict(None) self.meters = defaultdict(AverageValueMeter) - def on_batch_start(self, runner: IRunner) -> None: + def on_batch_start(self, runner: "IRunner") -> None: """Batch start hook. Args: @@ -476,7 +478,7 @@ def on_batch_start(self, runner: IRunner) -> None: """ runner.batch_metrics = defaultdict(None) - def on_batch_end(self, runner: IRunner) -> None: + def on_batch_end(self, runner: "IRunner") -> None: """Batch end hook. Args: @@ -486,7 +488,7 @@ def on_batch_end(self, runner: IRunner) -> None: for key, value in runner.batch_metrics.items(): self.meters[key].add(value, runner.batch_size) - def on_loader_end(self, runner: IRunner) -> None: + def on_loader_end(self, runner: "IRunner") -> None: """Loader end hook. Args: diff --git a/catalyst/callbacks/metrics/__init__.py b/catalyst/callbacks/metrics/__init__.py index 9c0fa90a19..e318c94ac1 100644 --- a/catalyst/callbacks/metrics/__init__.py +++ b/catalyst/callbacks/metrics/__init__.py @@ -1 +1,24 @@ # flake8: noqa + +from catalyst.callbacks.metrics.accuracy import ( + AccuracyCallback, + MultiLabelAccuracyCallback, +) +from catalyst.callbacks.metrics.auc import AUCCallback +from catalyst.callbacks.metrics.cmc_score import CMCScoreCallback +from catalyst.callbacks.metrics.dice import ( + DiceCallback, + MultiClassDiceMetricCallback, + MulticlassDiceMetricCallback, +) +from catalyst.callbacks.metrics.f1_score import F1ScoreCallback +from catalyst.callbacks.metrics.iou import ( + IouCallback, + JaccardCallback, + ClasswiseIouCallback, + ClasswiseJaccardCallback, +) +from catalyst.callbacks.metrics.ppv_tpr_f1 import ( + PrecisionRecallF1ScoreCallback, +) +from catalyst.callbacks.metrics.precision import AveragePrecisionCallback diff --git a/catalyst/callbacks/metrics/accuracy.py b/catalyst/callbacks/metrics/accuracy.py index ea12a58088..565a9f87a9 100644 --- a/catalyst/callbacks/metrics/accuracy.py +++ b/catalyst/callbacks/metrics/accuracy.py @@ -1,8 +1,8 @@ from typing import List -from catalyst.core import BatchMetricCallback -from catalyst.utils import metrics -from catalyst.utils.metrics.functional import ( +from catalyst.callbacks.metric import BatchMetricCallback +from catalyst.metrics.accuracy import accuracy, multi_label_accuracy +from catalyst.metrics.functional import ( get_default_topk_args, wrap_topk_metric2dict, ) @@ -51,9 +51,7 @@ def __init__( super().__init__( prefix=prefix, - metric_fn=wrap_topk_metric2dict( - metrics.accuracy, topk_args=topk_args - ), + metric_fn=wrap_topk_metric2dict(accuracy, topk_args=topk_args), input_key=input_key, output_key=output_key, multiplier=multiplier, @@ -91,7 +89,7 @@ def __init__( """ super().__init__( prefix=prefix, - metric_fn=metrics.multi_label_accuracy, + metric_fn=multi_label_accuracy, input_key=input_key, output_key=output_key, threshold=threshold, diff --git a/catalyst/callbacks/metrics/auc.py b/catalyst/callbacks/metrics/auc.py index 76557294a0..0671fca22f 100644 --- a/catalyst/callbacks/metrics/auc.py +++ b/catalyst/callbacks/metrics/auc.py @@ -1,8 +1,8 @@ from typing import List -from catalyst.core.callbacks import LoaderMetricCallback -from catalyst.utils import metrics -from catalyst.utils.metrics.functional import wrap_class_metric2dict +from catalyst.callbacks.metric import LoaderMetricCallback +from catalyst.metrics.auc import auc +from catalyst.metrics.functional import wrap_class_metric2dict class AUCCallback(LoaderMetricCallback): @@ -34,9 +34,7 @@ def __init__( """ super().__init__( prefix=prefix, - metric_fn=wrap_class_metric2dict( - metrics.auc, class_args=class_args - ), + metric_fn=wrap_class_metric2dict(auc, class_args=class_args), input_key=input_key, output_key=output_key, multiplier=multiplier, diff --git a/catalyst/callbacks/metrics/cmc_score.py b/catalyst/callbacks/metrics/cmc_score.py index ba4d7777e0..c913b1c71e 100644 --- a/catalyst/callbacks/metrics/cmc_score.py +++ b/catalyst/callbacks/metrics/cmc_score.py @@ -1,10 +1,14 @@ -from typing import List +from typing import List, TYPE_CHECKING import torch -from catalyst.core import Callback, CallbackOrder, IRunner +from catalyst.core.callback import Callback, CallbackOrder from catalyst.data.dataset.metric_learning import QueryGalleryDataset -from catalyst.utils.metrics import cmc_score, get_default_topk_args +from catalyst.metrics.cmc_score import cmc_score +from catalyst.metrics.functional import get_default_topk_args + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner TORCH_BOOL = torch.bool if torch.__version__ > "1.1.0" else torch.ByteTensor diff --git a/catalyst/callbacks/metrics/dice.py b/catalyst/callbacks/metrics/dice.py index 93465d571c..be1a55eb42 100644 --- a/catalyst/callbacks/metrics/dice.py +++ b/catalyst/callbacks/metrics/dice.py @@ -1,9 +1,17 @@ +from typing import TYPE_CHECKING + import numpy as np -from catalyst.core import BatchMetricCallback, Callback, CallbackOrder, IRunner -from catalyst.dl import utils -from catalyst.utils import metrics -from catalyst.utils.metrics.dice import calculate_dice +from catalyst.callbacks.metric import BatchMetricCallback +from catalyst.contrib.utils.confusion_matrix import ( + calculate_confusion_matrix_from_tensors, + calculate_tp_fp_fn, +) +from catalyst.core.callback import Callback, CallbackOrder +from catalyst.metrics.dice import calculate_dice, dice + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class DiceCallback(BatchMetricCallback): @@ -27,7 +35,7 @@ def __init__( """ super().__init__( prefix=prefix, - metric_fn=metrics.dice, + metric_fn=dice, input_key=input_key, output_key=output_key, eps=eps, @@ -73,7 +81,7 @@ def _reset_stats(self): """Resets the confusion matrix holding the epoch-wise stats.""" self.confusion_matrix = None - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): """Records the confusion matrix at the end of each batch. Args: @@ -82,7 +90,7 @@ def on_batch_end(self, runner: IRunner): outputs = runner.output[self.output_key] targets = runner.input[self.input_key] - confusion_matrix = utils.calculate_confusion_matrix_from_tensors( + confusion_matrix = calculate_confusion_matrix_from_tensors( outputs, targets ) @@ -91,13 +99,13 @@ def on_batch_end(self, runner: IRunner): else: self.confusion_matrix += confusion_matrix - def on_loader_end(self, runner: IRunner): + def on_loader_end(self, runner: "IRunner"): """@TODO: Docs. Contribution is welcome. Args: runner: current runner """ - tp_fp_fn_dict = utils.calculate_tp_fp_fn(self.confusion_matrix) + tp_fp_fn_dict = calculate_tp_fp_fn(self.confusion_matrix) dice_scores: np.ndarray = calculate_dice(**tp_fp_fn_dict) diff --git a/catalyst/callbacks/metrics/f1_score.py b/catalyst/callbacks/metrics/f1_score.py index c855b035c5..57d7fd7727 100644 --- a/catalyst/callbacks/metrics/f1_score.py +++ b/catalyst/callbacks/metrics/f1_score.py @@ -1,5 +1,5 @@ -from catalyst.core import BatchMetricCallback -from catalyst.utils import metrics +from catalyst.callbacks.metric import BatchMetricCallback +from catalyst.metrics.f1_score import f1_score class F1ScoreCallback(BatchMetricCallback): @@ -30,7 +30,7 @@ def __init__( """ super().__init__( prefix=prefix, - metric_fn=metrics.f1_score, + metric_fn=f1_score, input_key=input_key, output_key=output_key, beta=beta, diff --git a/catalyst/callbacks/metrics/iou.py b/catalyst/callbacks/metrics/iou.py index da1f038fa8..43d20f2551 100644 --- a/catalyst/callbacks/metrics/iou.py +++ b/catalyst/callbacks/metrics/iou.py @@ -1,7 +1,7 @@ from typing import List -from catalyst.core import BatchMetricCallback -from catalyst.utils import metrics +from catalyst.callbacks.metric import BatchMetricCallback +from catalyst.metrics.iou import iou def _get_default_classwise_iou_args(num_classes: int) -> List[int]: @@ -35,7 +35,7 @@ def __init__( """ super().__init__( prefix=prefix, - metric_fn=metrics.iou, + metric_fn=iou, input_key=input_key, output_key=output_key, eps=eps, diff --git a/catalyst/callbacks/metrics/ppv_tpr_f1.py b/catalyst/callbacks/metrics/ppv_tpr_f1.py index 77f9a11ac3..88624c35f1 100644 --- a/catalyst/callbacks/metrics/ppv_tpr_f1.py +++ b/catalyst/callbacks/metrics/ppv_tpr_f1.py @@ -1,7 +1,7 @@ from typing import List -from catalyst.dl.callbacks import MeterMetricsCallback -from catalyst.tools import meters +from catalyst.callbacks.meter import MeterMetricsCallback +from catalyst.tools.meters.ppv_tpr_f1_meter import PrecisionRecallF1ScoreMeter class PrecisionRecallF1ScoreCallback(MeterMetricsCallback): @@ -39,8 +39,7 @@ def __init__( num_classes = num_classes if class_names is None else len(class_names) meter_list = [ - meters.PrecisionRecallF1ScoreMeter(threshold) - for _ in range(num_classes) + PrecisionRecallF1ScoreMeter(threshold) for _ in range(num_classes) ] super().__init__( diff --git a/catalyst/callbacks/metrics/precision.py b/catalyst/callbacks/metrics/precision.py index fb38da0c3b..9c9960c917 100644 --- a/catalyst/callbacks/metrics/precision.py +++ b/catalyst/callbacks/metrics/precision.py @@ -1,8 +1,8 @@ from typing import List -from catalyst.core.callbacks import LoaderMetricCallback -from catalyst.utils import metrics -from catalyst.utils.metrics.functional import wrap_class_metric2dict +from catalyst.callbacks.metric import LoaderMetricCallback +from catalyst.metrics.functional import wrap_class_metric2dict +from catalyst.metrics.precision import average_precision class AveragePrecisionCallback(LoaderMetricCallback): @@ -33,7 +33,7 @@ def __init__( super().__init__( prefix=prefix, metric_fn=wrap_class_metric2dict( - metrics.average_precision, class_args=class_args + average_precision, class_args=class_args ), input_key=input_key, output_key=output_key, diff --git a/catalyst/callbacks/optimizer.py b/catalyst/callbacks/optimizer.py index 8545df90c5..b8b86d4596 100644 --- a/catalyst/callbacks/optimizer.py +++ b/catalyst/callbacks/optimizer.py @@ -1,4 +1,4 @@ -from typing import Callable, Dict, List +from typing import Callable, Dict, List, TYPE_CHECKING import logging import warnings @@ -6,11 +6,13 @@ from catalyst import registry from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.typing import Optimizer from catalyst.utils.misc import maybe_recursive_call from catalyst.utils.torch import get_optimizer_momentum +if TYPE_CHECKING: + from catalyst.core.runner import IRunner + logger = logging.getLogger(__name__) try: @@ -141,7 +143,7 @@ def grad_step( # optimize parameters self._optimizer_step_fn(optimizer) - def on_stage_start(self, runner: IRunner) -> None: + def on_stage_start(self, runner: "IRunner") -> None: """Checks that the current stage has correct optimizer. Args: @@ -158,7 +160,7 @@ def on_stage_start(self, runner: IRunner) -> None: assert self._optimizer is not None - def on_epoch_start(self, runner: IRunner) -> None: + def on_epoch_start(self, runner: "IRunner") -> None: """On epoch start event. Args: @@ -174,7 +176,7 @@ def on_epoch_start(self, runner: IRunner) -> None: else: self._optimizer_wd = [0.0] * len(self._optimizer.param_groups) - def on_batch_end(self, runner: IRunner) -> None: + def on_batch_end(self, runner: "IRunner") -> None: """On batch end event Args: @@ -221,7 +223,7 @@ def on_batch_end(self, runner: IRunner) -> None: maybe_recursive_call(self._optimizer, zero_grad) self._accumulation_counter = 0 - def on_epoch_end(self, runner: IRunner) -> None: + def on_epoch_end(self, runner: "IRunner") -> None: """On epoch end event. Args: @@ -316,7 +318,7 @@ def grad_step( self.scaler.step(optimizer) self.scaler.update() - def on_stage_start(self, runner: IRunner) -> None: + def on_stage_start(self, runner: "IRunner") -> None: """Checks that the current stage has correct optimizer. Args: @@ -330,7 +332,7 @@ def on_stage_start(self, runner: IRunner) -> None: self.scaler = GradScaler() assert self._optimizer is not None - def on_batch_start(self, runner: IRunner) -> None: + def on_batch_start(self, runner: "IRunner") -> None: """On batch start event Args: @@ -340,7 +342,7 @@ def on_batch_start(self, runner: IRunner) -> None: torch.set_autocast_enabled(True) torch.autocast_increment_nesting() - def on_batch_end(self, runner: IRunner) -> None: + def on_batch_end(self, runner: "IRunner") -> None: """On batch end event Args: @@ -372,7 +374,7 @@ def on_batch_end(self, runner: IRunner) -> None: maybe_recursive_call(self._optimizer, "zero_grad") self._accumulation_counter = 0 - def on_epoch_end(self, runner: IRunner) -> None: + def on_epoch_end(self, runner: "IRunner") -> None: """On epoch end event. Args: @@ -395,7 +397,7 @@ def on_epoch_end(self, runner: IRunner) -> None: ) runner.epoch_metrics[momentum_name] = momentum - def on_stage_end(self, runner: IRunner) -> None: + def on_stage_end(self, runner: "IRunner") -> None: """On stage end event. Args: diff --git a/catalyst/callbacks/periodic_loader.py b/catalyst/callbacks/periodic_loader.py index 225942027b..a99e7e8395 100644 --- a/catalyst/callbacks/periodic_loader.py +++ b/catalyst/callbacks/periodic_loader.py @@ -1,11 +1,13 @@ -from typing import Mapping +from typing import Mapping, TYPE_CHECKING from collections import OrderedDict import copy from torch.utils.data import DataLoader from catalyst.core.callback import Callback, CallbackOrder -from catalyst.core.runner import IRunner + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class PeriodicLoaderCallback(Callback): @@ -71,7 +73,7 @@ def __init__(self, **kwargs): raise ValueError(f"Period should be >= 0, but got - {period}!") self.loader_periods[loader] = period - def on_stage_start(self, runner: IRunner) -> None: + def on_stage_start(self, runner: "IRunner") -> None: """Collect information about loaders. Args: @@ -114,7 +116,7 @@ def on_stage_start(self, runner: IRunner) -> None: "should be > 0!" ) - def on_epoch_start(self, runner: IRunner) -> None: + def on_epoch_start(self, runner: "IRunner") -> None: """ Set loaders for current epoch. If validation is not required then the first loader @@ -148,7 +150,7 @@ def on_epoch_start(self, runner: IRunner) -> None: ) runner.loaders = epoch_loaders - def on_epoch_end(self, runner: IRunner) -> None: + def on_epoch_end(self, runner: "IRunner") -> None: """Check if validation metric should be dropped for current epoch. diff --git a/catalyst/callbacks/pruning.py b/catalyst/callbacks/pruning.py index a6658cda56..662bbe5b72 100644 --- a/catalyst/callbacks/pruning.py +++ b/catalyst/callbacks/pruning.py @@ -1,12 +1,14 @@ -from typing import Callable, List, Optional, Union +from typing import Callable, List, Optional, TYPE_CHECKING, Union import warnings from torch.nn.utils import prune from catalyst.core.callback import Callback, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.utils.pruning import prune_model, remove_reparametrization +if TYPE_CHECKING: + from catalyst.core.runner import IRunner + PRUNING_FN = { # noqa: WPS407 "l1_unstructured": prune.l1_unstructured, "random_unstructured": prune.random_unstructured, @@ -166,3 +168,6 @@ def on_stage_end(self, runner: "IRunner") -> None: keys_to_prune=self.keys_to_prune, layers_to_prune=self.layers_to_prune, ) + + +__all__ = ["PruningCallback"] diff --git a/catalyst/callbacks/quantization.py b/catalyst/callbacks/quantization.py index e73608f323..577c2ee549 100644 --- a/catalyst/callbacks/quantization.py +++ b/catalyst/callbacks/quantization.py @@ -1,13 +1,15 @@ -from typing import Dict, Optional, Set, Union +from typing import Dict, Optional, Set, TYPE_CHECKING, Union from pathlib import Path import torch from torch import quantization from catalyst.core.callback import Callback, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.utils.quantization import save_quantized_model +if TYPE_CHECKING: + from catalyst.core.runner import IRunner + class DynamicQuantizationCallback(Callback): """ @@ -80,7 +82,7 @@ def __init__( if backend is not None: torch.backends.quantized.engine = backend - def on_epoch_end(self, runner: IRunner): + def on_epoch_end(self, runner: "IRunner"): """ Performing model quantization on epoch end if condition metric is improved @@ -144,3 +146,6 @@ def on_stage_end(self, runner: "IRunner") -> None: out_model=self.out_model, out_dir=self.out_dir, ) + + +__all__ = ["DynamicQuantizationCallback"] diff --git a/catalyst/callbacks/scheduler.py b/catalyst/callbacks/scheduler.py index fbfd1d4aff..d820ba965d 100644 --- a/catalyst/callbacks/scheduler.py +++ b/catalyst/callbacks/scheduler.py @@ -1,13 +1,15 @@ -from typing import Optional, Tuple +from typing import Optional, Tuple, TYPE_CHECKING from abc import ABC, abstractmethod import torch from catalyst.contrib.nn.schedulers import BatchScheduler, OneCycleLRWithWarmup from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.utils.torch import get_optimizer_momentum +if TYPE_CHECKING: + from catalyst.core.runner import IRunner + class ISchedulerCallback(Callback): """Scheduler callback interface, abstraction over scheduler step.""" @@ -122,7 +124,7 @@ def _scheduler_step( return lr, momentum - def step_batch(self, runner: IRunner) -> None: + def step_batch(self, runner: "IRunner") -> None: """Update learning rate and momentum in runner. Args: @@ -141,7 +143,7 @@ def step_batch(self, runner: IRunner) -> None: if momentum is not None: runner.batch_metrics["momentum"] = momentum - def step_epoch(self, runner: IRunner) -> None: + def step_epoch(self, runner: "IRunner") -> None: """Update momentum in runner. Args: @@ -163,7 +165,7 @@ def step_epoch(self, runner: IRunner) -> None: if momentum is not None: runner.epoch_metrics["momentum"] = momentum - def on_stage_start(self, runner: IRunner) -> None: + def on_stage_start(self, runner: "IRunner") -> None: """Stage start hook. Args: @@ -190,7 +192,7 @@ def on_stage_start(self, runner: IRunner) -> None: scheduler.reset() assert self.mode is not None - def on_loader_start(self, runner: IRunner) -> None: + def on_loader_start(self, runner: "IRunner") -> None: """Loader start hook. Args: @@ -205,7 +207,7 @@ def on_loader_start(self, runner: IRunner) -> None: loader_len=runner.loader_len, current_step=runner.epoch - 1 ) - def on_batch_end(self, runner: IRunner) -> None: + def on_batch_end(self, runner: "IRunner") -> None: """Batch end hook. Args: @@ -214,7 +216,7 @@ def on_batch_end(self, runner: IRunner) -> None: if runner.is_train_loader and self.mode == "batch": self.step_batch(runner=runner) - def on_epoch_end(self, runner: IRunner) -> None: + def on_epoch_end(self, runner: "IRunner") -> None: """Epoch end hook. Args: @@ -224,7 +226,7 @@ def on_epoch_end(self, runner: IRunner) -> None: self.step_epoch(runner=runner) -class LRUpdater(ABC, Callback): +class ILRUpdater(ABC, Callback): """Basic class that all Lr updaters inherit from.""" def __init__(self, optimizer_key: str = None): @@ -274,7 +276,7 @@ def _update_optimizer(self, optimizer) -> Tuple[float, float]: return new_lr, new_momentum - def update_optimizer(self, runner: IRunner) -> None: + def update_optimizer(self, runner: "IRunner") -> None: """Update learning rate and momentum in runner. Args: @@ -289,7 +291,7 @@ def update_optimizer(self, runner: IRunner) -> None: runner.batch_metrics["lr"] = lr runner.batch_metrics["momentum"] = momentum - def on_stage_start(self, runner: IRunner) -> None: + def on_stage_start(self, runner: "IRunner") -> None: """Stage start hook. Args: @@ -302,7 +304,7 @@ def on_stage_start(self, runner: IRunner) -> None: self._optimizer = optimizer self.init_lr = optimizer.defaults["lr"] - def on_loader_start(self, runner: IRunner) -> None: + def on_loader_start(self, runner: "IRunner") -> None: """Loader start hook. Args: @@ -311,7 +313,7 @@ def on_loader_start(self, runner: IRunner) -> None: if runner.is_train_loader: self.update_optimizer(runner=runner) - def on_batch_end(self, runner: IRunner) -> None: + def on_batch_end(self, runner: "IRunner") -> None: """Batch end hook. Args: @@ -321,7 +323,7 @@ def on_batch_end(self, runner: IRunner) -> None: self.update_optimizer(runner=runner) -class LRFinder(LRUpdater): +class LRFinder(ILRUpdater): """ Helps you find an optimal learning rate for a model, as per suggestion of `Cyclical Learning Rates for Training Neural Networks`_ paper. @@ -388,7 +390,7 @@ def calc_momentum(self): """Calculates new momentum.""" pass - def on_loader_start(self, runner: IRunner): + def on_loader_start(self, runner: "IRunner"): """Loader start hook. Updates scheduler statistics. Args: @@ -402,7 +404,7 @@ def on_loader_start(self, runner: IRunner): super().on_loader_start(runner=runner) - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): """Batch end hook. Make scheduler step and stops iterating if needed. Args: @@ -416,4 +418,4 @@ def on_batch_end(self, runner: IRunner): raise NotImplementedError("End of LRFinder") -__all__ = ["ISchedulerCallback", "SchedulerCallback", "LRUpdater", "LRFinder"] +__all__ = ["ISchedulerCallback", "SchedulerCallback", "ILRUpdater", "LRFinder"] diff --git a/catalyst/callbacks/tests/test_early_stop.py b/catalyst/callbacks/tests/test_early_stop.py index 95627c50ef..27229480c7 100644 --- a/catalyst/callbacks/tests/test_early_stop.py +++ b/catalyst/callbacks/tests/test_early_stop.py @@ -1,6 +1,6 @@ from unittest.mock import MagicMock, PropertyMock -from catalyst.core import EarlyStoppingCallback +from catalyst.callbacks import EarlyStoppingCallback def test_patience1(): diff --git a/catalyst/callbacks/tests/test_optimizer_callback.py b/catalyst/callbacks/tests/test_optimizer_callback.py index f27cf2ea6a..acfbb50708 100644 --- a/catalyst/callbacks/tests/test_optimizer_callback.py +++ b/catalyst/callbacks/tests/test_optimizer_callback.py @@ -4,7 +4,7 @@ import torch import torch.nn as nn -from catalyst.core.callbacks import OptimizerCallback +from catalyst.callbacks import OptimizerCallback class DummyRunner: diff --git a/catalyst/callbacks/timer.py b/catalyst/callbacks/timer.py index e0e3f9279b..c370b19671 100644 --- a/catalyst/callbacks/timer.py +++ b/catalyst/callbacks/timer.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.tools.time_manager import TimeManager +if TYPE_CHECKING: + from catalyst.core.runner import IRunner + EPS = 1e-8 @@ -13,7 +17,7 @@ def __init__(self): super().__init__(order=CallbackOrder.metric + 1, node=CallbackNode.all) self.timer = TimeManager() - def on_loader_start(self, runner: IRunner) -> None: + def on_loader_start(self, runner: "IRunner") -> None: """Loader start hook. Args: @@ -23,7 +27,7 @@ def on_loader_start(self, runner: IRunner) -> None: self.timer.start("_timer/batch_time") self.timer.start("_timer/data_time") - def on_loader_end(self, runner: IRunner) -> None: + def on_loader_end(self, runner: "IRunner") -> None: """Loader end hook. Args: @@ -31,7 +35,7 @@ def on_loader_end(self, runner: IRunner) -> None: """ self.timer.reset() - def on_batch_start(self, runner: IRunner) -> None: + def on_batch_start(self, runner: "IRunner") -> None: """Batch start hook. Args: @@ -40,7 +44,7 @@ def on_batch_start(self, runner: IRunner) -> None: self.timer.stop("_timer/data_time") self.timer.start("_timer/model_time") - def on_batch_end(self, runner: IRunner) -> None: + def on_batch_end(self, runner: "IRunner") -> None: """Batch end hook. Args: diff --git a/catalyst/callbacks/tracing.py b/catalyst/callbacks/tracing.py index 1a8873b1b6..ce87c12fd7 100644 --- a/catalyst/callbacks/tracing.py +++ b/catalyst/callbacks/tracing.py @@ -1,13 +1,15 @@ -from typing import Union +from typing import TYPE_CHECKING, Union from pathlib import Path import warnings from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.utils.tracing import save_traced_model, trace_model_from_runner +if TYPE_CHECKING: + from catalyst.core.runner import IRunner -class TracerCallback(Callback): + +class TracingCallback(Callback): """ Traces model during training if `metric` provided is improved. """ @@ -59,7 +61,7 @@ def __init__( if opt_level is not None: warnings.warn( - "TracerCallback: " + "TracingCallback: " "`opt_level` is not supported yet, " "model will be traced as is", stacklevel=2, @@ -88,7 +90,7 @@ def __init__( out_dir = Path(out_dir) self.out_dir = out_dir - def _trace(self, runner: IRunner): + def _trace(self, runner: "IRunner"): """ Performing model tracing on epoch end if condition metric is improved. @@ -128,7 +130,7 @@ def _trace(self, runner: IRunner): out_dir=self.out_dir, ) - def on_epoch_end(self, runner: IRunner): + def on_epoch_end(self, runner: "IRunner"): """ Performing model tracing on epoch end if condition metric is improved @@ -142,7 +144,7 @@ def on_epoch_end(self, runner: IRunner): if self.best_score is None: self.best_score = score - # TODO: EarlyStoppingCallback and TracerCallback + # TODO: EarlyStoppingCallback and TracingCallback # will never work very first epoch if self.is_better(score, self.best_score): self.best_score = score @@ -150,7 +152,7 @@ def on_epoch_end(self, runner: IRunner): else: self._trace(runner) - def on_stage_end(self, runner: IRunner): + def on_stage_end(self, runner: "IRunner"): """ Performing model tracing on stage end if `do_once` is True. @@ -161,4 +163,7 @@ def on_stage_end(self, runner: IRunner): self._trace(runner) -__all__ = ["TracerCallback"] +# backward compatibility +TracerCallback = TracingCallback + +__all__ = ["TracingCallback", "TracerCallback"] diff --git a/catalyst/callbacks/validation.py b/catalyst/callbacks/validation.py index 32aea1def3..48a7724706 100644 --- a/catalyst/callbacks/validation.py +++ b/catalyst/callbacks/validation.py @@ -1,7 +1,10 @@ +from typing import TYPE_CHECKING from collections import defaultdict from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.runner import IRunner + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class ValidationManagerCallback(Callback): @@ -15,7 +18,7 @@ def __init__(self): order=CallbackOrder.validation, node=CallbackNode.all, ) - def on_epoch_start(self, runner: IRunner) -> None: + def on_epoch_start(self, runner: "IRunner") -> None: """Epoch start hook. Args: @@ -24,7 +27,7 @@ def on_epoch_start(self, runner: IRunner) -> None: runner.valid_metrics = defaultdict(None) runner.is_best_valid = False - def on_epoch_end(self, runner: IRunner) -> None: + def on_epoch_end(self, runner: "IRunner") -> None: """Epoch end hook. Args: diff --git a/catalyst/contrib/callbacks/__init__.py b/catalyst/contrib/callbacks/__init__.py index bbcced8d9c..280c1f8561 100644 --- a/catalyst/contrib/callbacks/__init__.py +++ b/catalyst/contrib/callbacks/__init__.py @@ -5,13 +5,24 @@ from catalyst.settings import SETTINGS +from catalyst.contrib.callbacks.confusion_matrix_logger import ( + ConfusionMatrixCallback, +) +from catalyst.contrib.callbacks.cutmix_callback import CutmixCallback from catalyst.contrib.callbacks.gradnorm_logger import GradNormLogger +from catalyst.contrib.callbacks.inference_callback import InferCallback +from catalyst.contrib.callbacks.knn_metric import KNNMetricCallback +from catalyst.contrib.callbacks.mixup_callback import MixupCallback +from catalyst.contrib.callbacks.perplexity_metric import ( + PerplexityMetricCallback, +) +from catalyst.contrib.callbacks.telegram_logger import TelegramLogger logger = logging.getLogger(__name__) try: import imageio - from catalyst.contrib.callbacks import InferMaskCallback + from catalyst.contrib.callbacks.mask_inference import InferMaskCallback except ImportError as ex: if SETTINGS.cv_required: logger.warning( @@ -52,20 +63,10 @@ ) raise ex -try: - import visdom - from catalyst.contrib.callbacks.visdom_logger import VisdomLogger -except ImportError as ex: - if SETTINGS.visdom_logger_required: - logger.warning( - "visdom not available, to install visdom, " - "run `pip install visdom`." - ) - raise ex try: import neptune - from catalyst.contrib.callbacks import NeptuneLogger + from catalyst.contrib.callbacks.neptune_logger import NeptuneLogger except ImportError as ex: if SETTINGS.neptune_logger_required: logger.warning( diff --git a/catalyst/contrib/callbacks/alchemy_logger.py b/catalyst/contrib/callbacks/alchemy_logger.py index bfe8f0d755..32272a83f1 100644 --- a/catalyst/contrib/callbacks/alchemy_logger.py +++ b/catalyst/contrib/callbacks/alchemy_logger.py @@ -1,6 +1,6 @@ # flake8: noqa # @TODO: code formatting issue for 20.07 release -from typing import Dict, List +from typing import Dict, List, TYPE_CHECKING from alchemy import Logger @@ -11,7 +11,9 @@ CallbackOrder, CallbackScope, ) -from catalyst.core.runner import IRunner + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class AlchemyLogger(Callback): @@ -103,7 +105,7 @@ def _log_metrics( name=metric_name, value=metric_value, step=step, ) - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): """Translate batch metrics to Alchemy.""" if self.log_on_batch_end: mode = runner.loader_name @@ -115,7 +117,7 @@ def on_batch_end(self, runner: IRunner): suffix=self.batch_log_suffix, ) - def on_loader_end(self, runner: IRunner): + def on_loader_end(self, runner: "IRunner"): """Translate loader metrics to Alchemy.""" if self.log_on_epoch_end: mode = runner.loader_name @@ -127,7 +129,7 @@ def on_loader_end(self, runner: IRunner): suffix=self.epoch_log_suffix, ) - def on_epoch_end(self, runner: IRunner): + def on_epoch_end(self, runner: "IRunner"): """Translate epoch metrics to Alchemy.""" extra_mode = "_base" splitted_epoch_metrics = utils.split_dict_to_subdicts( diff --git a/catalyst/contrib/callbacks/confusion_matrix.py b/catalyst/contrib/callbacks/confusion_matrix_logger.py similarity index 96% rename from catalyst/contrib/callbacks/confusion_matrix.py rename to catalyst/contrib/callbacks/confusion_matrix_logger.py index 5e74486258..f6fa7567ac 100644 --- a/catalyst/contrib/callbacks/confusion_matrix.py +++ b/catalyst/contrib/callbacks/confusion_matrix_logger.py @@ -11,7 +11,7 @@ render_figure_to_tensor, ) from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.tools import meters +from catalyst.tools.meters.confusionmeter import ConfusionMeter if TYPE_CHECKING: from catalyst.core.runner import IRunner @@ -66,7 +66,7 @@ def __init__( def _reset_stats(self): if self._mode == "tnt": - self.confusion_matrix = meters.ConfusionMeter(self.num_classes) + self.confusion_matrix = ConfusionMeter(self.num_classes) elif self._mode == "sklearn": self.outputs = [] self.targets = [] @@ -139,7 +139,7 @@ def on_loader_end(self, runner: IRunner): if runner.distributed_rank >= 0: confusion_matrix = torch.from_numpy(confusion_matrix) - confusion_matrix = confusion_matrix.to(utils.get_device()) + confusion_matrix = confusion_matrix.to(runner.device) torch.distributed.reduce(confusion_matrix, 0) confusion_matrix = confusion_matrix.cpu().numpy() diff --git a/catalyst/contrib/callbacks/cutmix_callback.py b/catalyst/contrib/callbacks/cutmix_callback.py index ebcb0ba19b..ad823d59af 100644 --- a/catalyst/contrib/callbacks/cutmix_callback.py +++ b/catalyst/contrib/callbacks/cutmix_callback.py @@ -1,11 +1,13 @@ -from typing import List +from typing import List, TYPE_CHECKING import numpy as np import torch -from catalyst.core.callbacks import CriterionCallback -from catalyst.core.runner import IRunner +from catalyst.callbacks.criterion import CriterionCallback + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class CutmixCallback(CriterionCallback): @@ -51,7 +53,7 @@ def __init__( self.index = None self.is_needed = True - def _compute_loss(self, runner: IRunner, criterion): + def _compute_loss(self, runner: "IRunner", criterion): """Computes loss. If self.is_needed is ``False`` then calls ``_compute_loss`` @@ -100,7 +102,7 @@ def _rand_bbox(self, size, lam): return bbx1, bby1, bbx2, bby2 - def on_loader_start(self, runner: IRunner) -> None: + def on_loader_start(self, runner: "IRunner") -> None: """Checks if it is needed for the loader. Args: @@ -108,7 +110,7 @@ def on_loader_start(self, runner: IRunner) -> None: """ self.is_needed = not self.on_train_only or runner.is_train_loader - def on_batch_start(self, runner: IRunner) -> None: + def on_batch_start(self, runner: "IRunner") -> None: """Mixes data according to Cutmix algorithm. Args: diff --git a/catalyst/contrib/callbacks/gradnorm_logger.py b/catalyst/contrib/callbacks/gradnorm_logger.py index e832e7afe7..d8b58235a3 100644 --- a/catalyst/contrib/callbacks/gradnorm_logger.py +++ b/catalyst/contrib/callbacks/gradnorm_logger.py @@ -1,12 +1,14 @@ -from typing import Dict +from typing import Dict, TYPE_CHECKING from torch.nn import DataParallel from torch.nn.parallel import DistributedDataParallel from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.typing import Model +if TYPE_CHECKING: + from catalyst.core.runner import IRunner + class GradNormLogger(Callback): """Callback for logging model gradients.""" @@ -65,7 +67,7 @@ def grad_norm(*, model: Model, prefix: str, norm_type: int) -> Dict: return grad_norm - def on_batch_end(self, runner: IRunner) -> None: + def on_batch_end(self, runner: "IRunner") -> None: """On batch end event Args: diff --git a/catalyst/contrib/callbacks/inference.py b/catalyst/contrib/callbacks/inference_callback.py similarity index 84% rename from catalyst/contrib/callbacks/inference.py rename to catalyst/contrib/callbacks/inference_callback.py index 02da46aca1..5ffcae3361 100644 --- a/catalyst/contrib/callbacks/inference.py +++ b/catalyst/contrib/callbacks/inference_callback.py @@ -1,9 +1,13 @@ +from typing import TYPE_CHECKING from collections import defaultdict import os import numpy as np -from catalyst.core import Callback, CallbackOrder, IRunner +from catalyst.core.callback import Callback, CallbackOrder + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner # @TODO: refactor @@ -21,7 +25,7 @@ def __init__(self, out_dir=None, out_prefix=None): self.predictions = defaultdict(lambda: []) self._keys_from_runner = ["out_dir", "out_prefix"] - def on_stage_start(self, runner: IRunner): + def on_stage_start(self, runner: "IRunner"): """Stage start hook. Args: @@ -37,7 +41,7 @@ def on_stage_start(self, runner: IRunner): if self.out_prefix is not None: os.makedirs(os.path.dirname(self.out_prefix), exist_ok=True) - def on_loader_start(self, runner: IRunner): + def on_loader_start(self, runner: "IRunner"): """Loader start hook. Args: @@ -45,7 +49,7 @@ def on_loader_start(self, runner: IRunner): """ self.predictions = defaultdict(lambda: []) - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): """Batch end hook. Args: @@ -56,7 +60,7 @@ def on_batch_end(self, runner: IRunner): for key, value in dct.items(): self.predictions[key].append(value) - def on_loader_end(self, runner: IRunner): + def on_loader_end(self, runner: "IRunner"): """Loader end hook. Args: diff --git a/catalyst/contrib/callbacks/knn_metric.py b/catalyst/contrib/callbacks/knn_metric.py index 7e72aae8d1..4b36bc5bb9 100644 --- a/catalyst/contrib/callbacks/knn_metric.py +++ b/catalyst/contrib/callbacks/knn_metric.py @@ -1,4 +1,4 @@ -from typing import Dict, List +from typing import Dict, List, TYPE_CHECKING from math import ceil import numpy as np @@ -14,7 +14,9 @@ import torch from catalyst.core.callback import Callback, CallbackOrder -from catalyst.core.runner import IRunner + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class KNNMetricCallback(Callback): @@ -165,7 +167,7 @@ def _knn(self, train_set, test_set=None): return result - def on_batch_end(self, runner: IRunner) -> None: + def on_batch_end(self, runner: "IRunner") -> None: """Batch end hook. Args: @@ -181,7 +183,7 @@ def on_batch_end(self, runner: IRunner) -> None: self.features.extend(features) self.targets.extend(targets) - def on_loader_end(self, runner: IRunner) -> None: + def on_loader_end(self, runner: "IRunner") -> None: """Loader end hook. Args: @@ -219,7 +221,7 @@ def on_loader_end(self, runner: IRunner) -> None: self._reset_cache() - def on_epoch_end(self, runner: IRunner) -> None: + def on_epoch_end(self, runner: "IRunner") -> None: """Epoch end hook. Args: diff --git a/catalyst/contrib/callbacks/kornia_transform.py b/catalyst/contrib/callbacks/kornia_transform.py index 00319f1691..6a05b70df5 100644 --- a/catalyst/contrib/callbacks/kornia_transform.py +++ b/catalyst/contrib/callbacks/kornia_transform.py @@ -1,12 +1,14 @@ -from typing import Dict, Optional, Sequence, Tuple, Union +from typing import Dict, Optional, Sequence, Tuple, TYPE_CHECKING, Union from kornia.augmentation import AugmentationBase import torch from torch import nn -from catalyst.contrib.registry import TRANSFORMS from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.runner import IRunner +from catalyst.registry import TRANSFORMS + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class BatchTransformCallback(Callback): @@ -192,18 +194,18 @@ def _process_input_tuple( return input_[self.input_key], input_[self.additional_input] def _process_output_tensor( - self, runner: IRunner, batch: Tuple[torch.Tensor, torch.Tensor] + self, runner: "IRunner", batch: Tuple[torch.Tensor, torch.Tensor] ) -> Dict[str, torch.Tensor]: runner.input[self.output_key] = batch def _process_output_tuple( - self, runner: IRunner, batch: Tuple[torch.Tensor, torch.Tensor] + self, runner: "IRunner", batch: Tuple[torch.Tensor, torch.Tensor] ) -> None: out_t, additional_t = batch dict_ = {self.output_key: out_t, self.additional_output: additional_t} runner.input.update(dict_) - def on_batch_start(self, runner: IRunner) -> None: + def on_batch_start(self, runner: "IRunner") -> None: """Apply transforms. Args: diff --git a/catalyst/contrib/callbacks/mask_inference.py b/catalyst/contrib/callbacks/mask_inference.py index b11af8dcc0..94137351d6 100644 --- a/catalyst/contrib/callbacks/mask_inference.py +++ b/catalyst/contrib/callbacks/mask_inference.py @@ -1,3 +1,4 @@ +from typing import TYPE_CHECKING import os import imageio @@ -7,9 +8,11 @@ import torch import torch.nn.functional as F # noqa: N812, WPS301 +from catalyst.contrib.utils.cv.tensor import tensor_to_ndimage from catalyst.core.callback import Callback, CallbackOrder -from catalyst.core.runner import IRunner -from catalyst.dl import utils + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class InferMaskCallback(Callback): @@ -48,7 +51,7 @@ def __init__( self.counter = 0 self._keys_from_runner = ["out_dir", "out_prefix"] - def on_stage_start(self, runner: IRunner): + def on_stage_start(self, runner: "IRunner"): """Stage start hook. Args: @@ -66,7 +69,7 @@ def on_stage_start(self, runner: IRunner): self.out_prefix = str(self.out_dir) + "/" + str(self.out_prefix) os.makedirs(os.path.dirname(self.out_prefix), exist_ok=True) - def on_loader_start(self, runner: IRunner): + def on_loader_start(self, runner: "IRunner"): """Loader start hook. Args: @@ -75,7 +78,7 @@ def on_loader_start(self, runner: IRunner): lm = runner.loader_name os.makedirs(f"{self.out_prefix}/{lm}/", exist_ok=True) - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): """Batch end hook. Args: @@ -85,7 +88,7 @@ def on_batch_end(self, runner: IRunner): names = runner.input.get(self.name_key, []) features = runner.input[self.input_key].detach().cpu() - images = utils.tensor_to_ndimage(features) + images = tensor_to_ndimage(features) logits = runner.output[self.output_key] logits = ( diff --git a/catalyst/contrib/callbacks/mixup.py b/catalyst/contrib/callbacks/mixup_callback.py similarity index 100% rename from catalyst/contrib/callbacks/mixup.py rename to catalyst/contrib/callbacks/mixup_callback.py diff --git a/catalyst/contrib/callbacks/neptune_logger.py b/catalyst/contrib/callbacks/neptune_logger.py index bc2276b85c..36fd0a8c87 100644 --- a/catalyst/contrib/callbacks/neptune_logger.py +++ b/catalyst/contrib/callbacks/neptune_logger.py @@ -1,6 +1,6 @@ # flake8: noqa # @TODO: code formatting issue for 20.07 release -from typing import Dict, List +from typing import Dict, List, TYPE_CHECKING import neptune @@ -10,7 +10,9 @@ CallbackOrder, CallbackScope, ) -from catalyst.core.runner import IRunner + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class NeptuneLogger(Callback): @@ -137,7 +139,7 @@ def _log_metrics( metric_value = metrics[name] self.experiment.log_metric(metric_name, y=metric_value, x=step) - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): """Log batch metrics to Neptune.""" if self.log_on_batch_end: mode = runner.loader_name @@ -149,7 +151,7 @@ def on_batch_end(self, runner: IRunner): suffix=self.batch_log_suffix, ) - def on_loader_end(self, runner: IRunner): + def on_loader_end(self, runner: "IRunner"): """Translate epoch metrics to Neptune.""" if self.log_on_epoch_end: mode = runner.loader_name diff --git a/catalyst/contrib/callbacks/optuna_callback.py b/catalyst/contrib/callbacks/optuna_callback.py index a6b3a79aa8..fef350434d 100644 --- a/catalyst/contrib/callbacks/optuna_callback.py +++ b/catalyst/contrib/callbacks/optuna_callback.py @@ -1,6 +1,11 @@ +from typing import TYPE_CHECKING + import optuna -from catalyst.core import Callback, CallbackOrder, IRunner +from catalyst.core.callback import Callback, CallbackOrder + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class OptunaPruningCallback(Callback): diff --git a/catalyst/contrib/callbacks/perplexity_metric.py b/catalyst/contrib/callbacks/perplexity_metric.py index 737872ffef..3ba1f930f5 100644 --- a/catalyst/contrib/callbacks/perplexity_metric.py +++ b/catalyst/contrib/callbacks/perplexity_metric.py @@ -1,6 +1,6 @@ from torch import nn -from catalyst.core.callbacks import BatchMetricCallback +from catalyst.callbacks.metric import BatchMetricCallback class PerplexityMetricCallback(BatchMetricCallback): diff --git a/catalyst/contrib/callbacks/telegram_logger.py b/catalyst/contrib/callbacks/telegram_logger.py index a2b0331411..5a3cf85ecb 100644 --- a/catalyst/contrib/callbacks/telegram_logger.py +++ b/catalyst/contrib/callbacks/telegram_logger.py @@ -1,14 +1,16 @@ # flake8: noqa # @TODO: code formatting issue for 20.07 release -from typing import List +from typing import List, TYPE_CHECKING import logging from urllib.parse import quote_plus from urllib.request import Request, urlopen -from catalyst import utils from catalyst.core.callback import Callback, CallbackNode, CallbackOrder -from catalyst.core.runner import IRunner from catalyst.settings import SETTINGS +from catalyst.utils.misc import format_metric, is_exception + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class TelegramLogger(Callback): @@ -71,14 +73,14 @@ def _send_text(self, text: str): except Exception as e: logging.getLogger(__name__).warning(f"telegram.send.error:{e}") - def on_stage_start(self, runner: IRunner): + def on_stage_start(self, runner: "IRunner"): """Notify about starting a new stage.""" if self.log_on_stage_start: text = f"{runner.stage_name} stage was started" self._send_text(text) - def on_loader_start(self, runner: IRunner): + def on_loader_start(self, runner: "IRunner"): """Notify about starting running the new loader.""" if self.log_on_loader_start: text = ( @@ -87,7 +89,7 @@ def on_loader_start(self, runner: IRunner): self._send_text(text) - def on_loader_end(self, runner: IRunner): + def on_loader_end(self, runner: "IRunner"): """Translate ``runner.metric_manager`` to telegram channel.""" if self.log_on_loader_end: metrics = runner.loader_metrics @@ -104,24 +106,24 @@ def on_loader_end(self, runner: IRunner): for name in metrics_to_log: if name in metrics: - rows.append(utils.format_metric(name, metrics[name])) + rows.append(format_metric(name, metrics[name])) text = "\n".join(rows) self._send_text(text) - def on_stage_end(self, runner: IRunner): + def on_stage_end(self, runner: "IRunner"): """Notify about finishing a stage.""" if self.log_on_stage_end: text = f"{runner.stage_name} stage was finished" self._send_text(text) - def on_exception(self, runner: IRunner): + def on_exception(self, runner: "IRunner"): """Notify about raised ``Exception``.""" if self.log_on_exception: exception = runner.exception - if utils.is_exception(exception) and not isinstance( + if is_exception(exception) and not isinstance( exception, KeyboardInterrupt ): text = ( diff --git a/catalyst/contrib/callbacks/tests/test_gradnorm_logger.py b/catalyst/contrib/callbacks/tests/test_gradnorm_logger.py index 6bc8c45d4c..671c1c8399 100644 --- a/catalyst/contrib/callbacks/tests/test_gradnorm_logger.py +++ b/catalyst/contrib/callbacks/tests/test_gradnorm_logger.py @@ -8,10 +8,11 @@ from torch.optim import Adam from torch.utils.data import DataLoader +from catalyst.callbacks.criterion import CriterionCallback +from catalyst.callbacks.optimizer import OptimizerCallback from catalyst.contrib.callbacks.gradnorm_logger import GradNormLogger from catalyst.contrib.datasets import MNIST from catalyst.core.callback import Callback, CallbackOrder -from catalyst.core.callbacks import CriterionCallback, OptimizerCallback from catalyst.core.runner import IRunner from catalyst.data.cv import ToTensor from catalyst.dl import SupervisedRunner diff --git a/catalyst/contrib/callbacks/tests/test_optuna_callback.py b/catalyst/contrib/callbacks/tests/test_optuna_callback.py index a6a61aac7b..8b786733e7 100644 --- a/catalyst/contrib/callbacks/tests/test_optuna_callback.py +++ b/catalyst/contrib/callbacks/tests/test_optuna_callback.py @@ -8,7 +8,7 @@ from catalyst import dl from catalyst.contrib.callbacks import OptunaPruningCallback from catalyst.contrib.datasets import MNIST -from catalyst.contrib.nn import Flatten +from catalyst.contrib.nn.modules import Flatten from catalyst.data.cv.transforms.torch import ToTensor from catalyst.dl import AccuracyCallback diff --git a/catalyst/contrib/callbacks/tests/test_tracer_callback.py b/catalyst/contrib/callbacks/tests/test_tracer_callback.py index 391025e7a3..61b5cf7b6c 100644 --- a/catalyst/contrib/callbacks/tests/test_tracer_callback.py +++ b/catalyst/contrib/callbacks/tests/test_tracer_callback.py @@ -8,15 +8,18 @@ from torch.optim import Adam from torch.utils.data import DataLoader +from catalyst.callbacks import ( + CriterionCallback, + OptimizerCallback, + TracingCallback, +) from catalyst.contrib.datasets import MNIST from catalyst.core.callback import Callback, CallbackOrder -from catalyst.core.callbacks import CriterionCallback, OptimizerCallback from catalyst.core.runner import IRunner from catalyst.data.cv import ToTensor from catalyst.dl import SupervisedRunner -from catalyst.dl.callbacks.tracing import TracerCallback -from catalyst.dl.utils import get_device, get_trace_name from catalyst.registry import Model +from catalyst.utils import get_device, get_trace_name @Model @@ -163,7 +166,7 @@ def on_stage_end(self, runner: IRunner): def test_tracer_callback(): """ - Tests a feature of `TracerCallback` for model tracing during training + Tests a feature of `TracingCallback` for model tracing during training """ logdir = "./logs" dataset_root = "./data" @@ -191,7 +194,7 @@ def test_tracer_callback(): tracing_path = Path(logdir) / "trace" / trace_name criterion_callback = CriterionCallback() optimizer_callback = OptimizerCallback() - tracer_callback = TracerCallback( + tracer_callback = TracingCallback( metric="loss", minimize=False, trace_mode=mode, diff --git a/catalyst/contrib/callbacks/wandb_logger.py b/catalyst/contrib/callbacks/wandb_logger.py index 8042d6d20a..d48c87bbfa 100644 --- a/catalyst/contrib/callbacks/wandb_logger.py +++ b/catalyst/contrib/callbacks/wandb_logger.py @@ -1,17 +1,19 @@ # flake8: noqa # @TODO: code formatting issue for 20.07 release -from typing import Dict, List +from typing import Dict, List, TYPE_CHECKING import wandb -from catalyst import utils from catalyst.core.callback import ( Callback, CallbackNode, CallbackOrder, CallbackScope, ) -from catalyst.core.runner import IRunner +from catalyst.utils.dict import split_dict_to_subdicts + +if TYPE_CHECKING: + from catalyst.core.runner import IRunner class WandbLogger(Callback): @@ -139,18 +141,18 @@ def key_locate(key: str): } wandb.log(metrics, step=step, commit=commit) - def on_stage_start(self, runner: IRunner): + def on_stage_start(self, runner: "IRunner"): """Initialize Weights & Biases.""" wandb.init(**self.logging_params, reinit=True, dir=str(runner.logdir)) wandb.watch( models=runner.model, criterion=runner.criterion, log=self.log ) - def on_stage_end(self, runner: IRunner): + def on_stage_end(self, runner: "IRunner"): """Finish logging to Weights & Biases.""" wandb.join() - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): """Translate batch metrics to Weights & Biases.""" if self.log_on_batch_end: mode = runner.loader_name @@ -163,7 +165,7 @@ def on_batch_end(self, runner: IRunner): commit=True, ) - def on_loader_end(self, runner: IRunner): + def on_loader_end(self, runner: "IRunner"): """Translate loader metrics to Weights & Biases.""" if self.log_on_epoch_end: mode = runner.loader_name @@ -176,10 +178,10 @@ def on_loader_end(self, runner: IRunner): commit=False, ) - def on_epoch_end(self, runner: IRunner): + def on_epoch_end(self, runner: "IRunner"): """Translate epoch metrics to Weights & Biases.""" extra_mode = "_base" - splitted_epoch_metrics = utils.split_dict_to_subdicts( + splitted_epoch_metrics = split_dict_to_subdicts( dct=runner.epoch_metrics, prefixes=list(runner.loaders.keys()), extra_key=extra_mode, diff --git a/catalyst/utils/metrics/accuracy.py b/catalyst/metrics/accuracy.py similarity index 100% rename from catalyst/utils/metrics/accuracy.py rename to catalyst/metrics/accuracy.py diff --git a/catalyst/utils/metrics/auc.py b/catalyst/metrics/auc.py similarity index 100% rename from catalyst/utils/metrics/auc.py rename to catalyst/metrics/auc.py diff --git a/catalyst/utils/metrics/cmc_score.py b/catalyst/metrics/cmc_score.py similarity index 100% rename from catalyst/utils/metrics/cmc_score.py rename to catalyst/metrics/cmc_score.py diff --git a/catalyst/utils/metrics/dice.py b/catalyst/metrics/dice.py similarity index 100% rename from catalyst/utils/metrics/dice.py rename to catalyst/metrics/dice.py diff --git a/catalyst/utils/metrics/f1_score.py b/catalyst/metrics/f1_score.py similarity index 100% rename from catalyst/utils/metrics/f1_score.py rename to catalyst/metrics/f1_score.py diff --git a/catalyst/utils/metrics/focal.py b/catalyst/metrics/focal.py similarity index 100% rename from catalyst/utils/metrics/focal.py rename to catalyst/metrics/focal.py diff --git a/catalyst/metrics/functional.py b/catalyst/metrics/functional.py index 9e9073189e..102cf82643 100644 --- a/catalyst/metrics/functional.py +++ b/catalyst/metrics/functional.py @@ -1,7 +1,9 @@ -from typing import Tuple +from typing import Callable, Dict, Optional, Sequence, Tuple +from functools import partial import torch from torch import Tensor +from torch.nn import functional as F def get_binary_statistics( @@ -31,3 +33,179 @@ def get_binary_statistics( false_negative, support, ) + + +def preprocess_multi_label_metrics( + outputs: torch.Tensor, + targets: torch.Tensor, + weights: Optional[torch.Tensor] = None, +) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """ + General preprocessing and check for multi-label-based metrics. + + Args: + outputs: NxK tensor that for each of the N examples + indicates the probability of the example belonging to each of + the K classes, according to the model. + targets: binary NxK tensor that encodes which of the K + classes are associated with the N-th input + (eg: a row [0, 1, 0, 1] indicates that the example is + associated with classes 2 and 4) + weights: importance for each sample + + Returns: + processed ``outputs`` and ``targets`` + with [batch_size; num_classes] shape + """ + if not torch.is_tensor(outputs): + outputs = torch.from_numpy(outputs) + if not torch.is_tensor(targets): + targets = torch.from_numpy(targets) + if weights is not None: + if not torch.is_tensor(weights): + weights = torch.from_numpy(weights) + weights = weights.squeeze() + + if outputs.dim() == 1: + outputs = outputs.view(-1, 1) + else: + assert outputs.dim() == 2, ( + "wrong `outputs` size " + "(should be 1D or 2D with one column per class)" + ) + + if targets.dim() == 1: + if outputs.shape[1] > 1: + # multi-class case + num_classes = outputs.shape[1] + targets = F.one_hot(targets, num_classes).float() + else: + # binary case + targets = targets.view(-1, 1) + else: + assert targets.dim() == 2, ( + "wrong `targets` size " + "(should be 1D or 2D with one column per class)" + ) + + if weights is not None: + assert weights.dim() == 1, "Weights dimension should be 1" + assert weights.numel() == targets.size( + 0 + ), "Weights dimension 1 should be the same as that of target" + assert torch.min(weights) >= 0, "Weight should be non-negative only" + + assert torch.equal( + targets ** 2, targets + ), "targets should be binary (0 or 1)" + + return outputs, targets, weights + + +def get_default_topk_args(num_classes: int) -> Sequence[int]: + """Calculate list params for ``Accuracy@k`` and ``mAP@k``. + + Examples: + >>> get_default_topk_args(num_classes=4) + >>> [1, 3] + >>> get_default_topk_args(num_classes=8) + >>> [1, 3, 5] + + Args: + num_classes: number of classes + + Returns: + iterable: array of accuracy arguments + """ + result = [1] + + if num_classes is None: + return result + + if num_classes > 3: + result.append(3) + if num_classes > 5: + result.append(5) + + return result + + +def wrap_class_metric2dict( + metric_fn: Callable, class_args: Sequence[str] = None +) -> Callable: + """# noqa: D202 + Logging wrapper for metrics with torch.Tensor output + and [num_classes] shape. + Computes the metric and sync each element from the output Tensor + with passed `class` argument. + + Args: + metric_fn: metric function to compute + class_args: class names for logging. + default: None - class indexes will be used. + + Returns: + wrapped metric function with List[Dict] output + """ + + def class_metric_with_dict_output(*args, **kwargs): + output = metric_fn(*args, **kwargs) + num_classes = len(output) + output_class_args = class_args or [ + f"/class_{i:02}" for i in range(num_classes) + ] + mean_stats = torch.mean(output).item() + output = { + key: value.item() for key, value in zip(output_class_args, output) + } + output["/mean"] = mean_stats + return output + + return class_metric_with_dict_output + + +def wrap_topk_metric2dict( + metric_fn: Callable, topk_args: Sequence[int] +) -> Callable: + """ + Logging wrapper for metrics with + Sequence[Union[torch.Tensor, int, float, Dict]] output. + Computes the metric and sync each element from the output sequence + with passed `topk` argument. + + Args: + metric_fn: metric function to compute + topk_args: topk args to sync outputs with + + Returns: + wrapped metric function with List[Dict] output + + Raises: + NotImplementedError: if metrics returned values are out of + torch.Tensor, int, float, Dict union. + + """ + metric_fn = partial(metric_fn, topk=topk_args) + + def topk_metric_with_dict_output(*args, **kwargs): + output: Sequence = metric_fn(*args, **kwargs) + + if isinstance(output[0], (int, float, torch.Tensor)): + output = { + f"{topk_key:02}": metric_value + for topk_key, metric_value in zip(topk_args, output) + } + elif isinstance(output[0], Dict): + output = { + { + f"{metric_key}{topk_key:02}": metric_value + for metric_key, metric_value in metric_dict_value.items() + } + for topk_key, metric_dict_value in zip(topk_args, output) + } + else: + raise NotImplementedError() + + return output + + return topk_metric_with_dict_output diff --git a/catalyst/utils/metrics/iou.py b/catalyst/metrics/iou.py similarity index 100% rename from catalyst/utils/metrics/iou.py rename to catalyst/metrics/iou.py diff --git a/catalyst/utils/metrics/precision.py b/catalyst/metrics/precision.py similarity index 100% rename from catalyst/utils/metrics/precision.py rename to catalyst/metrics/precision.py diff --git a/catalyst/utils/metrics/tests/__init__.py b/catalyst/metrics/tests/__init__.py similarity index 100% rename from catalyst/utils/metrics/tests/__init__.py rename to catalyst/metrics/tests/__init__.py diff --git a/catalyst/utils/metrics/tests/test_accuracy.py b/catalyst/metrics/tests/test_accuracy.py similarity index 100% rename from catalyst/utils/metrics/tests/test_accuracy.py rename to catalyst/metrics/tests/test_accuracy.py diff --git a/catalyst/utils/metrics/tests/test_auc.py b/catalyst/metrics/tests/test_auc.py similarity index 100% rename from catalyst/utils/metrics/tests/test_auc.py rename to catalyst/metrics/tests/test_auc.py diff --git a/catalyst/utils/metrics/tests/test_average_precision.py b/catalyst/metrics/tests/test_average_precision.py similarity index 100% rename from catalyst/utils/metrics/tests/test_average_precision.py rename to catalyst/metrics/tests/test_average_precision.py diff --git a/catalyst/utils/metrics/tests/test_cmc_metric.py b/catalyst/metrics/tests/test_cmc_metric.py similarity index 100% rename from catalyst/utils/metrics/tests/test_cmc_metric.py rename to catalyst/metrics/tests/test_cmc_metric.py diff --git a/catalyst/utils/metrics/tests/test_dice.py b/catalyst/metrics/tests/test_dice.py similarity index 100% rename from catalyst/utils/metrics/tests/test_dice.py rename to catalyst/metrics/tests/test_dice.py diff --git a/catalyst/utils/metrics/tests/test_iou.py b/catalyst/metrics/tests/test_iou.py similarity index 100% rename from catalyst/utils/metrics/tests/test_iou.py rename to catalyst/metrics/tests/test_iou.py diff --git a/catalyst/utils/metrics/__init__.py b/catalyst/utils/metrics/__init__.py index 2211d0dbc0..40e21b7d89 100644 --- a/catalyst/utils/metrics/__init__.py +++ b/catalyst/utils/metrics/__init__.py @@ -1,17 +1,3 @@ # flake8: noqa -from catalyst.utils.metrics.accuracy import ( - accuracy, - multi_label_accuracy, -) -from catalyst.utils.metrics.auc import auc -from catalyst.utils.metrics.cmc_score import cmc_score_count, cmc_score -from catalyst.utils.metrics.dice import dice, calculate_dice -from catalyst.utils.metrics.f1_score import f1_score -from catalyst.utils.metrics.focal import reduced_focal_loss, sigmoid_focal_loss -from catalyst.utils.metrics.iou import iou, jaccard -from catalyst.utils.metrics.precision import average_precision -from catalyst.utils.metrics.functional import ( - get_default_topk_args, - wrap_class_metric2dict, - wrap_topk_metric2dict, -) +# backward compatibility +from catalyst.metrics import * diff --git a/catalyst/utils/metrics/functional.py b/catalyst/utils/metrics/functional.py deleted file mode 100644 index 3329fdb43d..0000000000 --- a/catalyst/utils/metrics/functional.py +++ /dev/null @@ -1,181 +0,0 @@ -from typing import Callable, Dict, Optional, Sequence, Tuple -from functools import partial - -import torch -from torch.nn import functional as F - - -def preprocess_multi_label_metrics( - outputs: torch.Tensor, - targets: torch.Tensor, - weights: Optional[torch.Tensor] = None, -) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: - """ - General preprocessing and check for multi-label-based metrics. - - Args: - outputs: NxK tensor that for each of the N examples - indicates the probability of the example belonging to each of - the K classes, according to the model. - targets: binary NxK tensor that encodes which of the K - classes are associated with the N-th input - (eg: a row [0, 1, 0, 1] indicates that the example is - associated with classes 2 and 4) - weights: importance for each sample - - Returns: - processed ``outputs`` and ``targets`` - with [batch_size; num_classes] shape - """ - if not torch.is_tensor(outputs): - outputs = torch.from_numpy(outputs) - if not torch.is_tensor(targets): - targets = torch.from_numpy(targets) - if weights is not None: - if not torch.is_tensor(weights): - weights = torch.from_numpy(weights) - weights = weights.squeeze() - - if outputs.dim() == 1: - outputs = outputs.view(-1, 1) - else: - assert outputs.dim() == 2, ( - "wrong `outputs` size " - "(should be 1D or 2D with one column per class)" - ) - - if targets.dim() == 1: - if outputs.shape[1] > 1: - # multi-class case - num_classes = outputs.shape[1] - targets = F.one_hot(targets, num_classes).float() - else: - # binary case - targets = targets.view(-1, 1) - else: - assert targets.dim() == 2, ( - "wrong `targets` size " - "(should be 1D or 2D with one column per class)" - ) - - if weights is not None: - assert weights.dim() == 1, "Weights dimension should be 1" - assert weights.numel() == targets.size( - 0 - ), "Weights dimension 1 should be the same as that of target" - assert torch.min(weights) >= 0, "Weight should be non-negative only" - - assert torch.equal( - targets ** 2, targets - ), "targets should be binary (0 or 1)" - - return outputs, targets, weights - - -def get_default_topk_args(num_classes: int) -> Sequence[int]: - """Calculate list params for ``Accuracy@k`` and ``mAP@k``. - - Examples: - >>> get_default_topk_args(num_classes=4) - >>> [1, 3] - >>> get_default_topk_args(num_classes=8) - >>> [1, 3, 5] - - Args: - num_classes: number of classes - - Returns: - iterable: array of accuracy arguments - """ - result = [1] - - if num_classes is None: - return result - - if num_classes > 3: - result.append(3) - if num_classes > 5: - result.append(5) - - return result - - -def wrap_class_metric2dict( - metric_fn: Callable, class_args: Sequence[str] = None -) -> Callable: - """# noqa: D202 - Logging wrapper for metrics with torch.Tensor output - and [num_classes] shape. - Computes the metric and sync each element from the output Tensor - with passed `class` argument. - - Args: - metric_fn: metric function to compute - class_args: class names for logging. - default: None - class indexes will be used. - - Returns: - wrapped metric function with List[Dict] output - """ - - def class_metric_with_dict_output(*args, **kwargs): - output = metric_fn(*args, **kwargs) - num_classes = len(output) - output_class_args = class_args or [ - f"/class_{i:02}" for i in range(num_classes) - ] - mean_stats = torch.mean(output).item() - output = { - key: value.item() for key, value in zip(output_class_args, output) - } - output["/mean"] = mean_stats - return output - - return class_metric_with_dict_output - - -def wrap_topk_metric2dict( - metric_fn: Callable, topk_args: Sequence[int] -) -> Callable: - """ - Logging wrapper for metrics with - Sequence[Union[torch.Tensor, int, float, Dict]] output. - Computes the metric and sync each element from the output sequence - with passed `topk` argument. - - Args: - metric_fn: metric function to compute - topk_args: topk args to sync outputs with - - Returns: - wrapped metric function with List[Dict] output - - Raises: - NotImplementedError: if metrics returned values are out of - torch.Tensor, int, float, Dict union. - - """ - metric_fn = partial(metric_fn, topk=topk_args) - - def topk_metric_with_dict_output(*args, **kwargs): - output: Sequence = metric_fn(*args, **kwargs) - - if isinstance(output[0], (int, float, torch.Tensor)): - output = { - f"{topk_key:02}": metric_value - for topk_key, metric_value in zip(topk_args, output) - } - elif isinstance(output[0], Dict): - output = { - { - f"{metric_key}{topk_key:02}": metric_value - for metric_key, metric_value in metric_dict_value.items() - } - for topk_key, metric_dict_value in zip(topk_args, output) - } - else: - raise NotImplementedError() - - return output - - return topk_metric_with_dict_output diff --git a/docs/api/dl.rst b/docs/api/dl.rst index 6d155ca28c..791c2f8ab4 100644 --- a/docs/api/dl.rst +++ b/docs/api/dl.rst @@ -100,7 +100,7 @@ LRFinder :undoc-members: :show-inheritance: -TracerCallback +TracingCallback """""""""""""""""""""" .. automodule:: catalyst.dl.callbacks.tracing :members: diff --git a/tests/_tests_dl_callbacks/config20.yml b/tests/_tests_dl_callbacks/config20.yml index 18b4fb4e40..b84e9b3cc2 100644 --- a/tests/_tests_dl_callbacks/config20.yml +++ b/tests/_tests_dl_callbacks/config20.yml @@ -47,7 +47,7 @@ stages: saver: callback: CheckpointCallback tracer: - callback: TracerCallback + callback: TracingCallback metric: "loss" minimize: True mode: "best" From 3e3910d45e76fc5a78f235f3fc56ab480cb25047 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 13:51:15 +0300 Subject: [PATCH 07/30] imports3 --- catalyst/{utils/callbacks.py => core/functional.py} | 0 catalyst/core/runner.py | 8 ++++---- catalyst/experiments/config.py | 2 +- catalyst/experiments/experiment.py | 6 +++--- catalyst/experiments/supervised.py | 2 +- catalyst/metrics/accuracy.py | 2 +- catalyst/metrics/precision.py | 2 +- catalyst/runners/runner.py | 2 +- catalyst/utils/__init__.py | 6 ------ catalyst/utils/tracing.py | 5 +++-- 10 files changed, 15 insertions(+), 20 deletions(-) rename catalyst/{utils/callbacks.py => core/functional.py} (100%) diff --git a/catalyst/utils/callbacks.py b/catalyst/core/functional.py similarity index 100% rename from catalyst/utils/callbacks.py rename to catalyst/core/functional.py diff --git a/catalyst/core/runner.py b/catalyst/core/runner.py index 2b5e26c684..72fd59c2a1 100644 --- a/catalyst/core/runner.py +++ b/catalyst/core/runner.py @@ -9,6 +9,10 @@ from catalyst.core.callback import Callback, CallbackScope from catalyst.core.experiment import IExperiment +from catalyst.core.functional import ( + filter_callbacks_by_node, + sort_callbacks_by_order, +) from catalyst.core.legacy import IRunnerLegacy from catalyst.settings import SETTINGS from catalyst.tools.frozen_class import FrozenClass @@ -23,10 +27,6 @@ RunnerScheduler, Scheduler, ) -from catalyst.utils.callbacks import ( - filter_callbacks_by_node, - sort_callbacks_by_order, -) from catalyst.utils.components import process_components from catalyst.utils.distributed import get_rank from catalyst.utils.loaders import validate_loaders diff --git a/catalyst/experiments/config.py b/catalyst/experiments/config.py index 3d07f6f3e5..114251e57a 100644 --- a/catalyst/experiments/config.py +++ b/catalyst/experiments/config.py @@ -27,6 +27,7 @@ from catalyst.callbacks.validation import ValidationManagerCallback from catalyst.core.callback import Callback from catalyst.core.experiment import IExperiment +from catalyst.core.functional import check_callback_isinstance from catalyst.data.augmentor import Augmentor, AugmentorCompose from catalyst.registry import ( CALLBACKS, @@ -37,7 +38,6 @@ TRANSFORMS, ) from catalyst.typing import Criterion, Model, Optimizer, Scheduler -from catalyst.utils.callbacks import check_callback_isinstance from catalyst.utils.checkpoint import load_checkpoint, unpack_checkpoint from catalyst.utils.dict import merge_dicts from catalyst.utils.distributed import check_amp_available, get_rank diff --git a/catalyst/experiments/experiment.py b/catalyst/experiments/experiment.py index 9d99315827..45ab0d5c7e 100644 --- a/catalyst/experiments/experiment.py +++ b/catalyst/experiments/experiment.py @@ -18,12 +18,12 @@ from catalyst.callbacks.timer import TimerCallback from catalyst.callbacks.validation import ValidationManagerCallback from catalyst.core.experiment import IExperiment -from catalyst.settings import SETTINGS -from catalyst.typing import Criterion, Model, Optimizer, Scheduler -from catalyst.utils.callbacks import ( +from catalyst.core.functional import ( check_callback_isinstance, sort_callbacks_by_order, ) +from catalyst.settings import SETTINGS +from catalyst.typing import Criterion, Model, Optimizer, Scheduler from catalyst.utils.loaders import get_loaders_from_params diff --git a/catalyst/experiments/supervised.py b/catalyst/experiments/supervised.py index 073ba2e194..6f1df80007 100644 --- a/catalyst/experiments/supervised.py +++ b/catalyst/experiments/supervised.py @@ -10,9 +10,9 @@ ) from catalyst.callbacks.scheduler import ISchedulerCallback, SchedulerCallback from catalyst.core.callback import Callback +from catalyst.core.functional import check_callback_isinstance from catalyst.experiments.experiment import Experiment from catalyst.typing import Criterion, Optimizer, Scheduler -from catalyst.utils.callbacks import check_callback_isinstance from catalyst.utils.distributed import check_amp_available diff --git a/catalyst/metrics/accuracy.py b/catalyst/metrics/accuracy.py index bd537d4acf..c57e59edd2 100644 --- a/catalyst/metrics/accuracy.py +++ b/catalyst/metrics/accuracy.py @@ -9,7 +9,7 @@ import torch -from catalyst.utils.metrics.functional import preprocess_multi_label_metrics +from catalyst.metrics.functional import preprocess_multi_label_metrics from catalyst.utils.torch import get_activation_fn diff --git a/catalyst/metrics/precision.py b/catalyst/metrics/precision.py index b36983f28d..1f62fe1b05 100644 --- a/catalyst/metrics/precision.py +++ b/catalyst/metrics/precision.py @@ -2,7 +2,7 @@ import torch -from catalyst.utils.metrics.functional import preprocess_multi_label_metrics +from catalyst.metrics.functional import preprocess_multi_label_metrics def average_precision( diff --git a/catalyst/runners/runner.py b/catalyst/runners/runner.py index bb3929de6b..1764a98d00 100644 --- a/catalyst/runners/runner.py +++ b/catalyst/runners/runner.py @@ -7,10 +7,10 @@ from catalyst.callbacks.checkpoint import CheckpointCallback from catalyst.core.callback import Callback +from catalyst.core.functional import sort_callbacks_by_order from catalyst.core.runner import IStageBasedRunner from catalyst.experiments.experiment import Experiment from catalyst.typing import Criterion, Device, Model, Optimizer, Scheduler -from catalyst.utils.callbacks import sort_callbacks_by_order from catalyst.utils.checkpoint import load_checkpoint, unpack_checkpoint from catalyst.utils.components import process_components from catalyst.utils.misc import maybe_recursive_call diff --git a/catalyst/utils/__init__.py b/catalyst/utils/__init__.py index 038d4e47aa..d4eff1f6ee 100644 --- a/catalyst/utils/__init__.py +++ b/catalyst/utils/__init__.py @@ -125,9 +125,3 @@ from catalyst.utils.pipelines import clone_pipeline from catalyst.utils.wizard import run_wizard, Wizard -from catalyst.utils.callbacks import ( - sort_callbacks_by_order, - filter_callbacks_by_node, - get_original_callback, - check_callback_isinstance, -) diff --git a/catalyst/utils/tracing.py b/catalyst/utils/tracing.py index c6fff48dad..641cdbb8c6 100644 --- a/catalyst/utils/tracing.py +++ b/catalyst/utils/tracing.py @@ -5,7 +5,7 @@ from torch import jit, nn -from catalyst.core.runner import IRunner + from catalyst.typing import Device, Model from catalyst.utils.checkpoint import ( load_checkpoint, @@ -27,6 +27,7 @@ ) if TYPE_CHECKING: + from catalyst.core.runner import IRunner from catalyst.experiments import ConfigExperiment logger = logging.getLogger(__name__) @@ -244,7 +245,7 @@ def predict_fn(model, inputs, **kwargs): # noqa: WPS442 def trace_model_from_runner( - runner: IRunner, + runner: "IRunner", checkpoint_name: str = None, method_name: str = "forward", mode: str = "eval", From 9afa21722a0c3114ebee45d845190e9b5d78bf13 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 14:57:30 +0300 Subject: [PATCH 08/30] imports4 --- catalyst/callbacks/__init__.py | 2 ++ catalyst/callbacks/formatters.py | 4 ++-- .../contrib/callbacks/confusion_matrix_logger.py | 6 +++--- catalyst/contrib/callbacks/mixup_callback.py | 6 +++--- .../callbacks/tests/test_gradnorm_logger.py | 2 +- .../callbacks/tests/test_tracer_callback.py | 2 +- catalyst/contrib/{nn => }/models/__init__.py | 8 ++++---- catalyst/contrib/{nn => }/models/cv/__init__.py | 0 .../{nn => }/models/cv/classification/__init__.py | 0 .../{nn => }/models/cv/encoders/__init__.py | 0 .../contrib/{nn => }/models/cv/encoders/resnet.py | 0 .../{nn => }/models/cv/segmentation/README.md | 0 .../{nn => }/models/cv/segmentation/__init__.py | 0 .../contrib/{nn => }/models/cv/segmentation/abn.py | 0 .../models/cv/segmentation/blocks/__init__.py | 6 ------ .../{nn => }/models/cv/segmentation/blocks/core.py | 0 .../{nn => }/models/cv/segmentation/blocks/fpn.py | 0 .../{nn => }/models/cv/segmentation/blocks/psp.py | 0 .../{nn => }/models/cv/segmentation/blocks/unet.py | 0 .../models/cv/segmentation/bridge/__init__.py | 0 .../{nn => }/models/cv/segmentation/bridge/core.py | 0 .../{nn => }/models/cv/segmentation/bridge/unet.py | 0 .../{nn => }/models/cv/segmentation/core.py | 0 .../models/cv/segmentation/decoder/__init__.py | 0 .../models/cv/segmentation/decoder/core.py | 0 .../{nn => }/models/cv/segmentation/decoder/fpn.py | 0 .../{nn => }/models/cv/segmentation/decoder/psp.py | 0 .../models/cv/segmentation/decoder/unet.py | 4 +--- .../models/cv/segmentation/encoder/__init__.py | 0 .../models/cv/segmentation/encoder/core.py | 0 .../models/cv/segmentation/encoder/resnet.py | 0 .../models/cv/segmentation/encoder/unet.py | 4 +--- .../contrib/{nn => }/models/cv/segmentation/fpn.py | 0 .../models/cv/segmentation/head/__init__.py | 0 .../{nn => }/models/cv/segmentation/head/core.py | 0 .../{nn => }/models/cv/segmentation/head/fpn.py | 0 .../{nn => }/models/cv/segmentation/head/unet.py | 0 .../{nn => }/models/cv/segmentation/linknet.py | 0 .../contrib/{nn => }/models/cv/segmentation/psp.py | 0 .../{nn => }/models/cv/segmentation/unet.py | 0 catalyst/contrib/{nn => }/models/functional.py | 0 catalyst/contrib/{nn => }/models/hydra.py | 0 catalyst/contrib/{nn => }/models/nlp/__init__.py | 0 .../{nn => }/models/nlp/classification/__init__.py | 0 .../{nn => }/models/nlp/classification/bert.py | 0 .../{nn => }/models/nlp/encoders/__init__.py | 0 catalyst/contrib/{nn => }/models/sequential.py | 0 catalyst/contrib/{nn => }/models/simple_conv.py | 0 catalyst/contrib/{nn => }/models/tests/__init__.py | 0 catalyst/contrib/{nn => }/models/tests/config3.yml | 0 catalyst/contrib/{nn => }/models/tests/config4.yml | 0 .../contrib/{nn => }/models/tests/test_hydra.py | 0 catalyst/contrib/nn/__init__.py | 6 ++++++ catalyst/contrib/nn/criterion/__init__.py | 13 +++++++++++++ catalyst/contrib/nn/modules/__init__.py | 5 ++--- catalyst/contrib/nn/modules/arcface.py | 3 +++ catalyst/contrib/nn/modules/cosface.py | 3 +++ catalyst/contrib/nn/modules/softmax.py | 3 +++ catalyst/contrib/nn/optimizers/__init__.py | 9 ++++++++- catalyst/contrib/{ => nn}/tests/__init__.py | 0 catalyst/contrib/{ => nn}/tests/test_criterion.py | 0 catalyst/contrib/{ => nn}/tests/test_modules.py | 0 catalyst/contrib/{ => nn}/tests/test_optimizer.py | 0 catalyst/metrics/__init__.py | 14 ++++++++++++++ catalyst/metrics/cmc_score.py | 3 +++ catalyst/metrics/functional.py | 7 +++++++ catalyst/utils/__init__.py | 1 - catalyst/utils/loaders.py | 13 +++++++++---- catalyst/utils/tracing.py | 1 - 69 files changed, 89 insertions(+), 36 deletions(-) rename catalyst/contrib/{nn => }/models/__init__.py (78%) rename catalyst/contrib/{nn => }/models/cv/__init__.py (100%) rename catalyst/contrib/{nn => }/models/cv/classification/__init__.py (100%) rename catalyst/contrib/{nn => }/models/cv/encoders/__init__.py (100%) rename catalyst/contrib/{nn => }/models/cv/encoders/resnet.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/README.md (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/__init__.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/abn.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/blocks/__init__.py (58%) rename catalyst/contrib/{nn => }/models/cv/segmentation/blocks/core.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/blocks/fpn.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/blocks/psp.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/blocks/unet.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/bridge/__init__.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/bridge/core.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/bridge/unet.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/core.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/decoder/__init__.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/decoder/core.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/decoder/fpn.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/decoder/psp.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/decoder/unet.py (96%) rename catalyst/contrib/{nn => }/models/cv/segmentation/encoder/__init__.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/encoder/core.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/encoder/resnet.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/encoder/unet.py (95%) rename catalyst/contrib/{nn => }/models/cv/segmentation/fpn.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/head/__init__.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/head/core.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/head/fpn.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/head/unet.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/linknet.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/psp.py (100%) rename catalyst/contrib/{nn => }/models/cv/segmentation/unet.py (100%) rename catalyst/contrib/{nn => }/models/functional.py (100%) rename catalyst/contrib/{nn => }/models/hydra.py (100%) rename catalyst/contrib/{nn => }/models/nlp/__init__.py (100%) rename catalyst/contrib/{nn => }/models/nlp/classification/__init__.py (100%) rename catalyst/contrib/{nn => }/models/nlp/classification/bert.py (100%) rename catalyst/contrib/{nn => }/models/nlp/encoders/__init__.py (100%) rename catalyst/contrib/{nn => }/models/sequential.py (100%) rename catalyst/contrib/{nn => }/models/simple_conv.py (100%) rename catalyst/contrib/{nn => }/models/tests/__init__.py (100%) rename catalyst/contrib/{nn => }/models/tests/config3.yml (100%) rename catalyst/contrib/{nn => }/models/tests/config4.yml (100%) rename catalyst/contrib/{nn => }/models/tests/test_hydra.py (100%) rename catalyst/contrib/{ => nn}/tests/__init__.py (100%) rename catalyst/contrib/{ => nn}/tests/test_criterion.py (100%) rename catalyst/contrib/{ => nn}/tests/test_modules.py (100%) rename catalyst/contrib/{ => nn}/tests/test_optimizer.py (100%) diff --git a/catalyst/callbacks/__init__.py b/catalyst/callbacks/__init__.py index b8c117bd36..5b162a98ff 100644 --- a/catalyst/callbacks/__init__.py +++ b/catalyst/callbacks/__init__.py @@ -58,3 +58,5 @@ if IS_PRUNING_AVAILABLE: from catalyst.callbacks.pruning import PruningCallback + +from catalyst.contrib.callbacks import * diff --git a/catalyst/callbacks/formatters.py b/catalyst/callbacks/formatters.py index 363ae23941..95ed12fbea 100644 --- a/catalyst/callbacks/formatters.py +++ b/catalyst/callbacks/formatters.py @@ -19,7 +19,7 @@ def __init__(self, message_prefix): super().__init__(f"{message_prefix}{{message}}", style="{") @abstractmethod - def _format_message(self, runner: IRunner): + def _format_message(self, runner: "IRunner"): pass def format(self, record: logging.LogRecord): @@ -61,7 +61,7 @@ def _format_metrics(self, metrics: Dict[str, Dict[str, float]]): return metrics_formatted - def _format_message(self, runner: IRunner): + def _format_message(self, runner: "IRunner"): message = [""] mode_metrics = split_dict_to_subdicts( dct=runner.epoch_metrics, diff --git a/catalyst/contrib/callbacks/confusion_matrix_logger.py b/catalyst/contrib/callbacks/confusion_matrix_logger.py index f6fa7567ac..a8f6465811 100644 --- a/catalyst/contrib/callbacks/confusion_matrix_logger.py +++ b/catalyst/contrib/callbacks/confusion_matrix_logger.py @@ -107,7 +107,7 @@ def _plot_confusion_matrix( fig = render_figure_to_tensor(fig) logger.add_image(f"{self.prefix}/epoch", fig, global_step=epoch) - def on_loader_start(self, runner: IRunner): + def on_loader_start(self, runner: "IRunner"): """Loader start hook. Args: @@ -115,7 +115,7 @@ def on_loader_start(self, runner: IRunner): """ self._reset_stats() - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): """Batch end hook. Args: @@ -126,7 +126,7 @@ def on_batch_end(self, runner: IRunner): runner.input[self.input_key].detach(), ) - def on_loader_end(self, runner: IRunner): + def on_loader_end(self, runner: "IRunner"): """Loader end hook. Args: diff --git a/catalyst/contrib/callbacks/mixup_callback.py b/catalyst/contrib/callbacks/mixup_callback.py index 4621b65b4b..fb71e7ffb4 100644 --- a/catalyst/contrib/callbacks/mixup_callback.py +++ b/catalyst/contrib/callbacks/mixup_callback.py @@ -59,7 +59,7 @@ def __init__( self.index = None self.is_needed = True - def _compute_loss_value(self, runner: IRunner, criterion): + def _compute_loss_value(self, runner: "IRunner", criterion): if not self.is_needed: return super()._compute_loss_value(runner, criterion) @@ -72,7 +72,7 @@ def _compute_loss_value(self, runner: IRunner, criterion): ) return loss - def on_loader_start(self, runner: IRunner): + def on_loader_start(self, runner: "IRunner"): """Loader start hook. Args: @@ -80,7 +80,7 @@ def on_loader_start(self, runner: IRunner): """ self.is_needed = not self.on_train_only or runner.is_train_loader - def on_batch_start(self, runner: IRunner): + def on_batch_start(self, runner: "IRunner"): """Batch start hook. Args: diff --git a/catalyst/contrib/callbacks/tests/test_gradnorm_logger.py b/catalyst/contrib/callbacks/tests/test_gradnorm_logger.py index 671c1c8399..ffcbc55d0a 100644 --- a/catalyst/contrib/callbacks/tests/test_gradnorm_logger.py +++ b/catalyst/contrib/callbacks/tests/test_gradnorm_logger.py @@ -104,7 +104,7 @@ def __init__(self, prefix: str): super().__init__(CallbackOrder.external) self.prefix = prefix - def on_batch_end(self, runner: IRunner): + def on_batch_end(self, runner: "IRunner"): if not runner.is_train_loader: return diff --git a/catalyst/contrib/callbacks/tests/test_tracer_callback.py b/catalyst/contrib/callbacks/tests/test_tracer_callback.py index 61b5cf7b6c..e074fb7430 100644 --- a/catalyst/contrib/callbacks/tests/test_tracer_callback.py +++ b/catalyst/contrib/callbacks/tests/test_tracer_callback.py @@ -147,7 +147,7 @@ def __init__(self, path: Union[str, Path], inputs: torch.Tensor): self.inputs: torch.Tensor = inputs self.device = get_device() - def on_stage_end(self, runner: IRunner): + def on_stage_end(self, runner: "IRunner"): """ Args: runner: current runner diff --git a/catalyst/contrib/nn/models/__init__.py b/catalyst/contrib/models/__init__.py similarity index 78% rename from catalyst/contrib/nn/models/__init__.py rename to catalyst/contrib/models/__init__.py index 48e4265909..24429486b2 100644 --- a/catalyst/contrib/nn/models/__init__.py +++ b/catalyst/contrib/models/__init__.py @@ -3,16 +3,16 @@ from catalyst.settings import SETTINGS -from catalyst.contrib.nn.models.functional import ( +from catalyst.contrib.models.functional import ( get_convolution_net, get_linear_net, ) -from catalyst.contrib.nn.models.hydra import Hydra -from catalyst.contrib.nn.models.sequential import ( +from catalyst.contrib.models.hydra import Hydra +from catalyst.contrib.models.sequential import ( ResidualWrapper, SequentialNet, ) -from catalyst.contrib.nn.models.simple_conv import SimpleConv +from catalyst.contrib.models.simple_conv import SimpleConv logger = logging.getLogger(__name__) diff --git a/catalyst/contrib/nn/models/cv/__init__.py b/catalyst/contrib/models/cv/__init__.py similarity index 100% rename from catalyst/contrib/nn/models/cv/__init__.py rename to catalyst/contrib/models/cv/__init__.py diff --git a/catalyst/contrib/nn/models/cv/classification/__init__.py b/catalyst/contrib/models/cv/classification/__init__.py similarity index 100% rename from catalyst/contrib/nn/models/cv/classification/__init__.py rename to catalyst/contrib/models/cv/classification/__init__.py diff --git a/catalyst/contrib/nn/models/cv/encoders/__init__.py b/catalyst/contrib/models/cv/encoders/__init__.py similarity index 100% rename from catalyst/contrib/nn/models/cv/encoders/__init__.py rename to catalyst/contrib/models/cv/encoders/__init__.py diff --git a/catalyst/contrib/nn/models/cv/encoders/resnet.py b/catalyst/contrib/models/cv/encoders/resnet.py similarity index 100% rename from catalyst/contrib/nn/models/cv/encoders/resnet.py rename to catalyst/contrib/models/cv/encoders/resnet.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/README.md b/catalyst/contrib/models/cv/segmentation/README.md similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/README.md rename to catalyst/contrib/models/cv/segmentation/README.md diff --git a/catalyst/contrib/nn/models/cv/segmentation/__init__.py b/catalyst/contrib/models/cv/segmentation/__init__.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/__init__.py rename to catalyst/contrib/models/cv/segmentation/__init__.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/abn.py b/catalyst/contrib/models/cv/segmentation/abn.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/abn.py rename to catalyst/contrib/models/cv/segmentation/abn.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/blocks/__init__.py b/catalyst/contrib/models/cv/segmentation/blocks/__init__.py similarity index 58% rename from catalyst/contrib/nn/models/cv/segmentation/blocks/__init__.py rename to catalyst/contrib/models/cv/segmentation/blocks/__init__.py index a6cee31144..4bfb880b5b 100644 --- a/catalyst/contrib/nn/models/cv/segmentation/blocks/__init__.py +++ b/catalyst/contrib/models/cv/segmentation/blocks/__init__.py @@ -8,9 +8,3 @@ PyramidBlock, PSPBlock, ) -from catalyst.contrib.nn.models.cv.segmentation.blocks.unet import ( - EncoderDownsampleBlock, - EncoderUpsampleBlock, - DecoderConcatBlock, - DecoderSumBlock, -) diff --git a/catalyst/contrib/nn/models/cv/segmentation/blocks/core.py b/catalyst/contrib/models/cv/segmentation/blocks/core.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/blocks/core.py rename to catalyst/contrib/models/cv/segmentation/blocks/core.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/blocks/fpn.py b/catalyst/contrib/models/cv/segmentation/blocks/fpn.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/blocks/fpn.py rename to catalyst/contrib/models/cv/segmentation/blocks/fpn.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/blocks/psp.py b/catalyst/contrib/models/cv/segmentation/blocks/psp.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/blocks/psp.py rename to catalyst/contrib/models/cv/segmentation/blocks/psp.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/blocks/unet.py b/catalyst/contrib/models/cv/segmentation/blocks/unet.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/blocks/unet.py rename to catalyst/contrib/models/cv/segmentation/blocks/unet.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/bridge/__init__.py b/catalyst/contrib/models/cv/segmentation/bridge/__init__.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/bridge/__init__.py rename to catalyst/contrib/models/cv/segmentation/bridge/__init__.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/bridge/core.py b/catalyst/contrib/models/cv/segmentation/bridge/core.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/bridge/core.py rename to catalyst/contrib/models/cv/segmentation/bridge/core.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/bridge/unet.py b/catalyst/contrib/models/cv/segmentation/bridge/unet.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/bridge/unet.py rename to catalyst/contrib/models/cv/segmentation/bridge/unet.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/core.py b/catalyst/contrib/models/cv/segmentation/core.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/core.py rename to catalyst/contrib/models/cv/segmentation/core.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/decoder/__init__.py b/catalyst/contrib/models/cv/segmentation/decoder/__init__.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/decoder/__init__.py rename to catalyst/contrib/models/cv/segmentation/decoder/__init__.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/decoder/core.py b/catalyst/contrib/models/cv/segmentation/decoder/core.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/decoder/core.py rename to catalyst/contrib/models/cv/segmentation/decoder/core.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/decoder/fpn.py b/catalyst/contrib/models/cv/segmentation/decoder/fpn.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/decoder/fpn.py rename to catalyst/contrib/models/cv/segmentation/decoder/fpn.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/decoder/psp.py b/catalyst/contrib/models/cv/segmentation/decoder/psp.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/decoder/psp.py rename to catalyst/contrib/models/cv/segmentation/decoder/psp.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/decoder/unet.py b/catalyst/contrib/models/cv/segmentation/decoder/unet.py similarity index 96% rename from catalyst/contrib/nn/models/cv/segmentation/decoder/unet.py rename to catalyst/contrib/models/cv/segmentation/decoder/unet.py index e535c43d1a..a52c801947 100644 --- a/catalyst/contrib/nn/models/cv/segmentation/decoder/unet.py +++ b/catalyst/contrib/models/cv/segmentation/decoder/unet.py @@ -5,11 +5,9 @@ import torch from torch import nn +from catalyst.contrib.models.cv import DecoderConcatBlock from catalyst.contrib.models.cv.segmentation.blocks.core import DecoderBlock from catalyst.contrib.models.cv.segmentation.decoder.core import DecoderSpec -from catalyst.contrib.nn.models.cv.segmentation.blocks.unet import ( - DecoderConcatBlock, -) class UNetDecoder(DecoderSpec): diff --git a/catalyst/contrib/nn/models/cv/segmentation/encoder/__init__.py b/catalyst/contrib/models/cv/segmentation/encoder/__init__.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/encoder/__init__.py rename to catalyst/contrib/models/cv/segmentation/encoder/__init__.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/encoder/core.py b/catalyst/contrib/models/cv/segmentation/encoder/core.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/encoder/core.py rename to catalyst/contrib/models/cv/segmentation/encoder/core.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/encoder/resnet.py b/catalyst/contrib/models/cv/segmentation/encoder/resnet.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/encoder/resnet.py rename to catalyst/contrib/models/cv/segmentation/encoder/resnet.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/encoder/unet.py b/catalyst/contrib/models/cv/segmentation/encoder/unet.py similarity index 95% rename from catalyst/contrib/nn/models/cv/segmentation/encoder/unet.py rename to catalyst/contrib/models/cv/segmentation/encoder/unet.py index 674cb43b4e..13c44ad95a 100644 --- a/catalyst/contrib/nn/models/cv/segmentation/encoder/unet.py +++ b/catalyst/contrib/models/cv/segmentation/encoder/unet.py @@ -5,13 +5,11 @@ import torch from torch import nn +from catalyst.contrib.models.cv import EncoderDownsampleBlock from catalyst.contrib.models.cv.segmentation.encoder.core import ( # noqa: WPS450, E501 _take, EncoderSpec, ) -from catalyst.contrib.nn.models.cv.segmentation.blocks.unet import ( - EncoderDownsampleBlock, -) class UnetEncoder(EncoderSpec): diff --git a/catalyst/contrib/nn/models/cv/segmentation/fpn.py b/catalyst/contrib/models/cv/segmentation/fpn.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/fpn.py rename to catalyst/contrib/models/cv/segmentation/fpn.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/head/__init__.py b/catalyst/contrib/models/cv/segmentation/head/__init__.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/head/__init__.py rename to catalyst/contrib/models/cv/segmentation/head/__init__.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/head/core.py b/catalyst/contrib/models/cv/segmentation/head/core.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/head/core.py rename to catalyst/contrib/models/cv/segmentation/head/core.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/head/fpn.py b/catalyst/contrib/models/cv/segmentation/head/fpn.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/head/fpn.py rename to catalyst/contrib/models/cv/segmentation/head/fpn.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/head/unet.py b/catalyst/contrib/models/cv/segmentation/head/unet.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/head/unet.py rename to catalyst/contrib/models/cv/segmentation/head/unet.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/linknet.py b/catalyst/contrib/models/cv/segmentation/linknet.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/linknet.py rename to catalyst/contrib/models/cv/segmentation/linknet.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/psp.py b/catalyst/contrib/models/cv/segmentation/psp.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/psp.py rename to catalyst/contrib/models/cv/segmentation/psp.py diff --git a/catalyst/contrib/nn/models/cv/segmentation/unet.py b/catalyst/contrib/models/cv/segmentation/unet.py similarity index 100% rename from catalyst/contrib/nn/models/cv/segmentation/unet.py rename to catalyst/contrib/models/cv/segmentation/unet.py diff --git a/catalyst/contrib/nn/models/functional.py b/catalyst/contrib/models/functional.py similarity index 100% rename from catalyst/contrib/nn/models/functional.py rename to catalyst/contrib/models/functional.py diff --git a/catalyst/contrib/nn/models/hydra.py b/catalyst/contrib/models/hydra.py similarity index 100% rename from catalyst/contrib/nn/models/hydra.py rename to catalyst/contrib/models/hydra.py diff --git a/catalyst/contrib/nn/models/nlp/__init__.py b/catalyst/contrib/models/nlp/__init__.py similarity index 100% rename from catalyst/contrib/nn/models/nlp/__init__.py rename to catalyst/contrib/models/nlp/__init__.py diff --git a/catalyst/contrib/nn/models/nlp/classification/__init__.py b/catalyst/contrib/models/nlp/classification/__init__.py similarity index 100% rename from catalyst/contrib/nn/models/nlp/classification/__init__.py rename to catalyst/contrib/models/nlp/classification/__init__.py diff --git a/catalyst/contrib/nn/models/nlp/classification/bert.py b/catalyst/contrib/models/nlp/classification/bert.py similarity index 100% rename from catalyst/contrib/nn/models/nlp/classification/bert.py rename to catalyst/contrib/models/nlp/classification/bert.py diff --git a/catalyst/contrib/nn/models/nlp/encoders/__init__.py b/catalyst/contrib/models/nlp/encoders/__init__.py similarity index 100% rename from catalyst/contrib/nn/models/nlp/encoders/__init__.py rename to catalyst/contrib/models/nlp/encoders/__init__.py diff --git a/catalyst/contrib/nn/models/sequential.py b/catalyst/contrib/models/sequential.py similarity index 100% rename from catalyst/contrib/nn/models/sequential.py rename to catalyst/contrib/models/sequential.py diff --git a/catalyst/contrib/nn/models/simple_conv.py b/catalyst/contrib/models/simple_conv.py similarity index 100% rename from catalyst/contrib/nn/models/simple_conv.py rename to catalyst/contrib/models/simple_conv.py diff --git a/catalyst/contrib/nn/models/tests/__init__.py b/catalyst/contrib/models/tests/__init__.py similarity index 100% rename from catalyst/contrib/nn/models/tests/__init__.py rename to catalyst/contrib/models/tests/__init__.py diff --git a/catalyst/contrib/nn/models/tests/config3.yml b/catalyst/contrib/models/tests/config3.yml similarity index 100% rename from catalyst/contrib/nn/models/tests/config3.yml rename to catalyst/contrib/models/tests/config3.yml diff --git a/catalyst/contrib/nn/models/tests/config4.yml b/catalyst/contrib/models/tests/config4.yml similarity index 100% rename from catalyst/contrib/nn/models/tests/config4.yml rename to catalyst/contrib/models/tests/config4.yml diff --git a/catalyst/contrib/nn/models/tests/test_hydra.py b/catalyst/contrib/models/tests/test_hydra.py similarity index 100% rename from catalyst/contrib/nn/models/tests/test_hydra.py rename to catalyst/contrib/models/tests/test_hydra.py diff --git a/catalyst/contrib/nn/__init__.py b/catalyst/contrib/nn/__init__.py index e69de29bb2..d8ee240e32 100644 --- a/catalyst/contrib/nn/__init__.py +++ b/catalyst/contrib/nn/__init__.py @@ -0,0 +1,6 @@ +# flake8: noqa + +from catalyst.contrib.nn.criterion import * +from catalyst.contrib.nn.modules import * +from catalyst.contrib.nn.optimizers import * +from catalyst.contrib.nn.schedulers import * diff --git a/catalyst/contrib/nn/criterion/__init__.py b/catalyst/contrib/nn/criterion/__init__.py index 776c09b824..6e08ec2ab0 100644 --- a/catalyst/contrib/nn/criterion/__init__.py +++ b/catalyst/contrib/nn/criterion/__init__.py @@ -1,5 +1,12 @@ # flake8: noqa +from torch.nn.modules.loss import * + +from catalyst.contrib.nn.criterion.ce import ( + MaskCrossEntropyLoss, + SymmetricCrossEntropyLoss, + NaiveCrossEntropyLoss, +) from catalyst.contrib.nn.criterion.circle import CircleLoss from catalyst.contrib.nn.criterion.contrastive import ( ContrastiveDistanceLoss, @@ -23,4 +30,10 @@ LovaszLossMultiLabel, ) from catalyst.contrib.nn.criterion.margin import MarginLoss +from catalyst.contrib.nn.criterion.triplet import ( + TripletLoss, + TripletLossV2, + TripletPairwiseEmbeddingLoss, + TripletMarginLossWithSampler, +) from catalyst.contrib.nn.criterion.wing import WingLoss diff --git a/catalyst/contrib/nn/modules/__init__.py b/catalyst/contrib/nn/modules/__init__.py index 8ec4d226c7..9287ffde25 100644 --- a/catalyst/contrib/nn/modules/__init__.py +++ b/catalyst/contrib/nn/modules/__init__.py @@ -1,12 +1,14 @@ # flake8: noqa from torch.nn.modules import * +from catalyst.contrib.nn.modules.arcface import ArcFace, SubCenterArcFace from catalyst.contrib.nn.modules.common import ( Flatten, GaussianNoise, Lambda, Normalize, ) +from catalyst.contrib.nn.modules.cosface import CosFace from catalyst.contrib.nn.modules.lama import ( LamaPooling, TemporalLastPooling, @@ -31,7 +33,4 @@ scSE, cSE, ) - from catalyst.contrib.nn.modules.softmax import SoftMax -from catalyst.contrib.nn.modules.arcface import ArcFace, SubCenterArcFace -from catalyst.contrib.nn.modules.cosface import CosFace diff --git a/catalyst/contrib/nn/modules/arcface.py b/catalyst/contrib/nn/modules/arcface.py index e2d2756b1a..ec1de9758a 100644 --- a/catalyst/contrib/nn/modules/arcface.py +++ b/catalyst/contrib/nn/modules/arcface.py @@ -228,3 +228,6 @@ def forward(self, input, label): logits *= self.s return logits + + +__all__ = ["ArcFace", "SubCenterArcFace"] diff --git a/catalyst/contrib/nn/modules/cosface.py b/catalyst/contrib/nn/modules/cosface.py index 7215e12615..ea701f3cae 100644 --- a/catalyst/contrib/nn/modules/cosface.py +++ b/catalyst/contrib/nn/modules/cosface.py @@ -82,3 +82,6 @@ def forward(self, input, target): logits *= self.s return logits + + +__all__ = ["CosFace"] diff --git a/catalyst/contrib/nn/modules/softmax.py b/catalyst/contrib/nn/modules/softmax.py index 89d04d9162..30687c6933 100644 --- a/catalyst/contrib/nn/modules/softmax.py +++ b/catalyst/contrib/nn/modules/softmax.py @@ -62,3 +62,6 @@ def forward(self, input): where ``C`` is a number of classes. """ return F.linear(input, self.weight, self.bias) + + +__all__ = ["SoftMax"] diff --git a/catalyst/contrib/nn/optimizers/__init__.py b/catalyst/contrib/nn/optimizers/__init__.py index f3ddfd4743..d492967645 100644 --- a/catalyst/contrib/nn/optimizers/__init__.py +++ b/catalyst/contrib/nn/optimizers/__init__.py @@ -1,3 +1,10 @@ # flake8: noqa +from torch.optim import * -from catalyst.contrib.optimizers.lookahead import Lookahead +from catalyst.contrib.nn.optimizers.adamp import AdamP +from catalyst.contrib.nn.optimizers.lamb import Lamb +from catalyst.contrib.nn.optimizers.lookahead import Lookahead +from catalyst.contrib.nn.optimizers.qhadamw import QHAdamW +from catalyst.contrib.nn.optimizers.radam import RAdam +from catalyst.contrib.nn.optimizers.ralamb import Ralamb +from catalyst.contrib.nn.optimizers.sgdp import SGDP diff --git a/catalyst/contrib/tests/__init__.py b/catalyst/contrib/nn/tests/__init__.py similarity index 100% rename from catalyst/contrib/tests/__init__.py rename to catalyst/contrib/nn/tests/__init__.py diff --git a/catalyst/contrib/tests/test_criterion.py b/catalyst/contrib/nn/tests/test_criterion.py similarity index 100% rename from catalyst/contrib/tests/test_criterion.py rename to catalyst/contrib/nn/tests/test_criterion.py diff --git a/catalyst/contrib/tests/test_modules.py b/catalyst/contrib/nn/tests/test_modules.py similarity index 100% rename from catalyst/contrib/tests/test_modules.py rename to catalyst/contrib/nn/tests/test_modules.py diff --git a/catalyst/contrib/tests/test_optimizer.py b/catalyst/contrib/nn/tests/test_optimizer.py similarity index 100% rename from catalyst/contrib/tests/test_optimizer.py rename to catalyst/contrib/nn/tests/test_optimizer.py diff --git a/catalyst/metrics/__init__.py b/catalyst/metrics/__init__.py index e69de29bb2..703efe8167 100644 --- a/catalyst/metrics/__init__.py +++ b/catalyst/metrics/__init__.py @@ -0,0 +1,14 @@ +# flake8: noqa +from catalyst.metrics.accuracy import accuracy, multi_label_accuracy +from catalyst.metrics.auc import auc +from catalyst.metrics.cmc_score import cmc_score, cmc_score_count +from catalyst.metrics.dice import dice, calculate_dice +from catalyst.metrics.f1_score import f1_score +from catalyst.metrics.focal import sigmoid_focal_loss, reduced_focal_loss +from catalyst.metrics.functional import ( + get_default_topk_args, + wrap_class_metric2dict, + wrap_topk_metric2dict, +) +from catalyst.metrics.iou import iou, jaccard +from catalyst.metrics.precision import average_precision diff --git a/catalyst/metrics/cmc_score.py b/catalyst/metrics/cmc_score.py index 9b021bc989..277771497b 100644 --- a/catalyst/metrics/cmc_score.py +++ b/catalyst/metrics/cmc_score.py @@ -54,3 +54,6 @@ def cmc_score( """ distances = torch.cdist(query_embeddings, gallery_embeddings) return cmc_score_count(distances, conformity_matrix, topk) + + +__all__ = ["cmc_score_count", "cmc_score"] diff --git a/catalyst/metrics/functional.py b/catalyst/metrics/functional.py index 102cf82643..b6715689fb 100644 --- a/catalyst/metrics/functional.py +++ b/catalyst/metrics/functional.py @@ -209,3 +209,10 @@ def topk_metric_with_dict_output(*args, **kwargs): return output return topk_metric_with_dict_output + + +__all__ = [ + "get_binary_statistics", + "wrap_topk_metric2dict", + "wrap_class_metric2dict", +] diff --git a/catalyst/utils/__init__.py b/catalyst/utils/__init__.py index d4eff1f6ee..d2409ece0b 100644 --- a/catalyst/utils/__init__.py +++ b/catalyst/utils/__init__.py @@ -124,4 +124,3 @@ if IS_GIT_AVAILABLE: from catalyst.utils.pipelines import clone_pipeline from catalyst.utils.wizard import run_wizard, Wizard - diff --git a/catalyst/utils/loaders.py b/catalyst/utils/loaders.py index ce4cf80a5a..2dc8edca23 100644 --- a/catalyst/utils/loaders.py +++ b/catalyst/utils/loaders.py @@ -7,8 +7,6 @@ from torch.utils.data import DataLoader, Dataset, DistributedSampler from torch.utils.data.dataloader import default_collate as default_collate_fn -from catalyst.data.dataset import ListDataset -from catalyst.data.sampler import DistributedSamplerWrapper from catalyst.registry import SAMPLER from catalyst.utils.dict import merge_dicts from catalyst.utils.distributed import get_rank @@ -58,6 +56,8 @@ def get_loader( Returns: DataLoader with ``catalyst.data.ListDataset`` """ + from catalyst.data.dataset import ListDataset + dataset = ListDataset( list_data=data_source, open_fn=open_fn, dict_transform=dict_transform, ) @@ -133,6 +133,8 @@ def _force_make_distributed_loader(loader: DataLoader) -> DataLoader: Returns: DataLoader: pytorch dataloder with distributed sampler. """ + from catalyst.data.sampler import DistributedSamplerWrapper + sampler = ( DistributedSampler(dataset=loader.dataset) if getattr(loader, "sampler", None) is not None @@ -165,6 +167,8 @@ def validate_loaders(loaders: Dict[str, DataLoader]) -> Dict[str, DataLoader]: Dict[str, DataLoader]: dictionery with pytorch dataloaders (with distributed samplers if necessary) """ + from catalyst.data.sampler import DistributedSamplerWrapper + rank = get_rank() if rank >= 0: for key, value in loaders.items(): @@ -321,9 +325,10 @@ def get_loaders_from_params( __all__ = [ - "get_loaders_from_params", - "validate_loaders", "get_native_batch_from_loader", "get_native_batch_from_loaders", "get_loader", + "validate_loaders", + "get_loaders_from_params", + "validate_loaders", ] diff --git a/catalyst/utils/tracing.py b/catalyst/utils/tracing.py index 641cdbb8c6..5e4e403804 100644 --- a/catalyst/utils/tracing.py +++ b/catalyst/utils/tracing.py @@ -5,7 +5,6 @@ from torch import jit, nn - from catalyst.typing import Device, Model from catalyst.utils.checkpoint import ( load_checkpoint, From 701ea76150f7230cdfb8066d0208e1d0d63b48ea Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 15:23:36 +0300 Subject: [PATCH 09/30] tests update --- bin/tests/check_core_tune.sh | 2 +- bin/tests/check_dl_core_.sh | 4 +- bin/tests/check_dl_core_callbacks.sh | 58 +++++++++---------- bin/tests/check_dl_core_overfit_callback.sh | 2 +- .../check_dl_core_periodic_loader_callback.sh | 12 ++-- bin/tests/check_dl_cv.sh | 42 +++++++------- bin/tests/check_dl_nlp.sh | 6 +- 7 files changed, 63 insertions(+), 63 deletions(-) diff --git a/bin/tests/check_core_tune.sh b/bin/tests/check_core_tune.sh index f03cd61209..0ba300b7a3 100644 --- a/bin/tests/check_core_tune.sh +++ b/bin/tests/check_core_tune.sh @@ -10,7 +10,7 @@ echo 'pipeline 01' EXPDIR=./examples/cifar_stages_optuna BASELOGDIR=./examples/logs/cifar_stages_optuna -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/tune.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config.yml \ diff --git a/bin/tests/check_dl_core_.sh b/bin/tests/check_dl_core_.sh index 4b42386c9c..94680f4fa0 100755 --- a/bin/tests/check_dl_core_.sh +++ b/bin/tests/check_dl_core_.sh @@ -9,8 +9,8 @@ rm -rf ./tests/logs ################################ pipeline 01 ################################ -(set -e; for f in tests/_tests_scripts/core_*.py; do PYTHONPATH=./catalyst:${PYTHONPATH} python "$f"; done) -(set -e; for f in tests/_tests_scripts/dl_*.py; do PYTHONPATH=./catalyst:${PYTHONPATH} python "$f"; done) +(set -e; for f in tests/_tests_scripts/core_*.py; do PYTHONPATH=.:${PYTHONPATH} python "$f"; done) +(set -e; for f in tests/_tests_scripts/dl_*.py; do PYTHONPATH=.:${PYTHONPATH} python "$f"; done) ################################ pipeline 99 ################################ diff --git a/bin/tests/check_dl_core_callbacks.sh b/bin/tests/check_dl_core_callbacks.sh index 116cc7c285..439cc61876 100644 --- a/bin/tests/check_dl_core_callbacks.sh +++ b/bin/tests/check_dl_core_callbacks.sh @@ -63,7 +63,7 @@ function check_line_counts { LOG_MSG='pipeline 00' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config0.yml \ @@ -101,7 +101,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 01' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config1.yml \ @@ -127,7 +127,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 02' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config2.yml \ @@ -156,7 +156,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 03' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config3.yml \ @@ -182,7 +182,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 04' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config4.yml \ @@ -211,7 +211,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 05' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config5.yml \ @@ -238,7 +238,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 06' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config6.yml \ @@ -264,7 +264,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 07' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config7.yml \ @@ -290,7 +290,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 08' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config8.yml \ @@ -321,7 +321,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 09' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config9.yml \ @@ -350,7 +350,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 10' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config10.yml \ @@ -379,7 +379,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 11' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config11.yml \ @@ -410,7 +410,7 @@ LOGDIR=./tests/logs/_tests_dl_callbacks/for_resume CHECKPOINTS=${LOGDIR}/checkpoints LOGFILE=${CHECKPOINTS}/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config0.yml \ @@ -432,7 +432,7 @@ LOGDIR=./tests/logs/_tests_dl_callbacks/resumed CHECKPOINTS=${LOGDIR}/checkpoints LOGFILE=${CHECKPOINTS}/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config12.yml \ @@ -462,7 +462,7 @@ LOGDIR=./tests/logs/_tests_dl_callbacks/for_resume CHECKPOINTS=${LOGDIR}/checkpoints LOGFILE=${CHECKPOINTS}/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config0.yml \ @@ -484,7 +484,7 @@ LOGDIR=./tests/logs/_tests_dl_callbacks/resumed CHECKPOINTS=${LOGDIR}/checkpoints LOGFILE=${CHECKPOINTS}/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config13.yml \ @@ -513,7 +513,7 @@ LOGDIR=./tests/logs/_tests_dl_callbacks CHECKPOINTS=${LOGDIR}/checkpoints LOGFILE=${CHECKPOINTS}/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config14.yml \ @@ -542,7 +542,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 15' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config15.yml \ @@ -573,7 +573,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 16' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config16.yml \ @@ -604,7 +604,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 17' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config17.yml \ @@ -636,7 +636,7 @@ LOGDIR=./tests/logs/_tests_dl_callbacks/for_resume CHECKPOINTS=${LOGDIR}/checkpoints LOGFILE=${CHECKPOINTS}/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config0.yml \ @@ -658,7 +658,7 @@ LOGDIR=./tests/logs/_tests_dl_callbacks/other CHECKPOINTS=${LOGDIR}/checkpoints LOGFILE=${CHECKPOINTS}/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config18.yml \ @@ -690,7 +690,7 @@ LOGDIR=./tests/logs/_tests_dl_callbacks/for_resume CHECKPOINTS=${LOGDIR}/checkpoints LOGFILE=${CHECKPOINTS}/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config0.yml \ @@ -712,7 +712,7 @@ LOGDIR=./tests/logs/_tests_dl_callbacks/other CHECKPOINTS=${LOGDIR}/checkpoints LOGFILE=${CHECKPOINTS}/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config19.yml \ @@ -748,7 +748,7 @@ rm -rf ./tests/logs/_tests_dl_callbacks ${EXP_OUTPUT} #TRACE=${LOGDIR}/trace #LOGFILE=${CHECKPOINTS}/_metrics.json # -#PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +#PYTHONPATH=./examples:.:${PYTHONPATH} \ # python catalyst/dl/scripts/run.py \ # --expdir=${EXPDIR} \ # --config=${EXPDIR}/config20.yml \ @@ -778,7 +778,7 @@ EXPDIR=./tests/_tests_ml_cmcscore LOGDIR=./tests/logs/_tests_ml_cmcscore LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config1.yml \ @@ -814,7 +814,7 @@ LOGFILE=${CHECKPOINTS}/_metrics.json EXP_OUTPUT=./tests/output.txt -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --stages/stage1/stage_params/num_epochs='2:int' \ --stages/stage1/callbacks_params/fast_run/num_epoch_steps='2:int' \ @@ -822,7 +822,7 @@ PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ --config=${EXPDIR}/config0.yml \ --logdir=${LOGDIR} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config0.yml \ @@ -839,7 +839,7 @@ rm -rf ./tests/logs/_tests_dl_callbacks ${EXP_OUTPUT} LOG_MSG='pipeline 23' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --stages/stage1/stage_params/num_epochs='2:int' \ --stages/stage1/callbacks_params/optimizer/use_fast_zero_grad='1:bool' \ diff --git a/bin/tests/check_dl_core_overfit_callback.sh b/bin/tests/check_dl_core_overfit_callback.sh index f264f435c5..4c34ffa513 100644 --- a/bin/tests/check_dl_core_overfit_callback.sh +++ b/bin/tests/check_dl_core_overfit_callback.sh @@ -63,7 +63,7 @@ function check_line_counts { LOG_MSG='pipeline 01' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config30.yml \ diff --git a/bin/tests/check_dl_core_periodic_loader_callback.sh b/bin/tests/check_dl_core_periodic_loader_callback.sh index 2629e84456..ee523e49ae 100644 --- a/bin/tests/check_dl_core_periodic_loader_callback.sh +++ b/bin/tests/check_dl_core_periodic_loader_callback.sh @@ -64,7 +64,7 @@ function check_line_counts { LOG_MSG='pipeline 00' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config0.yml \ @@ -94,7 +94,7 @@ echo ${LOG_MSG} { # try - PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ + PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config1.yml \ @@ -117,7 +117,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 02' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config2.yml \ @@ -147,7 +147,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 03' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config3.yml \ @@ -182,7 +182,7 @@ echo ${LOG_MSG} { # try - PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ + PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config4.yml \ @@ -206,7 +206,7 @@ rm -rf ${LOGDIR} ${EXP_OUTPUT} LOG_MSG='pipeline 05' echo ${LOG_MSG} -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config5.yml \ diff --git a/bin/tests/check_dl_cv.sh b/bin/tests/check_dl_cv.sh index 990c38a398..47a40013c7 100755 --- a/bin/tests/check_dl_cv.sh +++ b/bin/tests/check_dl_cv.sh @@ -7,7 +7,7 @@ set -eo pipefail -v ################################ pipeline 00 ################################ rm -rf ./tests/logs -(set -e; for f in tests/_tests_scripts/cv_*.py; do PYTHONPATH=./catalyst:${PYTHONPATH} python "$f"; done) +(set -e; for f in tests/_tests_scripts/cv_*.py; do PYTHONPATH=.:${PYTHONPATH} python "$f"; done) ################################ pipeline 01 ################################ @@ -16,7 +16,7 @@ EXPDIR=./tests/_tests_cv_classification LOGDIR=./tests/logs/_tests_cv_classification LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config1.yml \ @@ -39,7 +39,7 @@ assert metrics['stage1.2']['loss'] < 3.3 """ echo 'pipeline 01 - trace' -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/trace.py \ ${LOGDIR} @@ -52,7 +52,7 @@ EXPDIR=./tests/_tests_cv_classification LOGDIR=./tests/logs/_tests_cv_classification LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config2.yml \ @@ -74,7 +74,7 @@ assert metrics['stage1.2']['loss'] < 2.1 """ if [[ "$USE_DDP" != "1" ]]; then - PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ + PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config2_infer.yml \ @@ -101,7 +101,7 @@ EXPDIR=./tests/_tests_cv_classification LOGDIR=./tests/logs/_tests_cv_classification LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config3.yml \ @@ -131,7 +131,7 @@ EXPDIR=./tests/_tests_cv_classification LOGDIR=./tests/logs/_tests_cv_classification LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config4.yml \ @@ -161,7 +161,7 @@ EXPDIR=./tests/_tests_cv_classification LOGDIR=./tests/logs/_tests_cv_classification LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config5.yml \ @@ -192,7 +192,7 @@ rm -rf ${LOGDIR} # LOGDIR=./tests/logs/_tests_cv_classification # LOGFILE=${LOGDIR}/checkpoints/_metrics.json # -# PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +# PYTHONPATH=./examples:.:${PYTHONPATH} \ # python catalyst/dl/scripts/run.py \ # --expdir=${EXPDIR} \ # --config=${EXPDIR}/config6_finder.yml \ @@ -216,7 +216,7 @@ EXPDIR=./tests/_tests_cv_classification_transforms LOGDIR=./tests/logs/_tests_cv_classification_transforms LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config1.yml \ @@ -246,7 +246,7 @@ EXPDIR=./tests/_tests_cv_classification_transforms LOGDIR=./tests/logs/_tests_cv_classification_transforms LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config2.yml \ @@ -276,7 +276,7 @@ EXPDIR=./tests/_tests_cv_classification_transforms LOGDIR=./tests/logs/_tests_cv_classification_transforms LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config3.yml \ @@ -307,7 +307,7 @@ if [[ "$USE_DDP" != "1" ]]; then LOGDIR=./tests/logs/_tests_cv_classification_transforms LOGFILE=${LOGDIR}/checkpoints/_metrics.json - PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ + PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config4_finder.yml \ @@ -331,7 +331,7 @@ EXPDIR=./tests/_tests_cv_classification_transforms LOGDIR=./tests/logs/_tests_cv_classification_transforms LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config5_fp16.yml \ @@ -363,7 +363,7 @@ LOGDIR=./tests/logs/_tests_cv_classification_transforms LOGFILE=${LOGDIR}/checkpoints/_metrics.json if [[ "${REQUIREMENTS}" == 'latest' ]]; then - PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ + PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config6_kornia.yml \ @@ -395,7 +395,7 @@ EXPDIR=./tests/_tests_cv_classification_registry/test1 LOGDIR=./tests/logs/_tests_cv_classification_registry/test1 LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config1.yml \ @@ -426,7 +426,7 @@ EXPDIR=./tests/_tests_cv_classification_registry/test2 LOGDIR=./tests/logs/_tests_cv_classification_registry/test2 LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config1.yml \ @@ -457,7 +457,7 @@ EXPDIR=./tests/_tests_cv_classification_registry/test2 LOGDIR=./tests/logs/_tests_cv_classification_registry/test2 LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config2.yml \ @@ -486,7 +486,7 @@ EXPDIR=./tests/_tests_cv_classification_registry/test3 LOGDIR=./tests/logs/_tests_cv_classification_registry/test3 LOGFILE=${LOGDIR}/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --config=${EXPDIR}/config1.yml \ @@ -518,7 +518,7 @@ LOGDIR=./tests/logs/_tests_cv_segmentation LOGFILE=${LOGDIR}/checkpoints/_metrics.json ## train -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --configs ${EXPDIR}/config.yml ${EXPDIR}/transforms.yml \ @@ -561,7 +561,7 @@ LOGFILE=${LOGDIR}/checkpoints/_metrics.json if [[ "${REQUIREMENTS}" == 'latest' ]]; then ## train - PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ + PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=${EXPDIR} \ --configs ${EXPDIR}/config2_kornia.yml ${EXPDIR}/transforms.yml \ diff --git a/bin/tests/check_dl_nlp.sh b/bin/tests/check_dl_nlp.sh index a90d067e1f..2803948c4c 100755 --- a/bin/tests/check_dl_nlp.sh +++ b/bin/tests/check_dl_nlp.sh @@ -4,13 +4,13 @@ set -eo pipefail -v -(set -e; for f in tests/_tests_scripts/nlp_*.py; do PYTHONPATH=./catalyst:${PYTHONPATH} python "$f"; done) +(set -e; for f in tests/_tests_scripts/nlp_*.py; do PYTHONPATH=.:${PYTHONPATH} python "$f"; done) echo "check distilbert_text_classification" LOGFILE=./tests/logs/_tests_nlp_classification/checkpoints/_metrics.json -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=./examples/distilbert_text_classification \ --config=./tests/_tests_nlp_classification/config1_basic.yml \ @@ -33,7 +33,7 @@ assert metrics['train_val.2']['loss'] < 2.0 rm -rf ./tests/logs/_tests_nlp_classification echo "train small_max_seq_length" -PYTHONPATH=./examples:./catalyst:${PYTHONPATH} \ +PYTHONPATH=./examples:.:${PYTHONPATH} \ python catalyst/dl/scripts/run.py \ --expdir=./examples/distilbert_text_classification \ --config=./tests/_tests_nlp_classification/config2_small_max_seq_length.yml \ From d83b2f134fac97707e753c2129b21afadda47526 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 15:30:33 +0300 Subject: [PATCH 10/30] tests update --- tests/_tests_scripts/core_contrib_callbacks.py | 2 ++ tests/_tests_scripts/core_contrib_datasets.py | 2 ++ tests/_tests_scripts/core_contrib_dl.py | 2 -- tests/_tests_scripts/core_contrib_experiments.py | 2 ++ tests/_tests_scripts/core_contrib_runners.py | 2 ++ 5 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 tests/_tests_scripts/core_contrib_callbacks.py create mode 100644 tests/_tests_scripts/core_contrib_datasets.py delete mode 100644 tests/_tests_scripts/core_contrib_dl.py create mode 100644 tests/_tests_scripts/core_contrib_experiments.py create mode 100644 tests/_tests_scripts/core_contrib_runners.py diff --git a/tests/_tests_scripts/core_contrib_callbacks.py b/tests/_tests_scripts/core_contrib_callbacks.py new file mode 100644 index 0000000000..a46ba178e0 --- /dev/null +++ b/tests/_tests_scripts/core_contrib_callbacks.py @@ -0,0 +1,2 @@ +# flake8: noqa +from catalyst.contrib.callbacks import * diff --git a/tests/_tests_scripts/core_contrib_datasets.py b/tests/_tests_scripts/core_contrib_datasets.py new file mode 100644 index 0000000000..d3227b557a --- /dev/null +++ b/tests/_tests_scripts/core_contrib_datasets.py @@ -0,0 +1,2 @@ +# flake8: noqa +from catalyst.contrib.datasets import * diff --git a/tests/_tests_scripts/core_contrib_dl.py b/tests/_tests_scripts/core_contrib_dl.py deleted file mode 100644 index e5e16db957..0000000000 --- a/tests/_tests_scripts/core_contrib_dl.py +++ /dev/null @@ -1,2 +0,0 @@ -# flake8: noqa -from catalyst.contrib.dl import * diff --git a/tests/_tests_scripts/core_contrib_experiments.py b/tests/_tests_scripts/core_contrib_experiments.py new file mode 100644 index 0000000000..7b4a894b45 --- /dev/null +++ b/tests/_tests_scripts/core_contrib_experiments.py @@ -0,0 +1,2 @@ +# flake8: noqa +from catalyst.contrib.experiments import * diff --git a/tests/_tests_scripts/core_contrib_runners.py b/tests/_tests_scripts/core_contrib_runners.py new file mode 100644 index 0000000000..a63c165b1f --- /dev/null +++ b/tests/_tests_scripts/core_contrib_runners.py @@ -0,0 +1,2 @@ +# flake8: noqa +from catalyst.contrib.runners import * From c21b90c548ba77e9e53830886defb3e7370ef8e9 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 15:50:18 +0300 Subject: [PATCH 11/30] tests update --- tests/_tests_scripts/dl_callbacks.py | 2 -- tests/_tests_scripts/dl_experiment.py | 1 - tests/_tests_scripts/dl_runner.py | 1 - tests/_tests_scripts/dl_utils.py | 2 -- 4 files changed, 6 deletions(-) delete mode 100644 tests/_tests_scripts/dl_callbacks.py delete mode 100644 tests/_tests_scripts/dl_experiment.py delete mode 100644 tests/_tests_scripts/dl_runner.py delete mode 100644 tests/_tests_scripts/dl_utils.py diff --git a/tests/_tests_scripts/dl_callbacks.py b/tests/_tests_scripts/dl_callbacks.py deleted file mode 100644 index a97d7a71de..0000000000 --- a/tests/_tests_scripts/dl_callbacks.py +++ /dev/null @@ -1,2 +0,0 @@ -# flake8: noqa -from catalyst.dl.callbacks import * diff --git a/tests/_tests_scripts/dl_experiment.py b/tests/_tests_scripts/dl_experiment.py deleted file mode 100644 index 9c0fa90a19..0000000000 --- a/tests/_tests_scripts/dl_experiment.py +++ /dev/null @@ -1 +0,0 @@ -# flake8: noqa diff --git a/tests/_tests_scripts/dl_runner.py b/tests/_tests_scripts/dl_runner.py deleted file mode 100644 index 9c0fa90a19..0000000000 --- a/tests/_tests_scripts/dl_runner.py +++ /dev/null @@ -1 +0,0 @@ -# flake8: noqa diff --git a/tests/_tests_scripts/dl_utils.py b/tests/_tests_scripts/dl_utils.py deleted file mode 100644 index 4b3f777b4e..0000000000 --- a/tests/_tests_scripts/dl_utils.py +++ /dev/null @@ -1,2 +0,0 @@ -# flake8: noqa -from catalyst.dl.utils import * From a41d6da5c1e2b606df5c6b8fecebf553f17fbd46 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 15:55:55 +0300 Subject: [PATCH 12/30] tests update --- catalyst/experiments/tests/test_config.py | 2 +- catalyst/experiments/tests/test_core.py | 2 +- .../experiment.py | 2 +- tests/_tests_scripts/cv_z_segmentation.py | 2 +- tests/_tests_scripts/dl_z_classification.py | 16 ++++++++-------- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/catalyst/experiments/tests/test_config.py b/catalyst/experiments/tests/test_config.py index 6fcdb09ae4..6cf6d1ed67 100644 --- a/catalyst/experiments/tests/test_config.py +++ b/catalyst/experiments/tests/test_config.py @@ -16,7 +16,7 @@ TensorboardLogger, ValidationManagerCallback, ) -from catalyst.experiment import ConfigExperiment +from catalyst.experiments import ConfigExperiment DEFAULT_MINIMAL_CONFIG = { # noqa: WPS407 "model_params": {"model": "SomeModel"}, diff --git a/catalyst/experiments/tests/test_core.py b/catalyst/experiments/tests/test_core.py index 47dc1e1f47..a31cf54852 100644 --- a/catalyst/experiments/tests/test_core.py +++ b/catalyst/experiments/tests/test_core.py @@ -8,7 +8,7 @@ MetricManagerCallback, ValidationManagerCallback, ) -from catalyst.experiment import Experiment +from catalyst.experiments import Experiment def _test_callbacks(test_callbacks, exp, stage="train"): diff --git a/tests/_tests_cv_classification_transforms/experiment.py b/tests/_tests_cv_classification_transforms/experiment.py index dead7e6618..5f1941df1e 100644 --- a/tests/_tests_cv_classification_transforms/experiment.py +++ b/tests/_tests_cv_classification_transforms/experiment.py @@ -4,7 +4,7 @@ from torch.utils.data import Dataset from catalyst.contrib.datasets import MNIST as _MNIST -from catalyst.experiment import ConfigExperiment +from catalyst.experiments import ConfigExperiment class MNIST(_MNIST): diff --git a/tests/_tests_scripts/cv_z_segmentation.py b/tests/_tests_scripts/cv_z_segmentation.py index 092e07474d..5be0a63f5d 100644 --- a/tests/_tests_scripts/cv_z_segmentation.py +++ b/tests/_tests_scripts/cv_z_segmentation.py @@ -113,7 +113,7 @@ def get_loaders(transform): import torch import torch.nn as nn -from catalyst.runner import SupervisedRunner +from catalyst.runners import SupervisedRunner # experiment setup num_epochs = 2 diff --git a/tests/_tests_scripts/dl_z_classification.py b/tests/_tests_scripts/dl_z_classification.py index 6aba3f93eb..91b92b3571 100644 --- a/tests/_tests_scripts/dl_z_classification.py +++ b/tests/_tests_scripts/dl_z_classification.py @@ -87,7 +87,7 @@ def forward(self, x): # In[ ]: -from catalyst.runner import SupervisedRunner +from catalyst.runners import SupervisedRunner # experiment setup num_epochs = NUM_EPOCHS @@ -122,7 +122,7 @@ def forward(self, x): # In[ ]: -from catalyst.runner import SupervisedRunner +from catalyst.runners import SupervisedRunner # experiment setup num_epochs = NUM_EPOCHS @@ -158,7 +158,7 @@ def forward(self, x): # In[ ]: -from catalyst.runner import SupervisedRunner +from catalyst.runners import SupervisedRunner from catalyst.dl.callbacks import EarlyStoppingCallback # experiment setup @@ -197,7 +197,7 @@ def forward(self, x): # In[ ]: -from catalyst.runner import SupervisedRunner +from catalyst.runners import SupervisedRunner from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback # experiment setup @@ -241,7 +241,7 @@ def forward(self, x): # In[ ]: -from catalyst.runner import SupervisedRunner +from catalyst.runners import SupervisedRunner from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback from catalyst.contrib.nn.schedulers import OneCycleLRWithWarmup @@ -291,7 +291,7 @@ def forward(self, x): # In[ ]: -from catalyst.runner import SupervisedRunner +from catalyst.runners import SupervisedRunner from catalyst.dl.callbacks import AccuracyCallback # experiment setup @@ -331,7 +331,7 @@ def forward(self, x): # In[ ]: -from catalyst.runner import SupervisedRunner +from catalyst.runners import SupervisedRunner # experiment setup num_epochs = NUM_EPOCHS @@ -364,7 +364,7 @@ def forward(self, x): # In[ ]: -from catalyst.runner import SupervisedRunner +from catalyst.runners import SupervisedRunner from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback # experiment setup From 3e292fe4246557ac568f8fcfcf68964ce2c6def5 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 16:12:35 +0300 Subject: [PATCH 13/30] imports update --- catalyst/callbacks/metrics/accuracy.py | 4 ++-- catalyst/contrib/callbacks/cutmix_callback.py | 4 ++-- catalyst/contrib/callbacks/mixup_callback.py | 4 ++-- catalyst/contrib/callbacks/optuna_callback.py | 3 +-- catalyst/core/experiment.py | 6 +++--- catalyst/core/runner.py | 4 ++-- catalyst/data/scripts/image2embedding.py | 2 +- catalyst/data/scripts/text2embedding.py | 2 +- .../notebooks/classification-example.ipynb | 21 ++++++------------- .../notebooks/classification-tutorial.ipynb | 8 +++---- .../customizing_what_happens_in_train.ipynb | 2 +- examples/notebooks/segmentation-example.ipynb | 2 +- .../notebooks/segmentation-tutorial.ipynb | 6 +++--- tests/_tests_scripts/cv_z_segmentation.py | 2 +- tests/_tests_scripts/dl_z_classification.py | 10 ++++----- 15 files changed, 35 insertions(+), 45 deletions(-) diff --git a/catalyst/callbacks/metrics/accuracy.py b/catalyst/callbacks/metrics/accuracy.py index 565a9f87a9..b0ecd7c63b 100644 --- a/catalyst/callbacks/metrics/accuracy.py +++ b/catalyst/callbacks/metrics/accuracy.py @@ -15,7 +15,7 @@ class AccuracyCallback(BatchMetricCallback): .. note:: For multi-label accuracy please use - `catalyst.dl.callbacks.metrics.MultiLabelAccuracyCallback` + `catalyst.callbacks.metrics.MultiLabelAccuracyCallback` """ def __init__( @@ -65,7 +65,7 @@ class MultiLabelAccuracyCallback(BatchMetricCallback): .. note:: For multi-label accuracy please use - `catalyst.dl.callbacks.metrics.MultiLabelAccuracyCallback` + `catalyst.callbacks.metrics.MultiLabelAccuracyCallback` """ def __init__( diff --git a/catalyst/contrib/callbacks/cutmix_callback.py b/catalyst/contrib/callbacks/cutmix_callback.py index ad823d59af..ea4ea31be5 100644 --- a/catalyst/contrib/callbacks/cutmix_callback.py +++ b/catalyst/contrib/callbacks/cutmix_callback.py @@ -17,8 +17,8 @@ class CutmixCallback(CriterionCallback): with Localizable Features`_. .. warning:: - `catalyst.contrib.dl.callbacks.CutmixCallback` is inherited from - `catalyst.dl.CriterionCallback` and does its work. + `catalyst.contrib.callbacks.CutmixCallback` is inherited from + `catalyst.callbacks.CriterionCallback` and does its work. You may not use them together. .. _CutMix\: Regularization Strategy to Train Strong Classifiers with Localizable Features: https://arxiv.org/abs/1905.04899 # noqa: W605, E501, W505 diff --git a/catalyst/contrib/callbacks/mixup_callback.py b/catalyst/contrib/callbacks/mixup_callback.py index fb71e7ffb4..feeeb08536 100644 --- a/catalyst/contrib/callbacks/mixup_callback.py +++ b/catalyst/contrib/callbacks/mixup_callback.py @@ -15,8 +15,8 @@ class MixupCallback(CriterionCallback): `mixup: Beyond Empirical Risk Minimization`_. .. warning:: - `catalyst.dl.callbacks.MixupCallback` is inherited from - `catalyst.dl.CriterionCallback` and does its work. + `catalyst.contrib.callbacks.MixupCallback` is inherited from + `catalyst.callbacks.CriterionCallback` and does its work. You may not use them together. .. _mixup\: Beyond Empirical Risk Minimization: # noqa: W605 diff --git a/catalyst/contrib/callbacks/optuna_callback.py b/catalyst/contrib/callbacks/optuna_callback.py index fef350434d..1f8ef2f6db 100644 --- a/catalyst/contrib/callbacks/optuna_callback.py +++ b/catalyst/contrib/callbacks/optuna_callback.py @@ -16,8 +16,7 @@ class OptunaPruningCallback(Callback): import optuna - from catalyst.dl import SupervisedRunner - from catalyst.dl.callbacks import OptunaCallback + from catalyst.dl import SupervisedRunner, OptunaPruningCallback # some python code ... diff --git a/catalyst/core/experiment.py b/catalyst/core/experiment.py index df5362d637..d1a3c57cd1 100644 --- a/catalyst/core/experiment.py +++ b/catalyst/core/experiment.py @@ -24,9 +24,9 @@ class IExperiment(ABC): Abstraction, please check out the implementations: - - :py:mod:`catalyst.dl.experiment.base.BaseExperiment` - - :py:mod:`catalyst.dl.experiment.config.ConfigExperiment` - - :py:mod:`catalyst.dl.experiment.supervised.SupervisedExperiment` + - :py:mod:`catalyst.experiments.experiment.Experiment` + - :py:mod:`catalyst.experiments.config.ConfigExperiment` + - :py:mod:`catalyst.experiments.supervised.SupervisedExperiment` """ @property diff --git a/catalyst/core/runner.py b/catalyst/core/runner.py index 72fd59c2a1..54a5da0435 100644 --- a/catalyst/core/runner.py +++ b/catalyst/core/runner.py @@ -61,8 +61,8 @@ class IRunner(ABC, IRunnerLegacy, FrozenClass): Abstraction, please check out the implementations: - - :py:mod:`catalyst.dl.runner.runner.Runner` - - :py:mod:`catalyst.dl.runner.supervised.SupervisedRunner` + - :py:mod:`catalyst.runners.runner.Runner` + - :py:mod:`catalyst.runners.supervised.SupervisedRunner` Runner also contains full information about experiment runner. diff --git a/catalyst/data/scripts/image2embedding.py b/catalyst/data/scripts/image2embedding.py index bee484aeb4..01dbff194b 100644 --- a/catalyst/data/scripts/image2embedding.py +++ b/catalyst/data/scripts/image2embedding.py @@ -11,7 +11,7 @@ from catalyst.contrib.models.cv import ResnetEncoder from catalyst.data.cv import ImageReader -from catalyst.dl import utils +from catalyst import utils cv2.setNumThreads(0) cv2.ocl.setUseOpenCL(False) diff --git a/catalyst/data/scripts/text2embedding.py b/catalyst/data/scripts/text2embedding.py index e4f82d9db0..14669f6e95 100644 --- a/catalyst/data/scripts/text2embedding.py +++ b/catalyst/data/scripts/text2embedding.py @@ -12,7 +12,7 @@ from catalyst.contrib.utils import process_bert_output, tokenize_text from catalyst.data import LambdaReader -from catalyst.dl import utils +from catalyst import utils def build_args(parser): diff --git a/examples/notebooks/classification-example.ipynb b/examples/notebooks/classification-example.ipynb index dad2afa409..3b9c9d9511 100644 --- a/examples/notebooks/classification-example.ipynb +++ b/examples/notebooks/classification-example.ipynb @@ -139,7 +139,7 @@ }, "outputs": [], "source": [ - "from catalyst.dl import utils" + "from catalyst import utils" ] }, { @@ -275,7 +275,7 @@ "outputs": [], "source": [ "from catalyst.dl import SupervisedRunner\n", - "from catalyst.dl.callbacks import EarlyStoppingCallback\n", + "from catalyst.dl import EarlyStoppingCallback\n", "\n", "# experiment setup\n", "num_epochs = NUM_EPOCHS\n", @@ -336,7 +336,7 @@ "outputs": [], "source": [ "from catalyst.dl import SupervisedRunner\n", - "from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback\n", + "from catalyst.dl import EarlyStoppingCallback, AccuracyCallback\n", "\n", "# experiment setup\n", "num_epochs = NUM_EPOCHS\n", @@ -400,7 +400,7 @@ "outputs": [], "source": [ "from catalyst.dl import SupervisedRunner\n", - "from catalyst.dl.callbacks import \\\n", + "from catalyst.dl import \\\n", " EarlyStoppingCallback, AccuracyCallback\n", "from catalyst.contrib.nn import OneCycleLRWithWarmup\n", "\n", @@ -469,7 +469,7 @@ "outputs": [], "source": [ "from catalyst.dl import SupervisedRunner\n", - "from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback\n", + "from catalyst.dl import EarlyStoppingCallback, AccuracyCallback\n", "\n", "# experiment setup\n", "num_epochs = NUM_EPOCHS\n", @@ -574,7 +574,7 @@ "outputs": [], "source": [ "from catalyst.dl import SupervisedRunner\n", - "from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback\n", + "from catalyst.dl import EarlyStoppingCallback, AccuracyCallback\n", "\n", "# experiment setup\n", "num_epochs = NUM_EPOCHS\n", @@ -735,15 +735,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.0" - }, - "pycharm": { - "stem_cell": { - "cell_type": "raw", - "source": [], - "metadata": { - "collapsed": false - } - } } }, "nbformat": 4, diff --git a/examples/notebooks/classification-tutorial.ipynb b/examples/notebooks/classification-tutorial.ipynb index e465b63153..f0f9588649 100644 --- a/examples/notebooks/classification-tutorial.ipynb +++ b/examples/notebooks/classification-tutorial.ipynb @@ -129,7 +129,7 @@ "import torch\n", "import catalyst\n", "\n", - "from catalyst.dl import utils\n", + "from catalyst import utils\n", "\n", "print(f\"torch: {torch.__version__}, catalyst: {catalyst.__version__}\")\n", "\n", @@ -416,7 +416,7 @@ "outputs": [], "source": [ "from catalyst.contrib.data.cv import ImageReader\n", - "from catalyst.dl import utils\n", + "from catalyst import utils\n", "from catalyst.data import ScalarReader, ReaderCompose\n", "\n", "num_classes = len(tag_to_label)\n", @@ -889,7 +889,7 @@ "outputs": [], "source": [ "# as we are working on classification task\n", - "from catalyst.dl.callbacks import AccuracyCallback, AUCCallback, F1ScoreCallback\n", + "from catalyst.dl import AccuracyCallback, AUCCallback, F1ScoreCallback\n", "\n", "callbacks = [\n", " AccuracyCallback(num_classes=num_classes),\n", @@ -1171,7 +1171,7 @@ "outputs": [], "source": [ "from collections import OrderedDict\n", - "from catalyst.dl.callbacks import CheckpointCallback\n", + "from catalyst.dl import CheckpointCallback\n", "\n", "infer_loaders = {\"infer\": loaders[\"valid\"]}\n", "model = get_model(model_name, num_classes)\n", diff --git a/examples/notebooks/customizing_what_happens_in_train.ipynb b/examples/notebooks/customizing_what_happens_in_train.ipynb index 3500fdf3ea..d146c13b95 100644 --- a/examples/notebooks/customizing_what_happens_in_train.ipynb +++ b/examples/notebooks/customizing_what_happens_in_train.ipynb @@ -97,7 +97,7 @@ "source": [ "import catalyst\n", "from catalyst import dl\n", - "from catalyst.dl import utils\n", + "from catalyst import utils\n", "catalyst.__version__" ] }, diff --git a/examples/notebooks/segmentation-example.ipynb b/examples/notebooks/segmentation-example.ipynb index aca2a5a817..acc84f527d 100644 --- a/examples/notebooks/segmentation-example.ipynb +++ b/examples/notebooks/segmentation-example.ipynb @@ -138,7 +138,7 @@ "import torchvision\n", "import torchvision.transforms as transforms\n", "from catalyst.data import Augmentor\n", - "from catalyst.dl import utils\n", + "from catalyst import utils\n", "\n", "bs = 4\n", "num_workers = 4\n", diff --git a/examples/notebooks/segmentation-tutorial.ipynb b/examples/notebooks/segmentation-tutorial.ipynb index f2f7edcbad..87610b9eb6 100644 --- a/examples/notebooks/segmentation-tutorial.ipynb +++ b/examples/notebooks/segmentation-tutorial.ipynb @@ -151,7 +151,7 @@ "import torch\n", "import catalyst\n", "\n", - "from catalyst.dl import utils\n", + "from catalyst import utils\n", "\n", "print(f\"torch: {torch.__version__}, catalyst: {catalyst.__version__}\")\n", "\n", @@ -910,7 +910,7 @@ }, "outputs": [], "source": [ - "from catalyst.dl.callbacks import DiceCallback, IouCallback, \\\n", + "from catalyst.dl import DiceCallback, IouCallback, \\\n", " CriterionCallback, MetricAggregationCallback\n", "\n", "callbacks = [\n", @@ -1204,7 +1204,7 @@ "outputs": [], "source": [ "from collections import OrderedDict\n", - "from catalyst.dl.callbacks import CheckpointCallback\n", + "from catalyst.dl import CheckpointCallback\n", "\n", "\n", "infer_loaders = {\"infer\": loaders[\"valid\"]}\n", diff --git a/tests/_tests_scripts/cv_z_segmentation.py b/tests/_tests_scripts/cv_z_segmentation.py index 5be0a63f5d..cbaf3d7803 100644 --- a/tests/_tests_scripts/cv_z_segmentation.py +++ b/tests/_tests_scripts/cv_z_segmentation.py @@ -41,7 +41,7 @@ import numpy as np from catalyst.data.cv import Compose, Normalize from catalyst.data import Augmentor -from catalyst.dl import utils +from catalyst import utils from catalyst.contrib.nn.criterion import ( LovaszLossBinary, LovaszLossMultiLabel, diff --git a/tests/_tests_scripts/dl_z_classification.py b/tests/_tests_scripts/dl_z_classification.py index 91b92b3571..7e3c8d2842 100644 --- a/tests/_tests_scripts/dl_z_classification.py +++ b/tests/_tests_scripts/dl_z_classification.py @@ -159,7 +159,7 @@ def forward(self, x): # In[ ]: from catalyst.runners import SupervisedRunner -from catalyst.dl.callbacks import EarlyStoppingCallback +from catalyst.dl import EarlyStoppingCallback # experiment setup num_epochs = NUM_EPOCHS @@ -198,7 +198,7 @@ def forward(self, x): # In[ ]: from catalyst.runners import SupervisedRunner -from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback +from catalyst.dl import EarlyStoppingCallback, AccuracyCallback # experiment setup num_epochs = NUM_EPOCHS @@ -242,7 +242,7 @@ def forward(self, x): # In[ ]: from catalyst.runners import SupervisedRunner -from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback +from catalyst.dl import EarlyStoppingCallback, AccuracyCallback from catalyst.contrib.nn.schedulers import OneCycleLRWithWarmup # experiment setup @@ -292,7 +292,7 @@ def forward(self, x): # In[ ]: from catalyst.runners import SupervisedRunner -from catalyst.dl.callbacks import AccuracyCallback +from catalyst.dl import AccuracyCallback # experiment setup num_epochs = NUM_EPOCHS @@ -365,7 +365,7 @@ def forward(self, x): # In[ ]: from catalyst.runners import SupervisedRunner -from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback +from catalyst.dl import EarlyStoppingCallback, AccuracyCallback # experiment setup num_epochs = NUM_EPOCHS From 4e973d51c66a1ac43026e83aa953bd17f1c5b7f4 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 16:14:05 +0300 Subject: [PATCH 14/30] imports update --- catalyst/data/scripts/image2embedding.py | 2 +- catalyst/data/scripts/text2embedding.py | 2 +- catalyst/utils/__init__.py | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/catalyst/data/scripts/image2embedding.py b/catalyst/data/scripts/image2embedding.py index 01dbff194b..13f2d26395 100644 --- a/catalyst/data/scripts/image2embedding.py +++ b/catalyst/data/scripts/image2embedding.py @@ -9,9 +9,9 @@ import torch +from catalyst import utils from catalyst.contrib.models.cv import ResnetEncoder from catalyst.data.cv import ImageReader -from catalyst import utils cv2.setNumThreads(0) cv2.ocl.setUseOpenCL(False) diff --git a/catalyst/data/scripts/text2embedding.py b/catalyst/data/scripts/text2embedding.py index 14669f6e95..53c571ec9f 100644 --- a/catalyst/data/scripts/text2embedding.py +++ b/catalyst/data/scripts/text2embedding.py @@ -10,9 +10,9 @@ import torch from transformers import BertConfig, BertModel, BertTokenizer +from catalyst import utils from catalyst.contrib.utils import process_bert_output, tokenize_text from catalyst.data import LambdaReader -from catalyst import utils def build_args(parser): diff --git a/catalyst/utils/__init__.py b/catalyst/utils/__init__.py index d2409ece0b..631ef2e08d 100644 --- a/catalyst/utils/__init__.py +++ b/catalyst/utils/__init__.py @@ -124,3 +124,5 @@ if IS_GIT_AVAILABLE: from catalyst.utils.pipelines import clone_pipeline from catalyst.utils.wizard import run_wizard, Wizard + +from catalyst.contrib.utils import * From b9113da547d411e65ffa1f5017cafaddf9f1b3b5 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 16:38:10 +0300 Subject: [PATCH 15/30] imports update --- catalyst/registry/registries.py | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/catalyst/registry/registries.py b/catalyst/registry/registries.py index 3981cc4543..83cba6268c 100644 --- a/catalyst/registry/registries.py +++ b/catalyst/registry/registries.py @@ -111,7 +111,7 @@ def _modules_loader(r: Registry): def _model_loader(r: Registry): - from catalyst.contrib.nn import models as m + from catalyst.contrib import models as m r.add_from_module(m) @@ -168,16 +168,13 @@ def _schedulers_loader(r: Registry): def _experiments_loader(r: Registry): - from catalyst.core import IExperiment, IStageBasedRunner + from catalyst.core.experiment import IExperiment r.add(IExperiment) - r.add(IStageBasedRunner) - - from catalyst import experiment as m - r.add_from_module(m) + from catalyst import experiments as m - from catalyst.contrib.dl import experiment as m # noqa: WPS347 + r.add_from_module(m) # noqa: WPS347 r.add_from_module(m) @@ -188,16 +185,12 @@ def _experiments_loader(r: Registry): def _runners_loader(r: Registry): - from catalyst.core import IRunner, IStageBasedRunner + from catalyst.core.runner import IRunner, IStageBasedRunner r.add(IRunner) r.add(IStageBasedRunner) - from catalyst import runner as m - - r.add_from_module(m) - - from catalyst.contrib.dl import runner as m # noqa: WPS347 + from catalyst import runners as m # noqa: WPS347 r.add_from_module(m) @@ -208,15 +201,12 @@ def _runners_loader(r: Registry): def _callbacks_loader(r: Registry): - from catalyst.core import callbacks as m - - r.add_from_module(m) + from catalyst.core.callback import Callback, CallbackWrapper - from catalyst.dl import callbacks as m # noqa: WPS347 - - r.add_from_module(m) + r.add(Callback) + r.add(CallbackWrapper) - from catalyst.contrib import callbacks as m + from catalyst import callbacks as m # noqa: WPS347 r.add_from_module(m) From 1ad9b97ac612167d1e30193483eade2fcd6ddf1c Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 16:51:23 +0300 Subject: [PATCH 16/30] imports update --- bin/tests/check_core_settings.sh | 10 ++++----- .../contrib/callbacks/kornia_transform.py | 2 +- catalyst/contrib/callbacks/neptune_logger.py | 4 ++-- .../notebooks/classification-example.ipynb | 21 +++++++++++++------ .../notebooks/classification-tutorial.ipynb | 8 +++---- .../customizing_what_happens_in_train.ipynb | 2 +- examples/notebooks/segmentation-example.ipynb | 2 +- .../notebooks/segmentation-tutorial.ipynb | 6 +++--- 8 files changed, 32 insertions(+), 23 deletions(-) diff --git a/bin/tests/check_core_settings.sh b/bin/tests/check_core_settings.sh index 3b9666f8f1..a40bab5741 100644 --- a/bin/tests/check_core_settings.sh +++ b/bin/tests/check_core_settings.sh @@ -21,7 +21,7 @@ nlp_required = false EOT python -c """ -from catalyst.contrib.dl import callbacks +from catalyst.contrib import callbacks from catalyst.contrib import utils try: @@ -50,7 +50,7 @@ from catalyst.settings import SETTINGS assert SETTINGS.use_lz4 == False and SETTINGS.use_pyarrow == False try: - from catalyst.contrib.dl.callbacks import AlchemyLogger, VisdomLogger + from catalyst.contrib.callbacks import AlchemyLogger, VisdomLogger except ImportError: pass # Ok else: @@ -61,7 +61,7 @@ pip install -r requirements/requirements-contrib.txt --quiet --find-links https: pip install -r requirements/requirements-ecosystem.txt --quiet --find-links https://download.pytorch.org/whl/cpu/torch_stable.html --upgrade-strategy only-if-needed python -c """ -from catalyst.contrib.dl.callbacks import AlchemyLogger, VisdomLogger +from catalyst.contrib.callbacks import AlchemyLogger, VisdomLogger """ @@ -83,7 +83,7 @@ assert SETTINGS.use_libjpeg_turbo == False try: from catalyst.contrib.data import cv as cv_data - from catalyst.contrib.dl.callbacks import InferMaskCallback + from catalyst.contrib.callbacks import InferMaskCallback from catalyst.contrib.models import cv as cv_models from catalyst.contrib.utils import imread, imwrite from catalyst.data.__main__ import COMMANDS @@ -103,7 +103,7 @@ pip install -r requirements/requirements-cv.txt --quiet --find-links https://dow python -c """ from catalyst.contrib.data import cv as cv_data -from catalyst.contrib.dl.callbacks import InferMaskCallback +from catalyst.contrib.callbacks import InferMaskCallback from catalyst.contrib.models import cv as cv_models from catalyst.contrib.utils import imread, imwrite from catalyst.data.__main__ import COMMANDS diff --git a/catalyst/contrib/callbacks/kornia_transform.py b/catalyst/contrib/callbacks/kornia_transform.py index 6a05b70df5..eeaf1b06e0 100644 --- a/catalyst/contrib/callbacks/kornia_transform.py +++ b/catalyst/contrib/callbacks/kornia_transform.py @@ -31,7 +31,7 @@ class BatchTransformCallback(Callback): from catalyst import dl from catalyst.contrib.data.transforms import ToTensor from catalyst.contrib.datasets import MNIST - from catalyst.contrib.dl.callbacks.kornia_transform import ( + from catalyst.contrib.callbacks.kornia_transform import ( BatchTransformCallback ) from catalyst.utils import metrics diff --git a/catalyst/contrib/callbacks/neptune_logger.py b/catalyst/contrib/callbacks/neptune_logger.py index 36fd0a8c87..758b026cd8 100644 --- a/catalyst/contrib/callbacks/neptune_logger.py +++ b/catalyst/contrib/callbacks/neptune_logger.py @@ -22,8 +22,8 @@ class NeptuneLogger(Callback): Example: .. code-block:: python - from catalyst.dl import SupervisedRunner - from catalyst.contrib.dl.callbacks.neptune import NeptuneLogger + from catalyst.runners import SupervisedRunner + from catalyst.contrib.callbacks import NeptuneLogger runner = SupervisedRunner() diff --git a/examples/notebooks/classification-example.ipynb b/examples/notebooks/classification-example.ipynb index 3b9c9d9511..dad2afa409 100644 --- a/examples/notebooks/classification-example.ipynb +++ b/examples/notebooks/classification-example.ipynb @@ -139,7 +139,7 @@ }, "outputs": [], "source": [ - "from catalyst import utils" + "from catalyst.dl import utils" ] }, { @@ -275,7 +275,7 @@ "outputs": [], "source": [ "from catalyst.dl import SupervisedRunner\n", - "from catalyst.dl import EarlyStoppingCallback\n", + "from catalyst.dl.callbacks import EarlyStoppingCallback\n", "\n", "# experiment setup\n", "num_epochs = NUM_EPOCHS\n", @@ -336,7 +336,7 @@ "outputs": [], "source": [ "from catalyst.dl import SupervisedRunner\n", - "from catalyst.dl import EarlyStoppingCallback, AccuracyCallback\n", + "from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback\n", "\n", "# experiment setup\n", "num_epochs = NUM_EPOCHS\n", @@ -400,7 +400,7 @@ "outputs": [], "source": [ "from catalyst.dl import SupervisedRunner\n", - "from catalyst.dl import \\\n", + "from catalyst.dl.callbacks import \\\n", " EarlyStoppingCallback, AccuracyCallback\n", "from catalyst.contrib.nn import OneCycleLRWithWarmup\n", "\n", @@ -469,7 +469,7 @@ "outputs": [], "source": [ "from catalyst.dl import SupervisedRunner\n", - "from catalyst.dl import EarlyStoppingCallback, AccuracyCallback\n", + "from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback\n", "\n", "# experiment setup\n", "num_epochs = NUM_EPOCHS\n", @@ -574,7 +574,7 @@ "outputs": [], "source": [ "from catalyst.dl import SupervisedRunner\n", - "from catalyst.dl import EarlyStoppingCallback, AccuracyCallback\n", + "from catalyst.dl.callbacks import EarlyStoppingCallback, AccuracyCallback\n", "\n", "# experiment setup\n", "num_epochs = NUM_EPOCHS\n", @@ -735,6 +735,15 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.0" + }, + "pycharm": { + "stem_cell": { + "cell_type": "raw", + "source": [], + "metadata": { + "collapsed": false + } + } } }, "nbformat": 4, diff --git a/examples/notebooks/classification-tutorial.ipynb b/examples/notebooks/classification-tutorial.ipynb index f0f9588649..e465b63153 100644 --- a/examples/notebooks/classification-tutorial.ipynb +++ b/examples/notebooks/classification-tutorial.ipynb @@ -129,7 +129,7 @@ "import torch\n", "import catalyst\n", "\n", - "from catalyst import utils\n", + "from catalyst.dl import utils\n", "\n", "print(f\"torch: {torch.__version__}, catalyst: {catalyst.__version__}\")\n", "\n", @@ -416,7 +416,7 @@ "outputs": [], "source": [ "from catalyst.contrib.data.cv import ImageReader\n", - "from catalyst import utils\n", + "from catalyst.dl import utils\n", "from catalyst.data import ScalarReader, ReaderCompose\n", "\n", "num_classes = len(tag_to_label)\n", @@ -889,7 +889,7 @@ "outputs": [], "source": [ "# as we are working on classification task\n", - "from catalyst.dl import AccuracyCallback, AUCCallback, F1ScoreCallback\n", + "from catalyst.dl.callbacks import AccuracyCallback, AUCCallback, F1ScoreCallback\n", "\n", "callbacks = [\n", " AccuracyCallback(num_classes=num_classes),\n", @@ -1171,7 +1171,7 @@ "outputs": [], "source": [ "from collections import OrderedDict\n", - "from catalyst.dl import CheckpointCallback\n", + "from catalyst.dl.callbacks import CheckpointCallback\n", "\n", "infer_loaders = {\"infer\": loaders[\"valid\"]}\n", "model = get_model(model_name, num_classes)\n", diff --git a/examples/notebooks/customizing_what_happens_in_train.ipynb b/examples/notebooks/customizing_what_happens_in_train.ipynb index d146c13b95..3500fdf3ea 100644 --- a/examples/notebooks/customizing_what_happens_in_train.ipynb +++ b/examples/notebooks/customizing_what_happens_in_train.ipynb @@ -97,7 +97,7 @@ "source": [ "import catalyst\n", "from catalyst import dl\n", - "from catalyst import utils\n", + "from catalyst.dl import utils\n", "catalyst.__version__" ] }, diff --git a/examples/notebooks/segmentation-example.ipynb b/examples/notebooks/segmentation-example.ipynb index acc84f527d..aca2a5a817 100644 --- a/examples/notebooks/segmentation-example.ipynb +++ b/examples/notebooks/segmentation-example.ipynb @@ -138,7 +138,7 @@ "import torchvision\n", "import torchvision.transforms as transforms\n", "from catalyst.data import Augmentor\n", - "from catalyst import utils\n", + "from catalyst.dl import utils\n", "\n", "bs = 4\n", "num_workers = 4\n", diff --git a/examples/notebooks/segmentation-tutorial.ipynb b/examples/notebooks/segmentation-tutorial.ipynb index 87610b9eb6..f2f7edcbad 100644 --- a/examples/notebooks/segmentation-tutorial.ipynb +++ b/examples/notebooks/segmentation-tutorial.ipynb @@ -151,7 +151,7 @@ "import torch\n", "import catalyst\n", "\n", - "from catalyst import utils\n", + "from catalyst.dl import utils\n", "\n", "print(f\"torch: {torch.__version__}, catalyst: {catalyst.__version__}\")\n", "\n", @@ -910,7 +910,7 @@ }, "outputs": [], "source": [ - "from catalyst.dl import DiceCallback, IouCallback, \\\n", + "from catalyst.dl.callbacks import DiceCallback, IouCallback, \\\n", " CriterionCallback, MetricAggregationCallback\n", "\n", "callbacks = [\n", @@ -1204,7 +1204,7 @@ "outputs": [], "source": [ "from collections import OrderedDict\n", - "from catalyst.dl import CheckpointCallback\n", + "from catalyst.dl.callbacks import CheckpointCallback\n", "\n", "\n", "infer_loaders = {\"infer\": loaders[\"valid\"]}\n", From c24a0ca737a29a17f83ba0c012cd5108378d0856 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 17:06:29 +0300 Subject: [PATCH 17/30] imports update --- bin/tests/check_dl_core_callbacks.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/tests/check_dl_core_callbacks.sh b/bin/tests/check_dl_core_callbacks.sh index 439cc61876..f1196320ce 100644 --- a/bin/tests/check_dl_core_callbacks.sh +++ b/bin/tests/check_dl_core_callbacks.sh @@ -83,7 +83,7 @@ check_num_files ${CHECKPOINTS} 7 # 3x2 checkpoints + metrics.json ############################# CHECK QUANTIZATION FEATURE #################################### -quantization=$(python -c "from catalyst.tools.settings import IS_QUANTIZATION_AVAILABLE; print(int(IS_QUANTIZATION_AVAILABLE))") +quantization=$(python -c "from catalyst.settings import IS_QUANTIZATION_AVAILABLE; print(int(IS_QUANTIZATION_AVAILABLE))") echo "pytorch quantization available: ${quantization}" From ea050437ea4b229215fbe8dfef03c4c1337d048a Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 17:14:25 +0300 Subject: [PATCH 18/30] imports update --- bin/tests/check_core_settings.sh | 4 ++-- docs/api/contrib.rst | 7 ------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/bin/tests/check_core_settings.sh b/bin/tests/check_core_settings.sh index a40bab5741..d6ec507bce 100644 --- a/bin/tests/check_core_settings.sh +++ b/bin/tests/check_core_settings.sh @@ -50,7 +50,7 @@ from catalyst.settings import SETTINGS assert SETTINGS.use_lz4 == False and SETTINGS.use_pyarrow == False try: - from catalyst.contrib.callbacks import AlchemyLogger, VisdomLogger + from catalyst.contrib.callbacks import AlchemyLogger except ImportError: pass # Ok else: @@ -61,7 +61,7 @@ pip install -r requirements/requirements-contrib.txt --quiet --find-links https: pip install -r requirements/requirements-ecosystem.txt --quiet --find-links https://download.pytorch.org/whl/cpu/torch_stable.html --upgrade-strategy only-if-needed python -c """ -from catalyst.contrib.callbacks import AlchemyLogger, VisdomLogger +from catalyst.contrib.callbacks import AlchemyLogger """ diff --git a/docs/api/contrib.rst b/docs/api/contrib.rst index e0420d7ad8..15163cd8bf 100644 --- a/docs/api/contrib.rst +++ b/docs/api/contrib.rst @@ -137,13 +137,6 @@ TelegramLogger :undoc-members: :show-inheritance: -VisdomLogger -"""""""""""""""""""""" -.. automodule:: catalyst.contrib.dl.callbacks.visdom_logger - :members: - :undoc-members: - :show-inheritance: - WandbLogger """""""""""""""""""""" .. automodule:: catalyst.contrib.dl.callbacks.wandb_logger From a9dcd88a9bf94807003f94ff5ac317a4bb6af4cd Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 17:28:44 +0300 Subject: [PATCH 19/30] imports update --- .../contrib/models/cv/segmentation/blocks/__init__.py | 10 ++++++++++ .../contrib/models/cv/segmentation/decoder/unet.py | 4 +++- .../contrib/models/cv/segmentation/encoder/unet.py | 4 +++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/catalyst/contrib/models/cv/segmentation/blocks/__init__.py b/catalyst/contrib/models/cv/segmentation/blocks/__init__.py index 4bfb880b5b..7e1e1a4a27 100644 --- a/catalyst/contrib/models/cv/segmentation/blocks/__init__.py +++ b/catalyst/contrib/models/cv/segmentation/blocks/__init__.py @@ -1,4 +1,8 @@ # flake8: noqa +from catalyst.contrib.models.cv.segmentation.blocks.core import ( + EncoderBlock, + DecoderBlock, +) from catalyst.contrib.models.cv.segmentation.blocks.fpn import ( DecoderFPNBlock, Conv3x3GNReLU, @@ -8,3 +12,9 @@ PyramidBlock, PSPBlock, ) +from catalyst.contrib.models.cv.segmentation.blocks.unet import ( + EncoderDownsampleBlock, + EncoderUpsampleBlock, + DecoderConcatBlock, + DecoderSumBlock, +) diff --git a/catalyst/contrib/models/cv/segmentation/decoder/unet.py b/catalyst/contrib/models/cv/segmentation/decoder/unet.py index a52c801947..470a41f5cf 100644 --- a/catalyst/contrib/models/cv/segmentation/decoder/unet.py +++ b/catalyst/contrib/models/cv/segmentation/decoder/unet.py @@ -5,8 +5,10 @@ import torch from torch import nn -from catalyst.contrib.models.cv import DecoderConcatBlock from catalyst.contrib.models.cv.segmentation.blocks.core import DecoderBlock +from catalyst.contrib.models.cv.segmentation.blocks.unet import ( + DecoderConcatBlock, +) from catalyst.contrib.models.cv.segmentation.decoder.core import DecoderSpec diff --git a/catalyst/contrib/models/cv/segmentation/encoder/unet.py b/catalyst/contrib/models/cv/segmentation/encoder/unet.py index 13c44ad95a..13b33c21f7 100644 --- a/catalyst/contrib/models/cv/segmentation/encoder/unet.py +++ b/catalyst/contrib/models/cv/segmentation/encoder/unet.py @@ -5,7 +5,9 @@ import torch from torch import nn -from catalyst.contrib.models.cv import EncoderDownsampleBlock +from catalyst.contrib.models.cv.segmentation.blocks.unet import ( + EncoderDownsampleBlock, +) from catalyst.contrib.models.cv.segmentation.encoder.core import ( # noqa: WPS450, E501 _take, EncoderSpec, From 5a65ca8b829d947dbf22fb85edbdbb8048895d0b Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 18:54:12 +0300 Subject: [PATCH 20/30] docs update --- docs/api/callbacks.rst | 305 +++++++++++++++++++++++++++++++++++++++ docs/api/contrib.rst | 234 ++---------------------------- docs/api/core.rst | 124 +++------------- docs/api/dl.rst | 201 -------------------------- docs/api/experiments.rst | 40 +++++ docs/api/metrics.rst | 86 +++++++++++ docs/api/registry.rst | 4 + docs/api/runners.rst | 32 ++++ docs/api/settings.rst | 7 + docs/api/tools.rst | 124 ++++++++++++++++ docs/api/typing.rst | 7 + docs/api/utils.rst | 198 ++++++++++--------------- docs/conf.py | 2 +- docs/index.rst | 15 +- 14 files changed, 726 insertions(+), 653 deletions(-) create mode 100644 docs/api/callbacks.rst delete mode 100644 docs/api/dl.rst create mode 100644 docs/api/experiments.rst create mode 100644 docs/api/metrics.rst create mode 100644 docs/api/runners.rst create mode 100644 docs/api/settings.rst create mode 100644 docs/api/tools.rst create mode 100644 docs/api/typing.rst diff --git a/docs/api/callbacks.rst b/docs/api/callbacks.rst new file mode 100644 index 0000000000..67ff48f7e9 --- /dev/null +++ b/docs/api/callbacks.rst @@ -0,0 +1,305 @@ +Callbacks +================================================ + +.. toctree:: + :titlesonly: + +.. contents:: + :local: + + +Callbacks (catalyst) +---------------------- +.. automodule:: catalyst.callbacks + :members: + :show-inheritance: + + +BatchOverfitCallback +~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.batch_overfit + :members: + :undoc-members: + :show-inheritance: + +Checkpoint +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.checkpoint + :members: + :undoc-members: + :show-inheritance: + +Control Flow +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.control_flow + :members: + :undoc-members: + :show-inheritance: + +Criterion +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.criterion + :members: + :undoc-members: + :show-inheritance: + +Early Stop +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.early_stop + :members: + :undoc-members: + :show-inheritance: + +Exception +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.exception + :members: + :undoc-members: + :show-inheritance: + +Logging +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.logging + :members: + :undoc-members: + :show-inheritance: + +Metric +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.metric + :members: + :undoc-members: + :show-inheritance: + +Optimizer +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.optimizer + :members: + :undoc-members: + :show-inheritance: + +PeriodicLoaderCallback +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.periodic_loader + :members: + :undoc-members: + :show-inheritance: + +Pruning +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.pruning + :members: + :undoc-members: + :show-inheritance: + +Quantization +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.quantization + :members: + :undoc-members: + :show-inheritance: + +Scheduler +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.scheduler + :members: + :undoc-members: + :show-inheritance: + +Timer +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.timer + :members: + :undoc-members: + :show-inheritance: + +Tracing +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.tracing + :members: + :undoc-members: + :show-inheritance: + +Validation +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.validation + :members: + :undoc-members: + :show-inheritance: + + +Callbacks (metrics) +---------------------- +.. automodule:: catalyst.callbacks.metrics + :members: + :show-inheritance: + + +Accuracy +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.metrics.accuracy + :members: + :undoc-members: + :show-inheritance: + +AUC +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.metrics.auc + :members: + :undoc-members: + :show-inheritance: + +CMC score +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.metrics.cmc_score + :members: + :undoc-members: + :show-inheritance: + +Dice +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.metrics.dice + :members: + :undoc-members: + :show-inheritance: + +F1 score +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.metrics.f1_score + :members: + :undoc-members: + :show-inheritance: + +IOU +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.metrics.iou + :members: + :undoc-members: + :show-inheritance: + +MRR +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.metrics.mrr + :members: + :undoc-members: + :show-inheritance: + +Global precision, recall and F1-score +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.metrics.ppv_tpr_f1 + :members: + :undoc-members: + :show-inheritance: + +Precision +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.callbacks.metrics.precision + :members: + :undoc-members: + :show-inheritance: + + +Callbacks (contrib) +---------------------- +.. automodule:: catalyst.contrib.callbacks + :members: + :show-inheritance: + + +AlchemyLogger +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.alchemy_logger + :members: + :undoc-members: + :show-inheritance: + +ConfusionMatrixCallback +~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.confusion_matrix_logger + :members: + :undoc-members: + :show-inheritance: + +CutmixCallback +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.cutmix_callback + :members: + :undoc-members: + :show-inheritance: + +GradNormLogger +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.gradnorm_logger + :members: + :undoc-members: + :show-inheritance: + +InferCallback +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.inference_callback + :members: + :undoc-members: + :show-inheritance: + +KNNMetricCallback +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.knn_metric + :members: + :undoc-members: + :show-inheritance: + +BatchTransformCallback +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.kornia_transform + :members: + :undoc-members: + :show-inheritance: + +InferMaskCallback +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.mask_inference + :members: + :undoc-members: + :show-inheritance: + +MixupCallback +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.mixup_callback + :members: + :undoc-members: + :show-inheritance: + +NeptuneLogger +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.neptune_logger + :members: + :undoc-members: + :show-inheritance: + +OptunaCallback +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.optuna_callback + :members: + :undoc-members: + :show-inheritance: + +PerplexityMetricCallback +~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.perplexity_metric + :members: + :undoc-members: + :show-inheritance: + +TelegramLogger +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.telegram_logger + :members: + :undoc-members: + :show-inheritance: + +WandbLogger +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.callbacks.wandb_logger + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/contrib.rst b/docs/api/contrib.rst index 15163cd8bf..424d30cf2a 100644 --- a/docs/api/contrib.rst +++ b/docs/api/contrib.rst @@ -23,6 +23,13 @@ MNIST :undoc-members: :show-inheritance: +MovieLens +~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.datasets.movielens + :members: + :undoc-members: + :show-inheritance: + Computer Vision ~~~~~~~~~~~~~~~~ @@ -55,98 +62,6 @@ Imagewang :show-inheritance: -DL --------------------- - - -Callbacks -~~~~~~~~~~~~~~~~ - -.. automodule:: catalyst.contrib.dl.callbacks - :members: - :undoc-members: - :show-inheritance: - -AlchemyLogger -""""""""""""" -.. automodule:: catalyst.contrib.dl.callbacks.alchemy_logger - :members: - :undoc-members: - :show-inheritance: - -CutmixCallback -"""""""""""""" -.. automodule:: catalyst.contrib.dl.callbacks.cutmix_callback - :members: - :undoc-members: - :show-inheritance: - -GradNormLogger -"""""""""""""""""""""" -.. automodule:: catalyst.contrib.dl.callbacks.gradnorm_logger - :members: - :undoc-members: - :show-inheritance: - -KNNMetricCallback -""""""""""""""""" -.. automodule:: catalyst.contrib.dl.callbacks.knn_metric - :members: - :undoc-members: - :show-inheritance: - -BatchTransformCallback -"""""""""""""""""""""" -.. automodule:: catalyst.contrib.dl.callbacks.kornia_transform - :members: - :undoc-members: - :show-inheritance: - -InferMaskCallback -""""""""""""""""" -.. automodule:: catalyst.contrib.dl.callbacks.mask_inference - :members: - :undoc-members: - :show-inheritance: - -NeptuneLogger -""""""""""""" -.. automodule:: catalyst.contrib.dl.callbacks.neptune_logger - :members: - :undoc-members: - :show-inheritance: - -OptunaCallback -"""""""""""""""""""""" -.. automodule:: catalyst.contrib.dl.callbacks.optuna_callback - :members: - :undoc-members: - :show-inheritance: - -PerplexityMetricCallback -"""""""""""""""""""""""" -.. automodule:: catalyst.contrib.dl.callbacks.perplexity_metric - :members: - :undoc-members: - :show-inheritance: - -TelegramLogger -"""""""""""""""""""""" -.. automodule:: catalyst.contrib.dl.callbacks.telegram_logger - :members: - :undoc-members: - :show-inheritance: - -WandbLogger -"""""""""""""""""""""" -.. automodule:: catalyst.contrib.dl.callbacks.wandb_logger - :members: - :undoc-members: - :show-inheritance: - -Models --------------------- - NN -------------------- @@ -162,16 +77,16 @@ Cross entropy :undoc-members: :show-inheritance: -Contrastive -""""""""""" -.. automodule:: catalyst.contrib.nn.criterion.contrastive +Circle +""""""""" +.. automodule:: catalyst.contrib.nn.criterion.circle :members: :undoc-members: :show-inheritance: -Circle -""""""""" -.. automodule:: catalyst.contrib.nn.criterion.circle +Contrastive +""""""""""" +.. automodule:: catalyst.contrib.nn.criterion.contrastive :members: :undoc-members: :show-inheritance: @@ -408,126 +323,3 @@ PSPnet :members: :undoc-members: :show-inheritance: - - -Registry --------------------- - -.. automodule:: catalyst.contrib.registry - :members: - :undoc-members: - :show-inheritance: - - -Tools ------------------------- - -Tensorboard -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.tools.tensorboard - :members: - :undoc-members: - :show-inheritance: - - -Utilities ------------------------- - -Argparse -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.utils.argparse - :members: - :undoc-members: - :show-inheritance: - -Compression -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.utils.compression - :members: - :undoc-members: - :show-inheritance: - -Confusion Matrix -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.utils.confusion_matrix - :members: - :undoc-members: - :show-inheritance: - -Dataset -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.utils.dataset - :members: - :undoc-members: - :show-inheritance: - -Misc -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.utils.misc - :members: - :undoc-members: - :show-inheritance: - -Pandas -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.utils.pandas - :members: - :undoc-members: - :show-inheritance: - -Parallel -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.utils.parallel - :members: - :undoc-members: - :show-inheritance: - -Plotly -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.utils.plotly - :members: - :undoc-members: - :show-inheritance: - -Serialization -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.utils.serialization - :members: - :undoc-members: - :show-inheritance: - -Visualization -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.utils.visualization - :members: - :undoc-members: - :show-inheritance: - - -Computer Vision utilities -------------------------- - -Image -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.utils.cv.image - :members: - :undoc-members: - :show-inheritance: - -Tensor -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.utils.cv.tensor - :members: - :undoc-members: - :show-inheritance: - - -Natural Language Processing utilities -------------------------------------- - -Text -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.contrib.utils.nlp.text - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/core.rst b/docs/api/core.rst index e86de2a289..15d90652a7 100644 --- a/docs/api/core.rst +++ b/docs/api/core.rst @@ -8,15 +8,13 @@ Core :local: -Core ----------------------- .. automodule:: catalyst.core :members: - :undoc-members: :show-inheritance: + Experiment -~~~~~~~~~~~~~~~~~~~~~~ +---------------------- .. autoclass:: catalyst.core.experiment.IExperiment :members: :undoc-members: @@ -27,154 +25,66 @@ Experiment :undoc-members: :show-inheritance: -Runner -~~~~~~~~~~~~~~~~~~~~~~ -.. autoclass:: catalyst.core.runner.IRunner - :members: - :undoc-members: - :show-inheritance: - -.. autoclass:: catalyst.core.runner.IStageBasedRunner - :members: - :undoc-members: - :show-inheritance: -.. automodule:: catalyst.core.runner - :members: - :undoc-members: - :show-inheritance: - -Callback -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.core.callback - :members: - :undoc-members: - :show-inheritance: - -Callbacks +Runner ---------------------- - -BatchOverfitCallback -~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.core.callbacks.batch_overfit - :members: - :undoc-members: - :show-inheritance: - -Checkpoint -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.core.callbacks.checkpoint - :members: - :undoc-members: - :show-inheritance: - -Control Flow -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.core.callbacks.control_flow +.. autoclass:: catalyst.core.runner.RunnerException :members: :undoc-members: :show-inheritance: -Criterion -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.core.callbacks.criterion - :members: - :undoc-members: - :show-inheritance: - -Early Stop -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.core.callbacks.early_stop +.. autoclass:: catalyst.core.runner.IRunner :members: :undoc-members: :show-inheritance: -Exception -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.core.callbacks.exception +.. autoclass:: catalyst.core.runner.IStageBasedRunner :members: :undoc-members: :show-inheritance: -Logging -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.core.callbacks.logging +.. automodule:: catalyst.core.runner :members: :undoc-members: :show-inheritance: -Metrics -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.core.callbacks.metrics - :members: - :undoc-members: - :show-inheritance: -Optimizer +RunnerLegacy ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.core.callbacks.optimizer +.. autoclass:: catalyst.core.legacy.IRunnerLegacy :members: :undoc-members: :show-inheritance: -PeriodicLoaderCallback -"""""""""""""""""""""" -.. automodule:: catalyst.core.callbacks.periodic_loader - :members: - :undoc-members: - :show-inheritance: -Scheduler -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.core.callbacks.scheduler +Callback +---------------------- +.. autoclass:: catalyst.core.callback.CallbackNode :members: :undoc-members: :show-inheritance: -Timer -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.core.callbacks.timer +.. autoclass:: catalyst.core.callback.CallbackOrder :members: :undoc-members: :show-inheritance: -Validation -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.core.callbacks.validation +.. autoclass:: catalyst.core.callback.CallbackScope :members: :undoc-members: :show-inheritance: - -Registry ----------------------- - -.. automodule:: catalyst.core.registry +.. autoclass:: catalyst.core.callback.Callback :members: :undoc-members: :show-inheritance: - -Utils ----------------------- - -.. automodule:: catalyst.core.utils +.. autoclass:: catalyst.core.callback.CallbackWrapper :members: :undoc-members: :show-inheritance: -.. automodule:: catalyst.core.utils.callbacks +.. automodule:: catalyst.core.callback :members: :undoc-members: :show-inheritance: - - -Legacy ----------------------- - -Runner -~~~~~~~~~~~~~~~~~~~~~~ -.. autoclass:: catalyst.core.legacy.IRunnerLegacy - :members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/api/dl.rst b/docs/api/dl.rst deleted file mode 100644 index 791c2f8ab4..0000000000 --- a/docs/api/dl.rst +++ /dev/null @@ -1,201 +0,0 @@ -DL -================================================ - -.. toctree:: - :titlesonly: - -.. contents:: - :local: - -Experiment --------------------- - -.. automodule:: catalyst.dl.experiment - :members: - :show-inheritance: - -Experiment -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.experiment.experiment - :members: - :undoc-members: - :show-inheritance: - -ConfigExperiment -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.experiment.config - :members: - :undoc-members: - :show-inheritance: - -SupervisedExperiment -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.experiment.supervised - :members: - :undoc-members: - :show-inheritance: - - -Runner --------------------- - -.. automodule:: catalyst.dl.runner - :members: - :show-inheritance: - -Runner -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.runner.runner - :members: - :undoc-members: - :show-inheritance: - -SupervisedRunner -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.runner.supervised - :members: - :undoc-members: - :show-inheritance: - - -Callbacks --------------------- - -.. automodule:: catalyst.dl.callbacks - :members: - :show-inheritance: - -ConfusionMatrixCallback -~~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.callbacks.confusion_matrix - :members: - :undoc-members: - :show-inheritance: - -InferCallback -~~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.callbacks.inference - :members: - :undoc-members: - :show-inheritance: - -MeterMetricsCallback -~~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.callbacks.meter - :members: - :undoc-members: - :show-inheritance: - -MixupCallback -~~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.callbacks.mixup - :members: - :undoc-members: - :show-inheritance: - -LRFinder -~~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.callbacks.scheduler - :members: - :undoc-members: - :show-inheritance: - -TracingCallback -"""""""""""""""""""""" -.. automodule:: catalyst.dl.callbacks.tracing - :members: - :undoc-members: - :show-inheritance: - -Metrics --------------------- - -Accuracy -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.callbacks.metrics.accuracy - :members: - :undoc-members: - :show-inheritance: - -AUC -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.callbacks.metrics.auc - :members: - :undoc-members: - :show-inheritance: - -CMC score -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.callbacks.metrics.cmc_score - :members: - :undoc-members: - :show-inheritance: - -Dice -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.callbacks.metrics.dice - :members: - :undoc-members: - :show-inheritance: - -F1 score -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.callbacks.metrics.f1_score - :members: - :undoc-members: - :show-inheritance: - -IOU -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.callbacks.metrics.iou - :members: - :undoc-members: - :show-inheritance: - -Global precision, recall and F1-score -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.callbacks.metrics.ppv_tpr_f1 - :members: - :undoc-members: - :show-inheritance: - -Precision -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.callbacks.metrics.precision - :members: - :undoc-members: - :show-inheritance: - - -Utils --------------------- - -Torch -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.utils.torch - :members: - :undoc-members: - :show-inheritance: - -Trace -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.utils.trace - :members: - :undoc-members: - :show-inheritance: - -Wizard -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.dl.utils.wizard - :members: - :undoc-members: - :show-inheritance: - - -Registry --------------------- - -.. automodule:: catalyst.dl.registry - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/experiments.rst b/docs/api/experiments.rst new file mode 100644 index 0000000000..a007b5dc5a --- /dev/null +++ b/docs/api/experiments.rst @@ -0,0 +1,40 @@ +Experiments +================================================ + +.. toctree:: + :titlesonly: + +.. contents:: + :local: + + +.. automodule:: catalyst.experiments + :members: + :show-inheritance: + + +Experiments (catalyst) +---------------------- + +ConfigExperiment +~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.experiments.config + :members: + :undoc-members: + :show-inheritance: + + +Experiment +~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.experiments.experiment + :members: + :undoc-members: + :show-inheritance: + + +SupervisedExperiment +~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.experiments.supervised + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/metrics.rst b/docs/api/metrics.rst new file mode 100644 index 0000000000..522bb40e3d --- /dev/null +++ b/docs/api/metrics.rst @@ -0,0 +1,86 @@ +Metrics +================================================ + +.. toctree:: + :titlesonly: + +.. contents:: + :local: + + +.. automodule:: catalyst.metrics + :members: + :show-inheritance: + + +Accuracy +------------------------ +.. automodule:: catalyst.metrics.accuracy + :members: + :undoc-members: + :show-inheritance: + +AUC +------------------------ +.. automodule:: catalyst.metrics.auc + :members: + :undoc-members: + :show-inheritance: + +CMC score +------------------------ +.. automodule:: catalyst.metrics.cmc_score + :members: + :undoc-members: + :show-inheritance: + +Dice +------------------------ +.. automodule:: catalyst.metrics.dice + :members: + :undoc-members: + :show-inheritance: + +F1 score +------------------------ +.. automodule:: catalyst.metrics.f1_score + :members: + :undoc-members: + :show-inheritance: + +Focal +------------------------ +.. automodule:: catalyst.metrics.focal + :members: + :undoc-members: + :show-inheritance: + +IoU +------------------------ +.. automodule:: catalyst.metrics.iou + :members: + :undoc-members: + :show-inheritance: + +MRR +------------------------ +.. automodule:: catalyst.metrics.mrr + :members: + :undoc-members: + :show-inheritance: + +Precision +------------------------ +.. automodule:: catalyst.metrics.precision + :members: + :undoc-members: + :show-inheritance: + +Functional +------------------------ +.. automodule:: catalyst.metrics.functional + :members: + :undoc-members: + :show-inheritance: + + diff --git a/docs/api/registry.rst b/docs/api/registry.rst index 261cd4a1a4..42959489dd 100644 --- a/docs/api/registry.rst +++ b/docs/api/registry.rst @@ -8,6 +8,10 @@ Registry :local: +.. automodule:: catalyst.registry + :members: + :show-inheritance: + Registry ---------------------- diff --git a/docs/api/runners.rst b/docs/api/runners.rst new file mode 100644 index 0000000000..aa2547c12c --- /dev/null +++ b/docs/api/runners.rst @@ -0,0 +1,32 @@ +Runners +================================================ + +.. toctree:: + :titlesonly: + +.. contents:: + :local: + + +.. automodule:: catalyst.runners + :members: + :show-inheritance: + + +Runners (catalyst) +---------------------- + +Runner +~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.runners.runner + :members: + :undoc-members: + :show-inheritance: + + +SupervisedRunner +~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.runners.supervised + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/settings.rst b/docs/api/settings.rst new file mode 100644 index 0000000000..758c9190d6 --- /dev/null +++ b/docs/api/settings.rst @@ -0,0 +1,7 @@ +Settings +================================================ + +.. automodule:: catalyst.settings + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/tools.rst b/docs/api/tools.rst new file mode 100644 index 0000000000..c60df3f0ad --- /dev/null +++ b/docs/api/tools.rst @@ -0,0 +1,124 @@ +Tools +================================================ + +.. toctree:: + :titlesonly: + +.. contents:: + :local: + + +Tools (catalyst) +---------------------- +.. automodule:: catalyst.tools + :members: + :show-inheritance: + + +Frozen Class +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.tools.frozen_class + :members: + :undoc-members: + :show-inheritance: + +Time Manager +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.tools.time_manager + :members: + :undoc-members: + :show-inheritance: + + +Tools (contrib) +---------------------- +.. automodule:: catalyst.contrib.tools + :members: + :show-inheritance: + + +Tensorboard +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.tools.tensorboard + :members: + :undoc-members: + :show-inheritance: + + +Meters +------------------------ + +The meters from torchnet.meters. + +Every meter implements :py:class:`catalyst.tools.meters.meter.Meter` interface. + +Meter +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.tools.meters.meter + :members: + :undoc-members: + :show-inheritance: + +AP Meter +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.tools.meters.apmeter + :members: + :undoc-members: + :show-inheritance: + +AUC Meter +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.tools.meters.aucmeter + :members: + :undoc-members: + :show-inheritance: + +Average Value Meter +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.tools.meters.averagevaluemeter + :members: + :undoc-members: + :show-inheritance: + +Class Error Meter +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.tools.meters.classerrormeter + :members: + :undoc-members: + :show-inheritance: + +Confusion Meter +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.tools.meters.confusionmeter + :members: + :undoc-members: + :show-inheritance: + +Map Meter +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.tools.meters.mapmeter + :members: + :undoc-members: + :show-inheritance: + +Moving Average Value Meter +~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.tools.meters.movingaveragevaluemeter + :members: + :undoc-members: + :show-inheritance: + +MSE Meter +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.tools.meters.msemeter + :members: + :undoc-members: + :show-inheritance: + +Precision-Recall-F1 Meter +~~~~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.tools.meters.ppv_tpr_f1_meter + :members: + :undoc-members: + :show-inheritance: + diff --git a/docs/api/typing.rst b/docs/api/typing.rst new file mode 100644 index 0000000000..ada2f38f13 --- /dev/null +++ b/docs/api/typing.rst @@ -0,0 +1,7 @@ +Typing +================================================ + +.. automodule:: catalyst.typing + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/utils.rst b/docs/api/utils.rst index 4cfe66902a..69649787a9 100644 --- a/docs/api/utils.rst +++ b/docs/api/utils.rst @@ -1,4 +1,4 @@ -Tools and Utilities +Utilities ================================================ .. toctree:: @@ -8,292 +8,252 @@ Tools and Utilities :local: -Tools +Utilities (catalyst) ---------------------- - -.. automodule:: catalyst.tools +.. automodule:: catalyst.utils :members: :show-inheritance: -Frozen Class +Checkpoint ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.tools.frozen_class +.. automodule:: catalyst.utils.checkpoint :members: :undoc-members: :show-inheritance: -Time Manager +Components ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.tools.time_manager +.. automodule:: catalyst.utils.components :members: :undoc-members: :show-inheritance: -Typing +Config ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.tools.typing +.. automodule:: catalyst.utils.config :members: :undoc-members: :show-inheritance: - -Meters ------------------------- - -The meters from torchnet.meters. - -Every meter implements :py:class:`catalyst.tools.meters.meter.Meter` interface. - -Meter +Distributed ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.tools.meters.meter +.. automodule:: catalyst.utils.distributed :members: :undoc-members: :show-inheritance: -AP Meter +Hash ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.tools.meters.apmeter +.. automodule:: catalyst.utils.hash :members: :undoc-members: :show-inheritance: -AUC Meter +Initialization ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.tools.meters.aucmeter +.. automodule:: catalyst.utils.initialization :members: :undoc-members: :show-inheritance: -Average Value Meter +Loaders ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.tools.meters.averagevaluemeter +.. automodule:: catalyst.utils.loaders :members: :undoc-members: :show-inheritance: -Class Error Meter +Misc ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.tools.meters.classerrormeter +.. automodule:: catalyst.utils.misc :members: :undoc-members: :show-inheritance: -Confusion Meter +Numpy ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.tools.meters.confusionmeter +.. automodule:: catalyst.utils.numpy :members: :undoc-members: :show-inheritance: -Map Meter +Parser ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.tools.meters.mapmeter - :members: - :undoc-members: - :show-inheritance: - -Moving Average Value Meter -~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.tools.meters.movingaveragevaluemeter +.. automodule:: catalyst.utils.parser :members: :undoc-members: :show-inheritance: -MSE Meter +Pipelines ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.tools.meters.msemeter - :members: - :undoc-members: - :show-inheritance: - -Precision-Recall-F1 Meter -~~~~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.tools.meters.ppv_tpr_f1_meter +.. automodule:: catalyst.utils.pipelines :members: :undoc-members: :show-inheritance: - -Utils ----------------------- - -.. automodule:: catalyst.utils - :members: - :show-inheritance: - -Checkpoint +Pruning ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.checkpoint +.. automodule:: catalyst.utils.pruning :members: :undoc-members: :show-inheritance: -Components +Quantization ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.components +.. automodule:: catalyst.utils.quantization :members: :undoc-members: :show-inheritance: -Config +Scripts ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.config +.. automodule:: catalyst.utils.scripts :members: :undoc-members: :show-inheritance: -Distributed +Seed ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.distributed +.. automodule:: catalyst.utils.seed :members: :undoc-members: :show-inheritance: -Hash +Sys ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.hash +.. automodule:: catalyst.utils.sys :members: :undoc-members: :show-inheritance: -Initialization +Torch ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.initialization +.. automodule:: catalyst.utils.torch :members: :undoc-members: :show-inheritance: -Misc +Tracing ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.misc +.. automodule:: catalyst.utils.tracing :members: :undoc-members: :show-inheritance: -Numpy +Wizard ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.numpy +.. automodule:: catalyst.utils.wizard :members: :undoc-members: :show-inheritance: -Parser -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.parser +Utilities (contrib) +---------------------- +.. automodule:: catalyst.contrib.utils :members: - :undoc-members: :show-inheritance: -Scripts +Argparse ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.scripts +.. automodule:: catalyst.contrib.utils.argparse :members: :undoc-members: :show-inheritance: -Seed +Compression ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.seed +.. automodule:: catalyst.contrib.utils.compression :members: :undoc-members: :show-inheritance: -Sys +Confusion Matrix ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.sys +.. automodule:: catalyst.contrib.utils.confusion_matrix :members: :undoc-members: :show-inheritance: -Torch +Dataset ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.torch +.. automodule:: catalyst.contrib.utils.dataset :members: :undoc-members: :show-inheritance: - -Metrics ------------------------- - -Accuracy +Misc ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.metrics.accuracy - :members: - :undoc-members: - :show-inheritance: - -.. automodule:: catalyst.utils.metrics.multi_label_accuracy +.. automodule:: catalyst.contrib.utils.misc :members: :undoc-members: :show-inheritance: -AUC +Pandas ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.metrics.auc +.. automodule:: catalyst.contrib.utils.pandas :members: :undoc-members: :show-inheritance: - -CMC score +Parallel ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.metrics.cmc_score_count +.. automodule:: catalyst.contrib.utils.parallel :members: :undoc-members: :show-inheritance: -.. automodule:: catalyst.utils.metrics.cmc_score +Plotly +~~~~~~~~~~~~~~~~~~~~~~ +.. automodule:: catalyst.contrib.utils.plotly :members: :undoc-members: :show-inheritance: -Dice +Serialization ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.metrics.dice +.. automodule:: catalyst.contrib.utils.serialization :members: :undoc-members: :show-inheritance: -F1 score +Visualization ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.metrics.f1_score +.. automodule:: catalyst.contrib.utils.visualization :members: :undoc-members: :show-inheritance: -Focal -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.metrics.focal + +Utilities (CV) +------------------------- +.. automodule:: catalyst.contrib.utils.cv :members: - :undoc-members: :show-inheritance: -IoU +Image ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.metrics.iou +.. automodule:: catalyst.contrib.utils.cv.image :members: :undoc-members: :show-inheritance: -Precision +Tensor ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.metrics.average_precision +.. automodule:: catalyst.contrib.utils.cv.tensor :members: :undoc-members: :show-inheritance: -Functional -~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.utils.metrics.functional + +Utilities (NLP) +------------------------------------- +.. automodule:: catalyst.contrib.utils.nlp :members: - :undoc-members: :show-inheritance: -MRR +Text ~~~~~~~~~~~~~~~~~~~~~~ -.. automodule:: catalyst.metrics.mrr +.. automodule:: catalyst.contrib.utils.nlp.text :members: :undoc-members: :show-inheritance: diff --git a/docs/conf.py b/docs/conf.py index 1a3f5fcac8..5e3b735623 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -160,7 +160,7 @@ def get_version(mode: str = "full") -> str: # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ["_static"] -html_short_title = "Catalyst DL R&D" +html_short_title = "Accelerated deep learning R&D" # Custom sidebar templates, must be a dictionary that maps document names # to template names. diff --git a/docs/index.rst b/docs/index.rst index 067d117210..ded5f21ad3 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -194,10 +194,17 @@ Indices and tables .. toctree:: :caption: API + api/callbacks + api/contrib api/core - api/dl - api/registry - api/data + api/experiments + api/metrics + api/registry + api/runners + api/settings + api/tools + api/typing api/utils - api/contrib \ No newline at end of file + + From 52b5149f55e23ce3d1d4db1da2faace68fa41f47 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 19:13:21 +0300 Subject: [PATCH 21/30] tests update --- catalyst/callbacks/__init__.py | 1 + catalyst/experiments/tests/test_config.py | 4 ++-- catalyst/experiments/tests/test_core.py | 2 +- catalyst/experiments/tests/test_supervised.py | 4 ++-- catalyst/metrics/tests/test_cmc_metric.py | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/catalyst/callbacks/__init__.py b/catalyst/callbacks/__init__.py index 5b162a98ff..76ab4577de 100644 --- a/catalyst/callbacks/__init__.py +++ b/catalyst/callbacks/__init__.py @@ -18,6 +18,7 @@ EarlyStoppingCallback, CheckRunCallback, ) +from catalyst.callbacks.exception import ExceptionCallback from catalyst.callbacks.logging import ( ILoggerCallback, VerboseLogger, diff --git a/catalyst/experiments/tests/test_config.py b/catalyst/experiments/tests/test_config.py index 6cf6d1ed67..db1e4d3891 100644 --- a/catalyst/experiments/tests/test_config.py +++ b/catalyst/experiments/tests/test_config.py @@ -4,18 +4,18 @@ import torch -from catalyst.dl import ( +from catalyst.callbacks import ( CheckpointCallback, ConsoleLogger, CriterionCallback, ExceptionCallback, MetricManagerCallback, OptimizerCallback, - registry, SchedulerCallback, TensorboardLogger, ValidationManagerCallback, ) +from catalyst import registry from catalyst.experiments import ConfigExperiment DEFAULT_MINIMAL_CONFIG = { # noqa: WPS407 diff --git a/catalyst/experiments/tests/test_core.py b/catalyst/experiments/tests/test_core.py index a31cf54852..49c58251e2 100644 --- a/catalyst/experiments/tests/test_core.py +++ b/catalyst/experiments/tests/test_core.py @@ -2,7 +2,7 @@ import torch -from catalyst.dl import ( +from catalyst.callbacks import ( ConsoleLogger, ExceptionCallback, MetricManagerCallback, diff --git a/catalyst/experiments/tests/test_supervised.py b/catalyst/experiments/tests/test_supervised.py index 37cced7ce1..cf28cc91f0 100644 --- a/catalyst/experiments/tests/test_supervised.py +++ b/catalyst/experiments/tests/test_supervised.py @@ -2,7 +2,7 @@ import torch -from catalyst.dl import ( +from catalyst.callbacks import ( CheckpointCallback, CheckRunCallback, ConsoleLogger, @@ -16,7 +16,7 @@ ValidationManagerCallback, VerboseLogger, ) -from catalyst.experiment.supervised import SupervisedExperiment +from catalyst.experiments.supervised import SupervisedExperiment def _test_callbacks(test_callbacks, exp, stage="train"): diff --git a/catalyst/metrics/tests/test_cmc_metric.py b/catalyst/metrics/tests/test_cmc_metric.py index d492b5a65f..bcbd78a082 100644 --- a/catalyst/metrics/tests/test_cmc_metric.py +++ b/catalyst/metrics/tests/test_cmc_metric.py @@ -6,7 +6,7 @@ import torch -from catalyst.utils.metrics.cmc_score import cmc_score_count +from catalyst.metrics.cmc_score import cmc_score_count EPS = 1e-4 From 5bcd074e186b01fefd7f4ee47e51ee34dd5b47b3 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 20:06:16 +0300 Subject: [PATCH 22/30] tests update --- catalyst/callbacks/exception.py | 3 ++- catalyst/callbacks/metrics/dice.py | 31 ++++++++++++++++++----- catalyst/callbacks/metrics/iou.py | 16 ++++++++++-- catalyst/core/runner.py | 2 +- catalyst/data/cv/reader.py | 2 +- catalyst/experiments/experiment.py | 5 +++- catalyst/experiments/tests/test_config.py | 2 +- catalyst/settings.py | 10 +++++--- catalyst/utils/checkpoint.py | 6 ++++- catalyst/utils/loaders.py | 2 ++ 10 files changed, 60 insertions(+), 19 deletions(-) diff --git a/catalyst/callbacks/exception.py b/catalyst/callbacks/exception.py index 72a2c46213..05f44e1ca0 100644 --- a/catalyst/callbacks/exception.py +++ b/catalyst/callbacks/exception.py @@ -23,7 +23,8 @@ def on_exception(self, runner: "IRunner") -> None: runner: experiment runner Raises: - Exception + Exception: if during exception handling, + we still need to reraise exception """ exception = runner.exception if not is_exception(exception): diff --git a/catalyst/callbacks/metrics/dice.py b/catalyst/callbacks/metrics/dice.py index be1a55eb42..a7d6846aa6 100644 --- a/catalyst/callbacks/metrics/dice.py +++ b/catalyst/callbacks/metrics/dice.py @@ -15,7 +15,19 @@ class DiceCallback(BatchMetricCallback): - """Dice metric callback.""" + """Dice metric callback. + + Args: + input_key: input key to use for iou calculation + specifies our ``y_true`` + output_key: output key to use for iou calculation; + specifies our ``y_pred`` + prefix: key to store in logs + eps: epsilon to avoid zero division + threshold: threshold for outputs binarization + activation: An torch.nn activation applied to the outputs. + Must be one of ``'none'``, ``'Sigmoid'``, ``'Softmax2d'`` + """ def __init__( self, @@ -28,10 +40,15 @@ def __init__( ): """ Args: - input_key: input key to use for dice calculation; - specifies our `y_true` - output_key: output key to use for dice calculation; - specifies our `y_pred` + input_key: input key to use for iou calculation + specifies our ``y_true`` + output_key: output key to use for iou calculation; + specifies our ``y_pred`` + prefix: key to store in logs + eps: epsilon to avoid zero division + threshold: threshold for outputs binarization + activation: An torch.nn activation applied to the outputs. + Must be one of ``'none'``, ``'Sigmoid'``, ``'Softmax2d'`` """ super().__init__( prefix=prefix, @@ -110,7 +127,7 @@ def on_loader_end(self, runner: "IRunner"): dice_scores: np.ndarray = calculate_dice(**tp_fp_fn_dict) # logging the dice scores in the state - for i, dice in enumerate(dice_scores): + for i, dice_score in enumerate(dice_scores): if isinstance(self.class_names, dict) and i not in list( self.class_names.keys() ): @@ -119,7 +136,7 @@ def on_loader_end(self, runner: "IRunner"): self.class_names[i] if self.class_names is not None else str(i) ) - runner.loader_metrics[f"{self.prefix}_{postfix}"] = dice + runner.loader_metrics[f"{self.prefix}_{postfix}"] = dice_score # For supporting averaging of only classes specified in `class_names` values_to_avg = [ diff --git a/catalyst/callbacks/metrics/iou.py b/catalyst/callbacks/metrics/iou.py index 43d20f2551..fd19a1d19a 100644 --- a/catalyst/callbacks/metrics/iou.py +++ b/catalyst/callbacks/metrics/iou.py @@ -10,7 +10,19 @@ def _get_default_classwise_iou_args(num_classes: int) -> List[int]: class IouCallback(BatchMetricCallback): - """IoU (Jaccard) metric callback.""" + """IoU (Jaccard) metric callback. + + Args: + input_key: input key to use for iou calculation + specifies our ``y_true`` + output_key: output key to use for iou calculation; + specifies our ``y_pred`` + prefix: key to store in logs + eps: epsilon to avoid zero division + threshold: threshold for outputs binarization + activation: An torch.nn activation applied to the outputs. + Must be one of ``'none'``, ``'Sigmoid'``, ``'Softmax2d'`` + """ def __init__( self, @@ -84,7 +96,7 @@ def __init__( super().__init__( prefix=prefix, - metric_fn=metrics.iou, + metric_fn=iou, list_args=list_args, input_key=input_key, output_key=output_key, diff --git a/catalyst/core/runner.py b/catalyst/core/runner.py index 54a5da0435..48ca2ca725 100644 --- a/catalyst/core/runner.py +++ b/catalyst/core/runner.py @@ -599,7 +599,7 @@ def _get_experiment_components( criterion = experiment.get_criterion(stage) optimizer = experiment.get_optimizer(stage, model) scheduler = experiment.get_scheduler(stage, optimizer) - (model, criterion, optimizer, scheduler, device,) = process_components( + model, criterion, optimizer, scheduler, device = process_components( model=model, criterion=criterion, optimizer=optimizer, diff --git a/catalyst/data/cv/reader.py b/catalyst/data/cv/reader.py index 68d0e56415..adbcbcc304 100644 --- a/catalyst/data/cv/reader.py +++ b/catalyst/data/cv/reader.py @@ -1,6 +1,6 @@ from typing import Optional, Tuple, Union -from catalyst.contrib.utils.cv.image import imread +from catalyst.contrib.utils.cv.image import imread, mimread from catalyst.data.reader import ReaderSpec diff --git a/catalyst/experiments/experiment.py b/catalyst/experiments/experiment.py index 45ab0d5c7e..d2a6e5fc87 100644 --- a/catalyst/experiments/experiment.py +++ b/catalyst/experiments/experiment.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, Iterable, List, Mapping, Tuple, Union +from typing import Any, Dict, Iterable, List, Mapping, Tuple, Union, TYPE_CHECKING from collections import OrderedDict import warnings @@ -26,6 +26,9 @@ from catalyst.typing import Criterion, Model, Optimizer, Scheduler from catalyst.utils.loaders import get_loaders_from_params +if TYPE_CHECKING: + from catalyst.core.callback import Callback + class Experiment(IExperiment): """One-staged experiment, you can use it to declare experiments in code.""" diff --git a/catalyst/experiments/tests/test_config.py b/catalyst/experiments/tests/test_config.py index db1e4d3891..843dae1b36 100644 --- a/catalyst/experiments/tests/test_config.py +++ b/catalyst/experiments/tests/test_config.py @@ -4,6 +4,7 @@ import torch +from catalyst import registry from catalyst.callbacks import ( CheckpointCallback, ConsoleLogger, @@ -15,7 +16,6 @@ TensorboardLogger, ValidationManagerCallback, ) -from catalyst import registry from catalyst.experiments import ConfigExperiment DEFAULT_MINIMAL_CONFIG = { # noqa: WPS407 diff --git a/catalyst/settings.py b/catalyst/settings.py index 08c582ea06..6c68270a77 100644 --- a/catalyst/settings.py +++ b/catalyst/settings.py @@ -339,10 +339,12 @@ def parse(self) -> dict: SETTINGS = Settings.parse() -setattr(SETTINGS, "IS_GIT_AVAILABLE", IS_GIT_AVAILABLE) -setattr(SETTINGS, "IS_XLA_AVAILABLE", IS_XLA_AVAILABLE) -setattr(SETTINGS, "IS_PRUNING_AVAILABLE", IS_PRUNING_AVAILABLE) -setattr(SETTINGS, "IS_QUANTIZATION_AVAILABLE", IS_QUANTIZATION_AVAILABLE) +setattr(SETTINGS, "IS_GIT_AVAILABLE", IS_GIT_AVAILABLE) # noqa: B010 +setattr(SETTINGS, "IS_XLA_AVAILABLE", IS_XLA_AVAILABLE) # noqa: B010 +setattr(SETTINGS, "IS_PRUNING_AVAILABLE", IS_PRUNING_AVAILABLE) # noqa: B010 +setattr( + SETTINGS, "IS_QUANTIZATION_AVAILABLE", IS_QUANTIZATION_AVAILABLE +) # noqa: B010 __all__ = [ diff --git a/catalyst/utils/checkpoint.py b/catalyst/utils/checkpoint.py index a0b53e0afa..5f2bca8621 100644 --- a/catalyst/utils/checkpoint.py +++ b/catalyst/utils/checkpoint.py @@ -93,7 +93,7 @@ def save_checkpoint( is_last: bool = False, special_suffix: str = "", saver_fn: Callable = torch.save, -): +) -> Union[Path, str]: """Saving checkpoint to a file. Args: @@ -109,6 +109,9 @@ def save_checkpoint( saving best/last checkpoints. saver_fn: function to use for saving data to file, default is ``torch.save`` + + Returns: + path to saved checkpoint """ os.makedirs(logdir, exist_ok=True) filename = f"{logdir}/{suffix}.pth" @@ -122,6 +125,7 @@ def save_checkpoint( def load_checkpoint(filepath: str): """Load checkpoint from path. + Args: filepath: checkpoint file to load diff --git a/catalyst/utils/loaders.py b/catalyst/utils/loaders.py index 2dc8edca23..fbce0e1219 100644 --- a/catalyst/utils/loaders.py +++ b/catalyst/utils/loaders.py @@ -226,6 +226,8 @@ def get_loaders_from_params( ValueError: if batch_sampler option is mutually exclusive with distributed """ + from catalyst.data.sampler import DistributedSamplerWrapper + default_batch_size = batch_size default_num_workers = num_workers loaders_params = loaders_params or {} From 322ec436c90dc12f755cd0e00ab8d76135553edb Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 20:12:39 +0300 Subject: [PATCH 23/30] tests update --- catalyst/experiments/experiment.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/catalyst/experiments/experiment.py b/catalyst/experiments/experiment.py index d2a6e5fc87..a810ca459a 100644 --- a/catalyst/experiments/experiment.py +++ b/catalyst/experiments/experiment.py @@ -1,4 +1,13 @@ -from typing import Any, Dict, Iterable, List, Mapping, Tuple, Union, TYPE_CHECKING +from typing import ( + Any, + Dict, + Iterable, + List, + Mapping, + Tuple, + TYPE_CHECKING, + Union, +) from collections import OrderedDict import warnings From d3d257c4a924a40e42b3f0932943117f2d64bad7 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 20:49:05 +0300 Subject: [PATCH 24/30] tests update --- catalyst/callbacks/exception.py | 4 ++-- catalyst/settings.py | 4 ++-- catalyst/utils/distributed.py | 27 ++++++++++++++++++++++++++- catalyst/utils/parser.py | 10 ++++++++++ 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/catalyst/callbacks/exception.py b/catalyst/callbacks/exception.py index 05f44e1ca0..63bd6cde98 100644 --- a/catalyst/callbacks/exception.py +++ b/catalyst/callbacks/exception.py @@ -17,13 +17,13 @@ def __init__(self): ) def on_exception(self, runner: "IRunner") -> None: - """Exception handle hook. + """Exception handle hook. # noqa: DAR401 Args: runner: experiment runner Raises: - Exception: if during exception handling, + Exception: if during exception handling, # noqa: DAR402 we still need to reraise exception """ exception = runner.exception diff --git a/catalyst/settings.py b/catalyst/settings.py index 6c68270a77..c1eceb8aeb 100644 --- a/catalyst/settings.py +++ b/catalyst/settings.py @@ -342,9 +342,9 @@ def parse(self) -> dict: setattr(SETTINGS, "IS_GIT_AVAILABLE", IS_GIT_AVAILABLE) # noqa: B010 setattr(SETTINGS, "IS_XLA_AVAILABLE", IS_XLA_AVAILABLE) # noqa: B010 setattr(SETTINGS, "IS_PRUNING_AVAILABLE", IS_PRUNING_AVAILABLE) # noqa: B010 -setattr( +setattr( # noqa: B010 SETTINGS, "IS_QUANTIZATION_AVAILABLE", IS_QUANTIZATION_AVAILABLE -) # noqa: B010 +) __all__ = [ diff --git a/catalyst/utils/distributed.py b/catalyst/utils/distributed.py index 546bdf8c60..6adf6cbfbb 100644 --- a/catalyst/utils/distributed.py +++ b/catalyst/utils/distributed.py @@ -171,6 +171,12 @@ def get_distributed_mean(value: Union[float, torch.Tensor]): def get_slurm_params(): + """Return slurm params for experiment run. + + Returns: + tuple with current node index, number of nodes, master node + and master port + """ cmd = "scontrol show hostnames '%s'" % os.environ["SLURM_JOB_NODELIST"] nodes = subprocess.getoutput(cmd).split() num_nodes = int(os.environ["SLURM_JOB_NUM_NODES"]) @@ -183,6 +189,11 @@ def get_slurm_params(): def get_distributed_params(): + """Returns distributed params for experiment run. + + Returns: + dictionary with distributed params + """ master_port = str(random.randint(5 * 10 ** 4, 6 * 10 ** 4)) master_addr = "127.0.0.1" cur_node, num_nodes = 0, 1 @@ -214,8 +225,22 @@ def get_distributed_params(): def get_distributed_env( - local_rank, rank, world_size, use_cuda_visible_devices=True + local_rank: int, + rank: int, + world_size: int, + use_cuda_visible_devices: bool = True, ): + """Returns environment copy with extra distributed settings. + + Args: + local_rank: worker local rank + rank: worker global rank + world_size: worker world size + use_cuda_visible_devices: boolean flag to use available GPU devices + + Returns: + updated environment copy + """ env = os.environ.copy() env["RANK"] = str(rank) env["WORLD_SIZE"] = str(world_size) diff --git a/catalyst/utils/parser.py b/catalyst/utils/parser.py index 82f5033dc4..bd4f18111a 100644 --- a/catalyst/utils/parser.py +++ b/catalyst/utils/parser.py @@ -6,6 +6,16 @@ def parse_config_args(*, config, args, unknown_args): + """Parse config and cli args. + + Args: + config: dict-based experiment config + args: cli args + unknown_args: cli unknown args + + Returns: + config, args: final experiment config and cli args + """ for arg in unknown_args: arg_name, value = arg.split("=") arg_name = arg_name.lstrip("-").strip("/") From 6a77eacdd03d35b10b0b8394d7be8f20e7934f49 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 21:11:03 +0300 Subject: [PATCH 25/30] docs update --- catalyst/callbacks/pruning.py | 60 ++++++++++++++---------------- catalyst/callbacks/quantization.py | 41 ++++++++++---------- docs/api/registry.rst | 4 -- 3 files changed, 47 insertions(+), 58 deletions(-) diff --git a/catalyst/callbacks/pruning.py b/catalyst/callbacks/pruning.py index 662bbe5b72..20b7d9f65b 100644 --- a/catalyst/callbacks/pruning.py +++ b/catalyst/callbacks/pruning.py @@ -29,6 +29,33 @@ class PruningCallback(Callback): This callback is designed to prune network parameters during and/or after training. + + Args: + pruning_fn: function from torch.nn.utils.prune module + or your based on BasePruningMethod. Can be string e.g. + `"l1_unstructured"`. See pytorch docs for more details. + keys_to_prune: list of strings. Determines + which tensor in modules will be pruned. + amount: quantity of parameters to prune. + If float, should be between 0.0 and 1.0 and + represent the fraction of parameters to prune. + If int, it represents the absolute number + of parameters to prune. + prune_on_epoch_end: bool flag determines call or not + to call pruning_fn on epoch end. + prune_on_stage_end: bool flag determines call or not + to call pruning_fn on stage end. + remove_reparametrization_on_stage_end: if True then all + reparametrization pre-hooks and tensors with mask + will be removed on stage end. + reinitialize_after_pruning: if True then will reinitialize model + after pruning. (Lottery Ticket Hypothesis) + layers_to_prune: list of strings - module names to be pruned. + If None provided then will try to prune every module in + model. + dim: if you are using structured pruning method you need + to specify dimension. + l_norm: if you are using ln_structured you need to specify l_norm. """ def __init__( @@ -44,38 +71,7 @@ def __init__( dim: Optional[int] = None, l_norm: Optional[int] = None, ) -> None: - """ - Init method for pruning callback - - Args: - pruning_fn: function from torch.nn.utils.prune module - or your based on BasePruningMethod. Can be string e.g. - `"l1_unstructured"`. - See pytorch docs for more details. - keys_to_prune: list of strings. Determines - which tensor in modules will be pruned. - amount: quantity of parameters to prune. - If float, should be between 0.0 and 1.0 and - represent the fraction of parameters to prune. - If int, it represents the absolute number - of parameters to prune. - prune_on_epoch_end: bool flag determines call or not - to call pruning_fn on epoch end. - prune_on_stage_end: bool flag determines call or not - to call pruning_fn on stage end. - remove_reparametrization_on_stage_end: if True then all - reparametrization pre-hooks and tensors with mask - will be removed on stage end. - reinitialize_after_pruning: if True then will reinitialize model - after pruning. (Lottery Ticket Hypothesis) - layers_to_prune: list of strings - module names to be pruned. - If None provided then will try to prune every module in - model. - dim: if you are using structured pruning method you need - to specify dimension. - l_norm: if you are using ln_structured you need to specify l_norm. - - """ + """Init method for pruning callback""" super().__init__(CallbackOrder.External) if isinstance(pruning_fn, str): if pruning_fn not in PRUNING_FN.keys(): diff --git a/catalyst/callbacks/quantization.py b/catalyst/callbacks/quantization.py index 577c2ee549..8b82a09c45 100644 --- a/catalyst/callbacks/quantization.py +++ b/catalyst/callbacks/quantization.py @@ -12,11 +12,24 @@ class DynamicQuantizationCallback(Callback): - """ - Dynamic Quantization Callback - - This callback applying dynamic quantization - to the model. + """Dynamic Quantization Callback + + This callback applying dynamic quantization to the model. + + Args: + metric: Metric key we should trace model based on + minimize: Whether do we minimize metric or not + min_delta: Minimum value of change for metric to be + considered as improved + mode: One of `best` or `last` + do_once: Whether do we trace once per stage or every epoch + qconfig_spec: torch.quantization.quantize_dynamic + parameter, you can define layers to be quantize + dtype: type of the model parameters, default int8 + out_dir (Union[str, Path]): Directory to save model to + out_model (Union[str, Path]): Path to save model to + (overrides `out_dir` argument) + backend: defines backend for quantization """ def __init__( @@ -32,23 +45,7 @@ def __init__( out_model: Union[str, Path] = None, backend: str = None, ): - """ - Init method for callback - Args: - metric: Metric key we should trace model based on - minimize: Whether do we minimize metric or not - min_delta: Minimum value of change for metric to be - considered as improved - mode: One of `best` or `last` - do_once: Whether do we trace once per stage or every epoch - qconfig_spec: torch.quantization.quantize_dynamic - parameter, you can define layers to be quantize - dtype: type of the model parameters, default int8 - out_dir (Union[str, Path]): Directory to save model to - out_model (Union[str, Path]): Path to save model to - (overrides `out_dir` argument) - backend: defines backend for quantization - """ + """Init method for callback""" super().__init__(order=CallbackOrder.external) if mode not in ["best", "last"]: diff --git a/docs/api/registry.rst b/docs/api/registry.rst index 42959489dd..261cd4a1a4 100644 --- a/docs/api/registry.rst +++ b/docs/api/registry.rst @@ -8,10 +8,6 @@ Registry :local: -.. automodule:: catalyst.registry - :members: - :show-inheritance: - Registry ---------------------- From 2ba7e90501727964e25851913a4cb4bec8956d7f Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 21:31:33 +0300 Subject: [PATCH 26/30] backward compatibility --- catalyst/core/callbacks.py | 3 +++ catalyst/dl/callbacks.py | 3 +++ catalyst/dl/experiment.py | 3 +++ catalyst/dl/runner.py | 3 +++ 4 files changed, 12 insertions(+) create mode 100644 catalyst/core/callbacks.py create mode 100644 catalyst/dl/callbacks.py create mode 100644 catalyst/dl/experiment.py create mode 100644 catalyst/dl/runner.py diff --git a/catalyst/core/callbacks.py b/catalyst/core/callbacks.py new file mode 100644 index 0000000000..b658d80825 --- /dev/null +++ b/catalyst/core/callbacks.py @@ -0,0 +1,3 @@ +# flake8: noqa +# backward compatibility +from catalyst.callbacks import * diff --git a/catalyst/dl/callbacks.py b/catalyst/dl/callbacks.py new file mode 100644 index 0000000000..b658d80825 --- /dev/null +++ b/catalyst/dl/callbacks.py @@ -0,0 +1,3 @@ +# flake8: noqa +# backward compatibility +from catalyst.callbacks import * diff --git a/catalyst/dl/experiment.py b/catalyst/dl/experiment.py new file mode 100644 index 0000000000..83f766d7f1 --- /dev/null +++ b/catalyst/dl/experiment.py @@ -0,0 +1,3 @@ +# flake8: noqa +# backward compatibility +from catalyst.experiments import * diff --git a/catalyst/dl/runner.py b/catalyst/dl/runner.py new file mode 100644 index 0000000000..e33dc45d9c --- /dev/null +++ b/catalyst/dl/runner.py @@ -0,0 +1,3 @@ +# flake8: noqa +# backward compatibility +from catalyst.runners import * From 61b178ce3d3a5c0466900e281b8c2becb86fdf13 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Sun, 11 Oct 2020 22:21:43 +0300 Subject: [PATCH 27/30] docs updates --- docs/api/callbacks.rst | 6 +++--- docs/api/experiments.rst | 9 +++------ docs/api/runners.rst | 7 ++----- docs/api/tools.rst | 4 ++-- docs/api/utils.rst | 9 +++++---- 5 files changed, 15 insertions(+), 20 deletions(-) diff --git a/docs/api/callbacks.rst b/docs/api/callbacks.rst index 67ff48f7e9..1ea328114e 100644 --- a/docs/api/callbacks.rst +++ b/docs/api/callbacks.rst @@ -8,7 +8,7 @@ Callbacks :local: -Callbacks (catalyst) +Main API ---------------------- .. automodule:: catalyst.callbacks :members: @@ -128,7 +128,7 @@ Validation :show-inheritance: -Callbacks (metrics) +Metrics API ---------------------- .. automodule:: catalyst.callbacks.metrics :members: @@ -199,7 +199,7 @@ Precision :show-inheritance: -Callbacks (contrib) +Contrib API ---------------------- .. automodule:: catalyst.contrib.callbacks :members: diff --git a/docs/api/experiments.rst b/docs/api/experiments.rst index a007b5dc5a..d1e7d9ddcd 100644 --- a/docs/api/experiments.rst +++ b/docs/api/experiments.rst @@ -13,11 +13,8 @@ Experiments :show-inheritance: -Experiments (catalyst) ----------------------- - ConfigExperiment -~~~~~~~~~~~~~~~~~~~~ +---------------------- .. automodule:: catalyst.experiments.config :members: :undoc-members: @@ -25,7 +22,7 @@ ConfigExperiment Experiment -~~~~~~~~~~~~~~~~~~~~ +---------------------- .. automodule:: catalyst.experiments.experiment :members: :undoc-members: @@ -33,7 +30,7 @@ Experiment SupervisedExperiment -~~~~~~~~~~~~~~~~~~~~ +---------------------- .. automodule:: catalyst.experiments.supervised :members: :undoc-members: diff --git a/docs/api/runners.rst b/docs/api/runners.rst index aa2547c12c..58c500ddf2 100644 --- a/docs/api/runners.rst +++ b/docs/api/runners.rst @@ -13,11 +13,8 @@ Runners :show-inheritance: -Runners (catalyst) ----------------------- - Runner -~~~~~~~~~~~~~~~~~~~~ +---------------------- .. automodule:: catalyst.runners.runner :members: :undoc-members: @@ -25,7 +22,7 @@ Runner SupervisedRunner -~~~~~~~~~~~~~~~~~~~~ +---------------------- .. automodule:: catalyst.runners.supervised :members: :undoc-members: diff --git a/docs/api/tools.rst b/docs/api/tools.rst index c60df3f0ad..8dc25ab47c 100644 --- a/docs/api/tools.rst +++ b/docs/api/tools.rst @@ -8,7 +8,7 @@ Tools :local: -Tools (catalyst) +Main API ---------------------- .. automodule:: catalyst.tools :members: @@ -30,7 +30,7 @@ Time Manager :show-inheritance: -Tools (contrib) +Contrib API ---------------------- .. automodule:: catalyst.contrib.tools :members: diff --git a/docs/api/utils.rst b/docs/api/utils.rst index 69649787a9..9dd40dc088 100644 --- a/docs/api/utils.rst +++ b/docs/api/utils.rst @@ -8,7 +8,7 @@ Utilities :local: -Utilities (catalyst) +Main API ---------------------- .. automodule:: catalyst.utils :members: @@ -147,7 +147,8 @@ Wizard :undoc-members: :show-inheritance: -Utilities (contrib) + +Contrib API ---------------------- .. automodule:: catalyst.contrib.utils :members: @@ -224,7 +225,7 @@ Visualization :show-inheritance: -Utilities (CV) +CV API ------------------------- .. automodule:: catalyst.contrib.utils.cv :members: @@ -245,7 +246,7 @@ Tensor :show-inheritance: -Utilities (NLP) +NLP API ------------------------------------- .. automodule:: catalyst.contrib.utils.nlp :members: From c1995708e16493bde92f5031969904f396cf40b0 Mon Sep 17 00:00:00 2001 From: Dmytro Doroshenko Date: Sun, 11 Oct 2020 22:37:37 +0300 Subject: [PATCH 28/30] renamed callback split names --- docs/api/callbacks.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/api/callbacks.rst b/docs/api/callbacks.rst index 1ea328114e..98503d6808 100644 --- a/docs/api/callbacks.rst +++ b/docs/api/callbacks.rst @@ -8,7 +8,7 @@ Callbacks :local: -Main API +Base callbacks ---------------------- .. automodule:: catalyst.callbacks :members: @@ -128,7 +128,7 @@ Validation :show-inheritance: -Metrics API +Metrics ---------------------- .. automodule:: catalyst.callbacks.metrics :members: @@ -199,7 +199,7 @@ Precision :show-inheritance: -Contrib API +Contributed ---------------------- .. automodule:: catalyst.contrib.callbacks :members: From 2fe0b281316350e4e1a1f6bbf400f7d85c247f87 Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Mon, 12 Oct 2020 08:46:42 +0300 Subject: [PATCH 29/30] changelog --- CHANGELOG.md | 5 ++++- catalyst/tools/settings.py | 3 +++ catalyst/tools/typing.py | 3 +++ docs/api/callbacks.rst | 4 ++-- 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 catalyst/tools/settings.py create mode 100644 catalyst/tools/typing.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 034facf9b6..9159e43bf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - `IRunner._prepare_for_stage` logic moved to `IStageBasedRunner.prepare_for_stage` ([#947](https://github.com/catalyst-team/catalyst/pull/947)) - now we create components in the following order: datasets/loaders, model, criterion, optimizer, scheduler, callbacks - `MnistMLDataset` and `MnistQGDataset` data split logic - now targets of the datasets are disjoint ([#949](https://github.com/catalyst-team/catalyst/pull/949)) -- +- architecture redesign ([#953](https://github.com/catalyst-team/catalyst/pull/953)) + - experiments, runners, callbacks grouped by primitives under `catalyst.experiments`/`catalyst.runners`/`catalyst.callbacks` respectively + - settings and typing moved from `catalyst.tools.*` to `catalyst.*` + - utils moved from `catalyst.*.utils` to `catalyst.utils` ### Removed diff --git a/catalyst/tools/settings.py b/catalyst/tools/settings.py new file mode 100644 index 0000000000..dd630963fb --- /dev/null +++ b/catalyst/tools/settings.py @@ -0,0 +1,3 @@ +# flake8: noqa +# backward compatibility +from catalyst.settings import * diff --git a/catalyst/tools/typing.py b/catalyst/tools/typing.py new file mode 100644 index 0000000000..45308434dd --- /dev/null +++ b/catalyst/tools/typing.py @@ -0,0 +1,3 @@ +# flake8: noqa +# backward compatibility +from catalyst.typing import * diff --git a/docs/api/callbacks.rst b/docs/api/callbacks.rst index 98503d6808..55731824e1 100644 --- a/docs/api/callbacks.rst +++ b/docs/api/callbacks.rst @@ -8,7 +8,7 @@ Callbacks :local: -Base callbacks +Main ---------------------- .. automodule:: catalyst.callbacks :members: @@ -199,7 +199,7 @@ Precision :show-inheritance: -Contributed +Contrib ---------------------- .. automodule:: catalyst.contrib.callbacks :members: From 6061316a6488e27d3e8460995de0ef32080d5aeb Mon Sep 17 00:00:00 2001 From: Sergey Kolesnikov Date: Mon, 12 Oct 2020 09:03:39 +0300 Subject: [PATCH 30/30] docs update --- docs/api/tools.rst | 4 ++-- docs/api/utils.rst | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/api/tools.rst b/docs/api/tools.rst index 8dc25ab47c..06e2e9f195 100644 --- a/docs/api/tools.rst +++ b/docs/api/tools.rst @@ -8,7 +8,7 @@ Tools :local: -Main API +Main ---------------------- .. automodule:: catalyst.tools :members: @@ -30,7 +30,7 @@ Time Manager :show-inheritance: -Contrib API +Contrib ---------------------- .. automodule:: catalyst.contrib.tools :members: diff --git a/docs/api/utils.rst b/docs/api/utils.rst index 9dd40dc088..17fc357c10 100644 --- a/docs/api/utils.rst +++ b/docs/api/utils.rst @@ -8,7 +8,7 @@ Utilities :local: -Main API +Main ---------------------- .. automodule:: catalyst.utils :members: @@ -148,7 +148,7 @@ Wizard :show-inheritance: -Contrib API +Contrib ---------------------- .. automodule:: catalyst.contrib.utils :members: @@ -225,7 +225,7 @@ Visualization :show-inheritance: -CV API +Computer Vision ------------------------- .. automodule:: catalyst.contrib.utils.cv :members: @@ -246,7 +246,7 @@ Tensor :show-inheritance: -NLP API +Natural language processing ------------------------------------- .. automodule:: catalyst.contrib.utils.nlp :members: