2020-08-20 02:03:22 +00:00
|
|
|
# Copyright The PyTorch Lightning team.
|
|
|
|
#
|
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
|
# You may obtain a copy of the License at
|
|
|
|
#
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
#
|
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
# See the License for the specific language governing permissions and
|
|
|
|
# limitations under the License.
|
2021-11-22 14:58:23 +00:00
|
|
|
from dataclasses import dataclass, field
|
2021-05-04 10:50:56 +00:00
|
|
|
from typing import Optional
|
2020-08-20 02:03:22 +00:00
|
|
|
|
2021-01-12 13:56:07 +00:00
|
|
|
from pytorch_lightning.utilities import LightningEnum
|
2021-11-22 14:58:23 +00:00
|
|
|
from pytorch_lightning.utilities.enums import _FaultTolerantMode
|
2020-08-09 10:24:09 +00:00
|
|
|
|
|
|
|
|
2021-05-04 10:50:56 +00:00
|
|
|
class TrainerStatus(LightningEnum):
|
|
|
|
"""Enum for the status of the :class:`~pytorch_lightning.trainer.trainer.Trainer`"""
|
2021-07-26 11:37:35 +00:00
|
|
|
|
|
|
|
INITIALIZING = "initializing" # trainer creation
|
|
|
|
RUNNING = "running"
|
|
|
|
FINISHED = "finished"
|
|
|
|
INTERRUPTED = "interrupted"
|
2020-08-09 10:24:09 +00:00
|
|
|
|
2021-03-06 12:40:19 +00:00
|
|
|
@property
|
|
|
|
def stopped(self) -> bool:
|
|
|
|
return self in (self.FINISHED, self.INTERRUPTED)
|
|
|
|
|
2021-05-04 10:50:56 +00:00
|
|
|
|
|
|
|
class TrainerFn(LightningEnum):
|
|
|
|
"""
|
|
|
|
Enum for the user-facing functions of the :class:`~pytorch_lightning.trainer.trainer.Trainer`
|
|
|
|
such as :meth:`~pytorch_lightning.trainer.trainer.Trainer.fit` and
|
|
|
|
:meth:`~pytorch_lightning.trainer.trainer.Trainer.test`.
|
|
|
|
"""
|
2021-07-26 11:37:35 +00:00
|
|
|
|
|
|
|
FITTING = "fit"
|
|
|
|
VALIDATING = "validate"
|
|
|
|
TESTING = "test"
|
|
|
|
PREDICTING = "predict"
|
|
|
|
TUNING = "tune"
|
2021-05-04 10:50:56 +00:00
|
|
|
|
2021-03-06 12:40:19 +00:00
|
|
|
@property
|
2021-07-26 11:37:35 +00:00
|
|
|
def _setup_fn(self) -> "TrainerFn":
|
2021-09-06 12:49:09 +00:00
|
|
|
"""``FITTING`` is used instead of ``TUNING`` as there are no "tune" dataloaders.
|
2021-05-04 10:50:56 +00:00
|
|
|
|
|
|
|
This is used for the ``setup()`` and ``teardown()`` hooks
|
|
|
|
"""
|
|
|
|
return TrainerFn.FITTING if self == TrainerFn.TUNING else self
|
2021-03-06 12:40:19 +00:00
|
|
|
|
2020-08-09 10:24:09 +00:00
|
|
|
|
2021-01-13 01:33:39 +00:00
|
|
|
class RunningStage(LightningEnum):
|
2021-09-06 12:49:09 +00:00
|
|
|
"""Enum for the current running stage.
|
2021-03-06 12:40:19 +00:00
|
|
|
|
2021-05-04 10:50:56 +00:00
|
|
|
This stage complements :class:`TrainerFn` by specifying the current running stage for each function.
|
|
|
|
More than one running stage value can be set while a :class:`TrainerFn` is running:
|
2021-01-13 01:33:39 +00:00
|
|
|
|
2021-05-04 10:50:56 +00:00
|
|
|
- ``TrainerFn.FITTING`` - ``RunningStage.{SANITY_CHECKING,TRAINING,VALIDATING}``
|
|
|
|
- ``TrainerFn.VALIDATING`` - ``RunningStage.VALIDATING``
|
|
|
|
- ``TrainerFn.TESTING`` - ``RunningStage.TESTING``
|
|
|
|
- ``TrainerFn.PREDICTING`` - ``RunningStage.PREDICTING``
|
|
|
|
- ``TrainerFn.TUNING`` - ``RunningStage.{TUNING,SANITY_CHECKING,TRAINING,VALIDATING}``
|
2021-01-13 01:33:39 +00:00
|
|
|
"""
|
2021-07-26 11:37:35 +00:00
|
|
|
|
|
|
|
TRAINING = "train"
|
|
|
|
SANITY_CHECKING = "sanity_check"
|
|
|
|
VALIDATING = "validate"
|
|
|
|
TESTING = "test"
|
|
|
|
PREDICTING = "predict"
|
|
|
|
TUNING = "tune"
|
2021-01-13 01:33:39 +00:00
|
|
|
|
2021-03-06 12:40:19 +00:00
|
|
|
@property
|
|
|
|
def evaluating(self) -> bool:
|
|
|
|
return self in (self.VALIDATING, self.TESTING)
|
2021-05-04 10:50:56 +00:00
|
|
|
|
2021-08-16 09:28:05 +00:00
|
|
|
@property
|
|
|
|
def dataloader_prefix(self) -> Optional[str]:
|
|
|
|
if self in (self.SANITY_CHECKING, self.TUNING):
|
|
|
|
return None
|
|
|
|
if self == self.VALIDATING:
|
|
|
|
return "val"
|
|
|
|
return self.value
|
|
|
|
|
2021-05-04 10:50:56 +00:00
|
|
|
|
|
|
|
@dataclass
|
|
|
|
class TrainerState:
|
2021-09-06 12:49:09 +00:00
|
|
|
"""Dataclass to encapsulate the current :class:`~pytorch_lightning.trainer.trainer.Trainer` state."""
|
2021-07-26 11:37:35 +00:00
|
|
|
|
2021-05-04 10:50:56 +00:00
|
|
|
status: TrainerStatus = TrainerStatus.INITIALIZING
|
|
|
|
fn: Optional[TrainerFn] = None
|
|
|
|
stage: Optional[RunningStage] = None
|
|
|
|
|
2021-11-22 14:58:23 +00:00
|
|
|
# detect the fault tolerant flag
|
|
|
|
_fault_tolerant_mode: _FaultTolerantMode = field(default_factory=_FaultTolerantMode.detect_current_mode)
|
|
|
|
|
2021-05-04 10:50:56 +00:00
|
|
|
@property
|
|
|
|
def finished(self) -> bool:
|
|
|
|
return self.status == TrainerStatus.FINISHED
|
|
|
|
|
|
|
|
@property
|
|
|
|
def stopped(self) -> bool:
|
|
|
|
return self.status.stopped
|