diff --git a/mmengine/data/base_data_element.py b/mmengine/data/base_data_element.py index ac5870bcf5760d8de245452b4eec00ed7b50612e..609ce53850d37ca842338669c5af24690896f835 100644 --- a/mmengine/data/base_data_element.py +++ b/mmengine/data/base_data_element.py @@ -406,7 +406,7 @@ class BaseDataElement: # Tensor-like methods def numpy(self) -> 'BaseDataElement': - """Convert all tensor to np.narray in metainfo and data.""" + """Convert all tensor to np.narray in metainfo and data.""" new_data = self.new() for k, v in self.data_items(): if isinstance(v, torch.Tensor): diff --git a/mmengine/data/base_data_sample.py b/mmengine/data/base_data_sample.py index dd6fafd1dbfe1710c965e7db0eb99acd09de823e..659a4a8b9d2b652d4edb86e6362989659b936584 100644 --- a/mmengine/data/base_data_sample.py +++ b/mmengine/data/base_data_sample.py @@ -500,7 +500,7 @@ class BaseDataSample: # Tensor-like methods def numpy(self) -> 'BaseDataSample': - """Convert all tensor to np.narray in metainfo and data.""" + """Convert all tensor to np.narray in metainfo and data.""" new_data = self.new() for k, v in self.data_items(): if isinstance(v, (torch.Tensor, BaseDataElement)): diff --git a/mmengine/evaluator/base.py b/mmengine/evaluator/base.py index 287c2fe272822e668730a929df48a153c0bbd270..51fbd17ef0ef8996675180efa130348ebe02b5d1 100644 --- a/mmengine/evaluator/base.py +++ b/mmengine/evaluator/base.py @@ -10,6 +10,7 @@ from typing import Any, List, Optional, Union import torch import torch.distributed as dist +from mmengine.data import BaseDataSample from mmengine.utils import mkdir_or_exist @@ -45,13 +46,13 @@ class BaseEvaluator(metaclass=ABCMeta): self._dataset_meta = dataset_meta @abstractmethod - def process(self, data_samples: dict, predictions: dict) -> None: + def process(self, data_samples: BaseDataSample, predictions: dict) -> None: """Process one batch of data samples and predictions. The processed results should be stored in ``self.results``, which will be used to compute the metrics when all batches have been processed. Args: - data_samples (dict): The data samples from the dataset. + data_samples (BaseDataSample): The data samples from the dataset. predictions (dict): The output of the model. """ @@ -61,6 +62,7 @@ class BaseEvaluator(metaclass=ABCMeta): Args: results (list): The processed results of each batch. + Returns: dict: The computed metrics. The keys are the names of the metrics, and the values are corresponding results. @@ -78,9 +80,8 @@ class BaseEvaluator(metaclass=ABCMeta): this size. Returns: - metrics (dict): Evaluation metrics dict on the val dataset. The - keys are the names of the metrics, and the values are - corresponding results. + dict: Evaluation metrics dict on the val dataset. The keys are the + names of the metrics, and the values are corresponding results. """ if len(self.results) == 0: warnings.warn( diff --git a/mmengine/evaluator/builder.py b/mmengine/evaluator/builder.py index 710c6554b96e63b94c5237a1c31168b40e3bfb23..2a8fb3d811771677a9d3c38a38d0a44c30fedee4 100644 --- a/mmengine/evaluator/builder.py +++ b/mmengine/evaluator/builder.py @@ -1,9 +1,13 @@ # Copyright (c) OpenMMLab. All rights reserved. +from typing import Union + from ..registry import EVALUATORS +from .base import BaseEvaluator from .composed_evaluator import ComposedEvaluator -def build_evaluator(cfg: dict) -> object: +def build_evaluator( + cfg: Union[dict, list]) -> Union[BaseEvaluator, ComposedEvaluator]: """Build function of evaluator. When the evaluator config is a list, it will automatically build composed diff --git a/mmengine/evaluator/composed_evaluator.py b/mmengine/evaluator/composed_evaluator.py index 225284e70a43208949df0391487b2f53d45e74d9..c0ba27f981ecde4546d8b3972e850cc999e16444 100644 --- a/mmengine/evaluator/composed_evaluator.py +++ b/mmengine/evaluator/composed_evaluator.py @@ -1,6 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. from typing import Optional, Sequence, Union +from mmengine.data import BaseDataSample from .base import BaseEvaluator @@ -31,11 +32,11 @@ class ComposedEvaluator: for evaluator in self.evaluators: evaluator.dataset_meta = dataset_meta - def process(self, data_samples: dict, predictions: dict): + def process(self, data_samples: BaseDataSample, predictions: dict): """Invoke process method of each wrapped evaluator. Args: - data_samples (dict): The data samples from the dataset. + data_samples (BaseDataSample): The data samples from the dataset. predictions (dict): The output of the model. """ @@ -54,9 +55,8 @@ class ComposedEvaluator: this size. Returns: - metrics (dict): Evaluation metrics of all wrapped evaluators. The - keys are the names of the metrics, and the values are - corresponding results. + dict: Evaluation metrics of all wrapped evaluators. The keys are + the names of the metrics, and the values are corresponding results. """ metrics = {} for evaluator in self.evaluators: diff --git a/mmengine/hooks/checkpoint_hook.py b/mmengine/hooks/checkpoint_hook.py index 7baa99edce23e429a7d65b006c0dfbc72ef93db2..14a7ab7b0ec4205189e4bdbe30f846142a2cd579 100644 --- a/mmengine/hooks/checkpoint_hook.py +++ b/mmengine/hooks/checkpoint_hook.py @@ -43,6 +43,8 @@ class CheckpointHook(Hook): Default: None. """ + priority = 'VERY_LOW' + def __init__(self, interval: int = -1, by_epoch: bool = True, diff --git a/mmengine/hooks/empty_cache_hook.py b/mmengine/hooks/empty_cache_hook.py index b457f2c0409007b653def67a64f76ebc506aa5c6..44bf53ec415b30613775151890cbb5f27d5594ed 100644 --- a/mmengine/hooks/empty_cache_hook.py +++ b/mmengine/hooks/empty_cache_hook.py @@ -22,6 +22,8 @@ class EmptyCacheHook(Hook): Defaults to False. """ + priority = 'NORMAL' + def __init__(self, before_epoch: bool = False, after_epoch: bool = True, diff --git a/mmengine/hooks/hook.py b/mmengine/hooks/hook.py index 8321af8300449d6f086b9612e85930f3b44f94f7..f0ccb1f7994f574c615f02f477714e0ef615a3ca 100644 --- a/mmengine/hooks/hook.py +++ b/mmengine/hooks/hook.py @@ -10,6 +10,8 @@ class Hook: All hooks should inherit from this class. """ + priority = 'NORMAL' + def before_run(self, runner: object) -> None: """All subclasses should override this method, if they need any operations before the training process. diff --git a/mmengine/hooks/iter_timer_hook.py b/mmengine/hooks/iter_timer_hook.py index ecc84465441b2eeba7d48b94a7e6ae635c0a8302..3c637056920e5bc2323c2b75792da5a5d08baa15 100644 --- a/mmengine/hooks/iter_timer_hook.py +++ b/mmengine/hooks/iter_timer_hook.py @@ -14,6 +14,8 @@ class IterTimerHook(Hook): Eg. ``data_time`` for loading data and ``time`` for a model train step. """ + priority = 'NORMAL' + def before_epoch(self, runner: object) -> None: """Record time flag before start a epoch. diff --git a/mmengine/hooks/optimizer_hook.py b/mmengine/hooks/optimizer_hook.py index 8689b9fa3f43bb708538f33484bdf9ba5253b66a..99f010ab3190a1435885d4323a66cccb183ae9b1 100644 --- a/mmengine/hooks/optimizer_hook.py +++ b/mmengine/hooks/optimizer_hook.py @@ -30,6 +30,8 @@ class OptimizerHook(Hook): Defaults to False. """ + priority = 'HIGH' + def __init__(self, grad_clip: Optional[dict] = None, detect_anomalous_params: bool = False) -> None: diff --git a/mmengine/hooks/param_scheduler_hook.py b/mmengine/hooks/param_scheduler_hook.py index 1bbf610ff0405e3df8b07b0773cc468ed0fb1e3f..425ab1237bb0d9954e009813d6519d084a657de5 100644 --- a/mmengine/hooks/param_scheduler_hook.py +++ b/mmengine/hooks/param_scheduler_hook.py @@ -11,6 +11,8 @@ class ParamSchedulerHook(Hook): """A hook to update some hyper-parameters in optimizer, e.g learning rate and momentum.""" + priority = 'LOW' + def after_iter(self, runner: object, data_batch: Optional[Sequence[BaseDataSample]] = None, diff --git a/mmengine/hooks/sampler_seed_hook.py b/mmengine/hooks/sampler_seed_hook.py index d2c991a932a7c830ecd79d2b2f1cd24a49b0577c..6d665172690c93d1e1527f31f13c28970ee8a2ae 100644 --- a/mmengine/hooks/sampler_seed_hook.py +++ b/mmengine/hooks/sampler_seed_hook.py @@ -12,6 +12,8 @@ class DistSamplerSeedHook(Hook): purpose with :obj:`IterLoader`. """ + priority = 'NORMAL' + def before_epoch(self, runner: object) -> None: """Set the seed for sampler and batch_sampler. diff --git a/mmengine/hooks/sync_buffer_hook.py b/mmengine/hooks/sync_buffer_hook.py index 89edb55d98441b3fe53213d44935a754bbc70d12..f62910e8438a5fe1d382204ca96ab645ec604ea5 100644 --- a/mmengine/hooks/sync_buffer_hook.py +++ b/mmengine/hooks/sync_buffer_hook.py @@ -84,6 +84,8 @@ class SyncBuffersHook(Hook): """Synchronize model buffers such as running_mean and running_var in BN at the end of each epoch.""" + priority = 'NORMAL' + def __init__(self) -> None: self.distributed = dist.IS_DIST diff --git a/mmengine/model/wrappers/utils.py b/mmengine/model/wrappers/utils.py index f888f49c92b20c0390873042403f264cc6b53b6b..f952e9b16c6f2a155087014e020cdfc80ddd3ffa 100644 --- a/mmengine/model/wrappers/utils.py +++ b/mmengine/model/wrappers/utils.py @@ -8,7 +8,7 @@ def is_model_wrapper(model): The following 4 model in MMEngine (and their subclasses) are regarded as model wrappers: DataParallel, DistributedDataParallel, MMDataParallel, MMDistributedDataParallel. You may add you own - model wrapper by registering it to mmengine.registry.MODEL_WRAPPERS. + model wrapper by registering it to ``mmengine.registry.MODEL_WRAPPERS``. Args: model (nn.Module): The model to be checked.