def METHOD_NAME(self, predict_dataset, predict_examples, ignore_keys=None, metric_key_prefix: str = "test"):
    predict_dataloader = self.get_test_dataloader(predict_dataset)
    # Temporarily disable metric computation, we will do it in the loop here.
    compute_metrics = self.compute_metrics
    self.compute_metrics = None
    eval_loop = self.prediction_loop if self.args.use_legacy_prediction_loop else self.evaluation_loop
    start_time = time.time()
    try:
        output = eval_loop(
            predict_dataloader,
            description="Prediction",
            # No point gathering the predictions if there are no metrics, otherwise we defer to
            # self.args.prediction_loss_only
            prediction_loss_only=True if compute_metrics is None else None,
            ignore_keys=ignore_keys,
            metric_key_prefix=metric_key_prefix,
        )
    finally:
        self.compute_metrics = compute_metrics
    total_batch_size = self.args.eval_batch_size * self.args.world_size
    if f"{metric_key_prefix}_jit_compilation_time" in output.metrics:
        start_time += output.metrics[f"{metric_key_prefix}_jit_compilation_time"]
    output.metrics.update(
        speed_metrics(
            metric_key_prefix,
            start_time,
            num_samples=output.num_samples,
            num_steps=math.ceil(output.num_samples / total_batch_size),
        )
    )
    if self.post_process_function is None or self.compute_metrics is None:
        return output
    predictions = self.post_process_function(predict_examples, predict_dataset, output.predictions, "predict")
    metrics = self.compute_metrics(predictions)
    # Prefix all keys with metric_key_prefix + '_'
    for key in list(metrics.keys()):
        if not key.startswith(f"{metric_key_prefix}_"):
            metrics[f"{metric_key_prefix}_{key}"] = metrics.pop(key)
    metrics.update(output.metrics)
    return PredictionOutput(predictions=predictions.predictions, label_ids=predictions.label_ids, metrics=metrics)