def METHOD_NAME(self, data, records={}, global_step=0, log_step=1000, **kwargs):
    """
    Args:
        data:
            [spec_masked, pos_enc, mask_label, attn_mask, spec_target]
        records:
            defaultdict(list), by appending contents into records,
            these contents can be averaged and logged on Tensorboard
            later by self.log_records every log_step
    Return:
        loss        
    """
    audio_feat, audio_len = data[0], data[1]
    audio_feat = audio_feat.to(self.device)
    # APC input = shifted target
    audio_len = [l-self.n_future for l in audio_len]
    pred_spec, _ = self.model(audio_feat[:,:-self.n_future,:], audio_len, testing=False)
    loss = self.loss(pred_spec, audio_feat[:,self.n_future:,:])
    if global_step % log_step == 0:
        spec_list = [pred_spec, audio_feat]
        name_list = ['pred_spec', 'true_spec']
        for i in range(len(spec_list)):
            spec = plot_spectrogram_to_numpy(spec_list[i][0].data.cpu().numpy())
            records[name_list[i]] = spec
    return loss, records