def METHOD_NAME(logging_outputs) -> None:
    """Aggregate logging outputs from data parallel training."""
    loss_sum = sum(log.get("loss", 0) for log in logging_outputs)
    ntokens = sum(log.get("ntokens", 0) for log in logging_outputs)
    sample_size = sum(log.get("sample_size", 0) for log in logging_outputs)
    total_loss_sum = sum(log.get("total_loss", 0) for log in logging_outputs)
    avg_span_sum = sum(log.get("avg_span", 0) for log in logging_outputs)
    max_span_sum = sum(log.get("max_span", 0) for log in logging_outputs)
    # we divide by log(2) to convert the loss from base e to base 2
    metrics.log_scalar(
        "loss", loss_sum / sample_size / math.log(2), sample_size, round=3
    )
    metrics.log_scalar("avg_span", avg_span_sum / sample_size, sample_size, round=3)
    metrics.log_scalar("max_span", max_span_sum / sample_size, sample_size, round=3)
    # total loss contains the L1 norm on adaptive-span
    metrics.log_scalar(
        "total_loss",
        total_loss_sum / sample_size / math.log(2),
        sample_size,
        round=3,
    )
    if sample_size != ntokens:
        metrics.log_scalar(
            "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3
        )
        metrics.log_derived(
            "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg)
        )
    else:
        metrics.log_derived(
            "ppl", lambda meters: utils.get_perplexity(meters["loss"].avg)
        )