Ejemplo n.º 1
0
    def _create_experiment(self, parameters, pid, trial, count,
                           experiment_kwargs):
        # type: (Any, Any, Any, Any, Dict[str, Any]) -> BaseExperiment
        """
        Instantiates an Experiment, OfflineExperiment, or
        callable.
        """
        from comet_ml import Experiment, OfflineExperiment

        LOGGER.debug("Creating a %r with %r parameters", self.experiment_class,
                     parameters)

        if not experiment_kwargs:
            # Fallback on deprecated experiment kwargs given at Optimizer creation
            experiment_kwargs = self.experiment_kwargs

        # Inject the API Key if not set
        if "api_key" not in experiment_kwargs and self.api_key is not None:
            experiment_kwargs["api_key"] = self.api_key

        if self.experiment_class == "Experiment":
            exp = Experiment(**experiment_kwargs)  # type: BaseExperiment
        elif self.experiment_class == "OfflineExperiment":
            exp = OfflineExperiment(**
                                    experiment_kwargs)  # type: BaseExperiment
        elif callable(self.experiment_class):
            exp = self.experiment_class(**experiment_kwargs)
        else:
            raise OptimizerException("Invalid experiment_class: %s" %
                                     self.experiment_class)

        exp._set_optimizer(self, pid, trial, count)

        if self.predictor_spec:
            LOGGER.debug("Setting predictor in experiment: %s",
                         self.predictor_spec)

            if isinstance(exp, OfflineExperiment):
                mode = "local"
            else:
                # This should be at least global as it is set in Optimizer._fill_defaults_predictor
                mode = self.predictor_spec["mode"]

            # Old version of the Python SDK used to store predictor_spec with an
            # empty optimizer_id, which would leads to TypeError: type object
            # got multiple values for keyword argument 'optimizer_id'
            # Also pop mode as it is passed explicitely
            predictor_spec = self.predictor_spec.copy()
            predictor_spec.pop("optimizer_id", None)
            predictor_spec.pop("mode", None)

            try:
                exp.set_predictor(
                    Predictor(exp,
                              optimizer_id=self.id,
                              mode=mode,
                              **predictor_spec))
            except Exception:
                LOGGER.warning(
                    "Failure to create Predictor, experiment will run without Predictor",
                    exc_info=True,
                )

        exp.log_parameters(parameters)
        # Log optimizer static information:
        exp.log_other("optimizer_id", self.id)
        exp.log_other("optimizer_pid", pid)
        exp.log_other("optimizer_trial", trial)
        return exp