def METHOD_NAME(logging_outputs) -> None:
    """Aggregate logging outputs from data parallel training."""
    def _get_mode(logging_outputs):
        mds = [
            SpeechTextPreTrainCompoundCriterion.value2mode(log["mode"])
            for log in logging_outputs
        ]
        if sum([1 if l != mds[0] else 0 for l in mds]) > 0:
            raise ValueError("mode in one mini-batch is expected to be the same!")
        return mds[0]
    log_mode = _get_mode(logging_outputs)
    if log_mode == "xent":
        return SpeechTextPreTrainCrossEntCriterion.METHOD_NAME(logging_outputs)
    # ctc loss
    loss_sum = utils.item(sum(log.get("loss", 0) for log in logging_outputs))
    ntokens = utils.item(sum(log.get("ntokens", 0) for log in logging_outputs))
    nsentences = utils.item(
        sum(log.get("nsentences", 0) for log in logging_outputs)
    )
    sample_size = utils.item(
        sum(log.get("sample_size", 0) for log in logging_outputs)
    )
    metrics.log_scalar(
        "ctc_loss", loss_sum / sample_size / math.log(2), sample_size, round=3
    )
    metrics.log_scalar("ctc_ntokens", ntokens)
    metrics.log_scalar("ctc_nsentences", nsentences)
    if sample_size != ntokens:
        metrics.log_scalar(
            "ctc_nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3
        )
    c_errors = sum(log.get("c_errors", 0) for log in logging_outputs)
    metrics.log_scalar("_c_errors", c_errors)
    c_total = sum(log.get("c_total", 0) for log in logging_outputs)
    metrics.log_scalar("_c_total", c_total)
    w_errors = sum(log.get("w_errors", 0) for log in logging_outputs)
    metrics.log_scalar("_w_errors", w_errors)
    wv_errors = sum(log.get("wv_errors", 0) for log in logging_outputs)
    metrics.log_scalar("_wv_errors", wv_errors)
    w_total = sum(log.get("w_total", 0) for log in logging_outputs)
    metrics.log_scalar("_w_total", w_total)
    if c_total > 0:
        metrics.log_derived(
            "uer",
            lambda meters: safe_round(
                meters["_c_errors"].sum * 100.0 / meters["_c_total"].sum, 3
            )
            if meters["_c_total"].sum > 0
            else float("nan"),
        )
    if w_total > 0:
        metrics.log_derived(
            "wer",
            lambda meters: safe_round(
                meters["_w_errors"].sum * 100.0 / meters["_w_total"].sum, 3
            )
            if meters["_w_total"].sum > 0
            else float("nan"),
        )
        metrics.log_derived(
            "raw_wer",
            lambda meters: safe_round(
                meters["_wv_errors"].sum * 100.0 / meters["_w_total"].sum, 3
            )
            if meters["_w_total"].sum > 0
            else float("nan"),
        )