code: def track_time(feat_size, num_relations, multi_reduce_type):
      device = utils.get_bench_device()
      dd = {}
      candidate_edges = [
          dgl.data.CoraGraphDataset(verbose=False)[0].edges(),
          dgl.data.PubmedGraphDataset(verbose=False)[0].edges(),
          dgl.data.CiteseerGraphDataset(verbose=False)[0].edges(),
      ]
      for i in range(num_relations):
          dd[("n1", "e_{}".format(i), "n2")] = candidate_edges[
              i % len(candidate_edges)
          ]
      graph = dgl.heterograph(dd)
  
      graph = graph.to(device)
      graph.nodes["n1"].data["h"] = torch.randn(
          (graph.num_nodes("n1"), feat_size), device=device
      )
      graph.nodes["n2"].data["h"] = torch.randn(
          (graph.num_nodes("n2"), feat_size), device=device
      )
  
      # dry run
      update_dict = {}
      for i in range(num_relations):
          update_dict["e_{}".format(i)] = (
              fn.copy_u("h", "m"),
              fn.sum("m", "h"),
          )
      graph.multi_update_all(update_dict, multi_reduce_type)
  
      # timing
  
      with utils.Timer() as t:
          for i in range(3):
              graph.multi_update_all(update_dict, multi_reduce_type)
  
      return t.elapsed_secs / 3
  
imports: import time
  import dgl
  import dgl.function
  import numpy
  import torch
  from ..None import utils
label_desc: Use image node_id 1 for calling a global function with example usage: track_time(feat_size, num_relations, multi_reduce_type) and returns: unknown