Source code for orion.core.worker

# -*- coding: utf-8 -*-
"""
:mod:`orion.core.worker` -- Coordination of the optimization procedure
======================================================================

.. module:: worker
   :platform: Unix
   :synopsis: Executes optimization steps and runs training experiment
      with parameter values suggested.

"""
import io
import itertools
import logging
import pprint

from orion.core.worker.consumer import Consumer
from orion.core.worker.producer import Producer
from orion.storage.base import get_storage

log = logging.getLogger(__name__)


[docs]def reserve_trial(experiment, producer): """Reserve a new trial, or produce and reserve a trial if none are available.""" trial = experiment.reserve_trial(score_handle=producer.algorithm.score) if trial is None and not experiment.is_done: log.debug("#### Failed to pull a new trial from database.") log.debug("#### Fetch most recent completed trials and update algorithm.") producer.update() log.debug("#### Produce new trials.") producer.produce() return reserve_trial(experiment, producer) return trial
[docs]def workon(experiment, worker_trials=None): """Try to find solution to the search problem defined in `experiment`.""" producer = Producer(experiment) consumer = Consumer(experiment) log.debug("##### Init Experiment #####") try: iterator = range(int(worker_trials)) except (OverflowError, TypeError): # When worker_trials is inf iterator = itertools.count() for _ in iterator: log.debug("#### Poll for experiment termination.") if experiment.is_broken: log.info("#### Experiment has reached broken trials threshold, terminating.") return if experiment.is_done: break log.debug("#### Try to reserve a new trial to evaluate.") trial = reserve_trial(experiment, producer) if trial is not None: log.debug("#### Successfully reserved %s to evaluate. Consuming...", trial) consumer.consume(trial) stats = experiment.stats if not stats: log.info("No trials completed.") return best = get_storage().get_trial(uid=stats['best_trials_id']) stats_stream = io.StringIO() pprint.pprint(stats, stream=stats_stream) stats_string = stats_stream.getvalue() best_stream = io.StringIO() pprint.pprint(best.to_dict()['params'], stream=best_stream) best_string = best_stream.getvalue() log.info("##### Search finished successfully #####") log.info("\nRESULTS\n=======\n%s\n", stats_string) log.info("\nBEST PARAMETERS\n===============\n%s", best_string)