def test_create_and_get_experiment(self): with tempfile.TemporaryDirectory() as tempdir: rootdir = Path(tempdir) store = LogStore(rootdir) experiment_id = store.create_experiment(self.experiment) experiment = store.get_experiment(experiment_id) assert experiment.name == self.experiment_name
def test_delete_run(self): with tempfile.TemporaryDirectory() as tempdir: rootdir = Path(tempdir) store = LogStore(rootdir) experiment_id = store.create_experiment(self.experiment) run_id = store.create_run(experiment_id, self.worker_name) run_info = RunInfo( version=VERSION, uuid=run_id, name="test run", module="test_module", execution_path=Path("test/path"), experiment_id=experiment_id, experiment_name=self.experiment_name, worker_name=self.worker_name, status=Status.FINISHED, params=Params({"test": "params"}), report=Report({"test": "report"}), storage=store.get_storage(experiment_id, run_id), platform=get_platform_info(), git=get_git_info(), note="test note", stdout="test stdout", stderr="test stderr", start_time=datetime.datetime.now(), end_time=datetime.datetime.now(), ) store.save_run(run_info) assert (rootdir / str(experiment_id) / self.worker_name / run_id).exists() runinfos = store.delete_run(run_id) assert not (rootdir / str(experiment_id) / self.worker_name / run_id).exists()
class Executor: def __init__( self, rootdir: tp.Union[Path, str], module: str, execution_path: tp.Union[Path, str], ) -> None: self._store = LogStore(Path(rootdir)) self._module = module self._execution_path = Path(execution_path).absolute() if execution_path is not None: sys.path.append(str(execution_path)) import_submodules(module) @staticmethod def _load_params(path: Path): with open(path, "r") as f: params_dict = json.load(f) return Params.from_json(params_dict) def _build_runinfo( self, experiment_id: int, experiment: Experiment, worker: BaseWorker, run_id: str, name: str, status: Status, params: Params, report: Report = None, note: str = None, stdout: str = None, stderr: str = None, ) -> RunInfo: storage = self._store.get_storage(experiment_id, run_id) gitinfo: tp.Optional[GitInfo] = None try: gitinfo = get_git_info() except (error.GitCommandNotFoundError, error.GitRepositoryNotFoundError): gitinfo = None runinfo = RunInfo( version=VERSION, uuid=run_id, name=name, module=self._module, execution_path=self._execution_path, experiment_id=experiment_id, experiment_name=experiment.name, worker_name=worker.name, status=status, params=params, report=report, storage=storage, platform=get_platform_info(), git=gitinfo, note=note, stdout=stdout, stderr=stderr, start_time=datetime.datetime.now(), end_time=datetime.datetime.now(), ) return runinfo def init( self, experiment_name: str, ) -> int: experiment = Experiment.get_experiment(experiment_name) experiment_id = self._store.create_experiment(experiment) return experiment_id def run( self, experiment_id: int, worker_name: str, params_path: Path = None, name: str = None, note: str = None, ) -> RunInfo: name = name or "" experiment = self._store.get_experiment(experiment_id) worker = experiment.get_worker(worker_name) params = (self._load_params(params_path) if params_path else worker.params) # make sure that worker_name exists before create_run run_id = self._store.create_run(experiment_id, worker_name) runinfo = self._build_runinfo( experiment_id=experiment_id, experiment=experiment, worker=worker, run_id=run_id, name=name, status=Status.RUNNING, params=params, note=note, ) self._store.save_run(runinfo) report: tp.Optional[Report] = None try: with capture() as captured_out: report = worker( params=params, storage=runinfo.storage, ) except KeyboardInterrupt: runinfo.status = Status.INTERRUPTED except Exception as e: # pylint: disable=broad-except runinfo.status = Status.FAILED raise e else: runinfo.status = Status.FINISHED finally: runinfo.report = report runinfo.stdout = captured_out["stdout"] runinfo.stderr = captured_out["stderr"] runinfo.end_time = datetime.datetime.now() self._store.save_run(runinfo) return runinfo