Source code for ray.tune.stopper.timeout
import datetime
import time
from typing import Union
from ray import logger
from ray.tune.stopper.stopper import Stopper
from ray.util.annotations import PublicAPI
[docs]
@PublicAPI
class TimeoutStopper(Stopper):
"""Stops all trials after a certain timeout.
This stopper is automatically created when the `time_budget_s`
argument is passed to `train.RunConfig()`.
Args:
timeout: Either a number specifying the timeout in seconds, or
a `datetime.timedelta` object.
"""
def __init__(self, timeout: Union[int, float, datetime.timedelta]):
from datetime import timedelta
if isinstance(timeout, timedelta):
self._timeout_seconds = timeout.total_seconds()
elif isinstance(timeout, (int, float)):
self._timeout_seconds = timeout
else:
raise ValueError(
"`timeout` parameter has to be either a number or a "
"`datetime.timedelta` object. Found: {}".format(type(timeout))
)
self._budget = self._timeout_seconds
# To account for setup overhead, set the last check time only after
# the first call to `stop_all()`.
self._last_check = None
def __call__(self, trial_id, result):
return False
def stop_all(self):
now = time.time()
if self._last_check:
taken = now - self._last_check
self._budget -= taken
self._last_check = now
if self._budget <= 0:
logger.info(
f"Reached timeout of {self._timeout_seconds} seconds. "
f"Stopping all trials."
)
return True
return False
def __setstate__(self, state: dict):
state["_last_check"] = None
self.__dict__.update(state)