def METHOD_NAME(
    self,
    eval_dataset: Optional[Dataset] = None,
    ignore_keys: Optional[List[str]] = None,
    metric_key_prefix: str = "eval",
) -> Dict[str, float]:
    """
    Run evaluation and returns metrics.
    The calling script will be responsible for providing a method to compute metrics, as they are task-dependent
    (pass it to the init :obj:`compute_metrics` argument).
    You can also subclass and override this method to inject custom behavior.
    Args:
        eval_dataset (:obj:`Dataset`, `optional`):
            Pass a dataset if you wish to override :obj:`self.eval_dataset`. If it is an :obj:`datasets.Dataset`,
            columns not accepted by the ``model.forward()`` method are automatically removed. It must implement the
            :obj:`__len__` method.
        ignore_keys (:obj:`Lst[str]`, `optional`):
            A list of keys in the output of your model (if it is a dictionary) that should be ignored when
            gathering predictions.
        metric_key_prefix (:obj:`str`, `optional`, defaults to :obj:`"eval"`):
            An optional prefix to be used as the metrics key prefix. For example the metrics "bleu" will be named
            "eval_bleu" if the prefix is "eval" (default)
    Returns:
        A dictionary containing the evaluation loss and the potential metrics computed from the predictions. The
        dictionary also contains the epoch number which comes from the training state.
    """
    if eval_dataset is not None and not isinstance(eval_dataset, collections.abc.Sized):
        raise ValueError("eval_dataset must implement __len__")
    self.args.local_rank = -1
    eval_dataloader = self.get_eval_dataloader(eval_dataset)
    self.args.local_rank = torch.distributed.get_rank()
    start_time = time.time()
    metrics = self.prediction_loop(
        eval_dataloader,
        description="Evaluation",
        # No point gathering the predictions if there are no metrics, otherwise we defer to
        # self.args.prediction_loss_only
        prediction_loss_only=True if self.compute_metrics is None else None,
        ignore_keys=ignore_keys,
        metric_key_prefix=metric_key_prefix,
    )
    n_samples = len(eval_dataset if eval_dataset is not None else self.eval_dataset)
    metrics.update(speed_metrics(metric_key_prefix, start_time, n_samples))
    self.log(metrics)
    self.control = self.callback_handler.on_evaluate(self.args, self.state, self.control, metrics)
    return metrics