def METHOD_NAME(self):
    start = time.time()
    batch = self.read_batch()
    data_loader_time = time.time() - start
    self.optimizer.clear_grad()
    self.model.train()
    specs = batch
    loss, eer = self.model(specs, self.config.training.speakers_per_batch)
    loss.backward()
    self.model_core.do_gradient_ops()
    self.optimizer.step()
    iteration_time = time.time() - start
    # logging
    loss_value = float(loss)
    msg = "Rank: {}, ".format(dist.get_rank())
    msg += "step: {}, ".format(self.iteration)
    msg += "time: {:>.3f}s/{:>.3f}s, ".format(data_loader_time,
                                              iteration_time)
    msg += 'loss: {:>.6f} err: {:>.6f}'.format(loss_value, eer)
    self.logger.info(msg)
    if dist.get_rank() == 0:
        self.visualizer.add_scalar("train/loss", loss_value, self.iteration)
        self.visualizer.add_scalar("train/eer", eer, self.iteration)
        self.visualizer.add_scalar("param/w",
                                   float(self.model_core.similarity_weight),
                                   self.iteration)
        self.visualizer.add_scalar("param/b",
                                   float(self.model_core.similarity_bias),
                                   self.iteration)