code: def train_graph(self):
      train_graph = TrainGraph(
          self.train_module,
          self.cfg,
          self.margin_softmax,
          self.of_cross_entropy,
          self.train_data_loader,
          self.optimizer,
          self.scheduler,
      )
      # train_graph.debug()
      val_graph = EvalGraph(self.backbone, self.cfg)
  
      for epoch in range(self.start_epoch, self.cfg.num_epoch):
          self.train_module.train()
          one_epoch_steps = len(self.train_data_loader)
          for steps in range(one_epoch_steps):
              self.global_step += 1
              loss = train_graph()
              loss = (
                  loss.to_consistent(sbp=flow.sbp.broadcast)
                  .to_local()
                  .numpy()
              )
              self.losses.update(loss, 1)
              self.callback_logging(
                  self.global_step,
                  self.losses,
                  epoch,
                  False,
                  self.scheduler.get_last_lr()[0],
              )
              self.callback_verification(
                  self.global_step, self.train_module, val_graph
              )
          self.callback_checkpoint(
              self.global_step,
              epoch,
              self.train_module,
              is_consistent=True,
          )
  
imports: import oneflow
  from oneflow.nn.parallel import DistributedDataParallel
  from utils.ofrecord_data_utils import OFRecordDataLoader, SyntheticDataLoader
  from utils.utils_logging import AverageMeter
  from utils.utils_callbacks import CallBackVerification, CallBackLogging, CallBackModelCheckpoint
  from backbones import get_model
  from graph import TrainGraph, EvalGraph
  from utils.losses import CrossEntropyLoss_sbp
  import logging
label_desc: Use image node_id 5 for calling the Trainer obj's underlying member method code with example usage: obj.train_graph() without return types