code: def train_loop(
      parser,
      start_program,
      main_program,
      test_program,
      model,
      graph,
      label,
      split_idx,
      exe,
      run_id,
      wf=None,
  ):
      exe.run(start_program)
      max_acc = 0
      max_step = 0
      max_val_acc = 0
      max_cor_acc = 0
      max_cor_step = 0
  
      for epoch_id in tqdm(range(parser.epochs)):
          if parser.use_label_e:
              feed_dict = model.gw.to_feed(graph)
              train_idx_temp = split_idx["train"]
              np.random.shuffle(train_idx_temp)
              label_idx = train_idx_temp[
                  : int(parser.label_rate * len(train_idx_temp))
              ]
              unlabel_idx = train_idx_temp[
                  int(parser.label_rate * len(train_idx_temp)) :
              ]
              feed_dict["label"] = label
              feed_dict["label_idx"] = label_idx
              feed_dict["train_idx"] = unlabel_idx
              feed_dict["attn_drop"] = parser.attn_dropout
          else:
              feed_dict = model.gw.to_feed(graph)
              feed_dict["label"] = label
              feed_dict["train_idx"] = split_idx["train"]
  
          loss = exe.run(
              main_program, feed=feed_dict, fetch_list=[model.avg_cost]
          )
          loss = loss[0]
  
          result = eval_test(
              parser, test_program, model, exe, graph, label, split_idx
          )
          train_acc, valid_acc, test_acc = result
  
          max_val_acc = max(valid_acc, max_val_acc)
          if max_val_acc == valid_acc:
              max_cor_acc = test_acc
              max_cor_step = epoch_id
  
          if max_acc == result[2]:
              max_step = epoch_id
          result_t = (
              f"Run: {run_id:02d}, "
              f"Epoch: {epoch_id:02d}, "
              f"Loss: {loss[0]:.4f}, "
              f"Train: {100 * train_acc:.2f}%, "
              f"Valid: {100 * valid_acc:.2f}%, "
              f"Test: {100 * test_acc:.2f}% \n"
              f"max_val: {100 * max_val_acc:.2f}%, "
              f"max_val_Test: {100 * max_cor_acc:.2f}%, "
              f"max_val_step: {max_cor_step}\n"
          )
          if (epoch_id + 1) % 100 == 0:
              print(result_t)
              wf.write(result_t)
              wf.write("\n")
              wf.flush()
      return max_cor_acc
  
file_path: PGL/ogb_examples/nodeproppred/unimp/main_arxiv_large.py
imports: import math
  import torch
  import paddle
  import pgl
  import numpy
  import paddle.fluid
  import paddle.fluid.layers
  from pgl.contrib.ogb.nodeproppred.dataset_pgl import PglNodePropPredDataset
  from ogb.nodeproppred import Evaluator
  from utils import to_undirected, add_self_loop, linear_warmup_decay
  from model_large import Arxiv_baseline_model, Arxiv_label_embedding_model
  import argparse
  from tqdm import tqdm
label_desc: Use image node_id 4 for calling a global function with example usage: train_loop(parser, start_program, main_program, test_program, model, graph, label, split_idx, exe, run_id, wf) and returns: max_cor_acc