Пример #1
0
    def __call__(self, engine: Engine, logger: MLflowLogger, event_name: Union[str, Events]) -> None:

        if not isinstance(logger, MLflowLogger):
            raise TypeError("Handler 'OutputHandler' works only with MLflowLogger")

        rendered_metrics = self._setup_output_metrics_state_attrs(engine)

        global_step = self.global_step_transform(engine, event_name)  # type: ignore[misc]

        if not isinstance(global_step, int):
            raise TypeError(
                f"global_step must be int, got {type(global_step)}."
                " Please check the output of global_step_transform."
            )

        # Additionally recheck metric names as MLflow rejects non-valid names with MLflowException
        from mlflow.utils.validation import _VALID_PARAM_AND_METRIC_NAMES

        metrics = {}
        for keys, value in rendered_metrics.items():
            key = " ".join(keys)
            metrics[key] = value

        for key in list(metrics.keys()):
            if not _VALID_PARAM_AND_METRIC_NAMES.match(key):
                warnings.warn(
                    f"MLflowLogger output_handler encountered an invalid metric name '{key}' that "
                    "will be ignored and not logged to MLflow"
                )
                del metrics[key]

        logger.log_metrics(metrics, step=global_step)
Пример #2
0
    def __call__(self, engine: Engine, logger: MLflowLogger,
                 event_name: Union[str, Events]) -> None:

        if not isinstance(logger, MLflowLogger):
            raise TypeError(
                "Handler 'OutputHandler' works only with MLflowLogger")

        metrics = self._setup_output_metrics(engine)

        global_step = self.global_step_transform(
            engine, event_name)  # type: ignore[misc]

        if not isinstance(global_step, int):
            raise TypeError(
                "global_step must be int, got {}."
                " Please check the output of global_step_transform.".format(
                    type(global_step)))

        rendered_metrics = {}  # type: Dict[str, float]
        for key, value in metrics.items():
            if isinstance(value, numbers.Number):
                rendered_metrics["{} {}".format(
                    self.tag, key)] = value  # type: ignore[assignment]
            elif isinstance(value, torch.Tensor) and value.ndimension() == 0:
                rendered_metrics["{} {}".format(self.tag, key)] = value.item()
            elif isinstance(value, torch.Tensor) and value.ndimension() == 1:
                for i, v in enumerate(value):
                    rendered_metrics["{} {} {}".format(self.tag, key,
                                                       i)] = v.item()
            else:
                warnings.warn("MLflowLogger output_handler can not log "
                              "metrics value type {}".format(type(value)))

        # Additionally recheck metric names as MLflow rejects non-valid names with MLflowException
        from mlflow.utils.validation import _VALID_PARAM_AND_METRIC_NAMES

        for key in list(rendered_metrics.keys()):
            if not _VALID_PARAM_AND_METRIC_NAMES.match(key):
                warnings.warn(
                    "MLflowLogger output_handler encountered an invalid metric name '{}' that "
                    "will be ignored and not logged to MLflow".format(key))
                del rendered_metrics[key]

        logger.log_metrics(rendered_metrics, step=global_step)