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)
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)