def METHOD_NAME(
    self, sample, model, criterion, optimizer, update_num, ignore_grad=False
):
    """
    Do forward and backward, and return the loss as computed by *criterion*
    for the given *model* and *sample*.
    Args:
        sample (dict): the mini-batch. The format is defined by the
            :class:`~fairseq.data.FairseqDataset`.
        model (~fairseq.models.BaseFairseqModel): the model
        criterion (~fairseq.criterions.FairseqCriterion): the criterion
        optimizer (~fairseq.optim.FairseqOptimizer): the optimizer
        update_num (int): the current update
        ignore_grad (bool): multiply loss by 0 if this is set to True
    Returns:
        tuple:
            - the loss
            - the sample size, which is used as the denominator for the
              gradient
            - logging outputs to display while training
    """
    model.train()
    model.set_num_updates(update_num)
    with torch.autograd.profiler.record_function("forward"):
        loss, sample_size, logging_output = criterion(model, sample['gpt'])
    if ignore_grad:
        loss *= 0
    with torch.autograd.profiler.record_function("backward"):
        optimizer.backward(loss)
    return loss, sample_size, logging_output