code: def train_one_step(self, data):
      if self.accumulation_steps == 1 and self.batch_index == 0:
          self.zero_grad()
      _, loss, metrics = self.model_fn(data)
      loss = loss / self.accumulation_steps
      if self.fp16:
          self.scaler.scale(loss).backward()
      else:
          loss.backward()
      if self.clip_grad_norm is not None:
          torch.nn.utils.clip_grad_norm_(
              self.parameters(), self.clip_grad_norm
          )
      if (self.batch_index + 1) % self.accumulation_steps == 0:
          if self.fp16:
              self.scaler.step(self.optimizer)
              self.scaler.update()
          else:
              if self.using_tpu:
                  xm.optimizer_step(self.optimizer, barrier=True)
              else:
                  self.optimizer.step()
          if self.scheduler:
              if self.step_scheduler_after == "batch":
                  if self.step_scheduler_metric is None:
                      self.scheduler.step()
                  else:
                      step_metric = self.name_to_metric(
                          self.step_scheduler_metric
                      )
                      self.scheduler.step(step_metric)
          if self.batch_index > 0:
              self.zero_grad()
      return loss, metrics
  
imports: import warnings
  import psutil
  import torch
  import torch.nn
  from tqdm import tqdm
  from tez import enums
  from tez.callbacks import CallbackRunner
  from tez.utils import AverageMeter
label_desc: Use image node_id 14 for calling the Model obj's underlying member method code with example usage: obj.train_one_step(data) and returns: loss,  metrics