def METHOD_NAME(self):
    if self.global_step >= self.t_total:
        logger.warning(f'Warning, exceeded total steps! {self.global_step} step of {self.t_total}')
        return False
    if (self.step + 1) % self.hypers.gradient_accumulation_steps == 0:
        if self.hypers.max_grad_norm > 0:
            if self.hypers.fp16:
                torch.nn.utils.clip_grad_norm_(amp.master_params(self.optimizer), self.hypers.max_grad_norm)
            else:
                torch.nn.utils.clip_grad_norm_(self.model.parameters(), self.hypers.max_grad_norm)
        self.optimizer.step()
        self.scheduler.step()  # Update learning rate schedule
        self.model.zero_grad()
        self.global_step += 1
    self.step += 1
    if self.reporting.is_time():
        self.reporting.display()
        inst_count = self.hypers.world_size * self.hypers.n_gpu * self.hypers.per_gpu_train_batch_size * self.reporting.check_count
        learning_rate_scalar = self.scheduler.get_lr()[0]
        logger.info(f'{inst_count/self.reporting.elapsed_seconds()} instances per second; {inst_count} total ({learning_rate_scalar} learn rate)')
    return True