code: def custom_operator_profiling_multiple_custom_ops(
      seed, mode, file_name
  ):
      class MyAdd(mx.operator.CustomOp):
          def forward(self, is_train, req, in_data, out_data, aux):
              self.assign(out_data[0], req[0], in_data[0] + 1)
  
          def backward(
              self, req, out_grad, in_data, out_data, in_grad, aux
          ):
              self.assign(in_grad[0], req[0], out_grad[0])
  
      @mx.operator.register("MyAdd1")
      class MyAdd1Prop(mx.operator.CustomOpProp):
          def __init__(self):
              super(MyAdd1Prop, self).__init__(need_top_grad=True)
  
          def list_arguments(self):
              return ["data"]
  
          def list_outputs(self):
              return ["output"]
  
          def infer_shape(self, in_shape):
              # inputs, outputs, aux
              return [in_shape[0]], [in_shape[0]], []
  
          def create_operator(self, ctx, shapes, dtypes):
              return MyAdd()
  
      @mx.operator.register("MyAdd2")
      class MyAdd2Prop(mx.operator.CustomOpProp):
          def __init__(self):
              super(MyAdd2Prop, self).__init__(need_top_grad=True)
  
          def list_arguments(self):
              return ["data"]
  
          def list_outputs(self):
              return ["output"]
  
          def infer_shape(self, in_shape):
              # inputs, outputs, aux
              return [in_shape[0]], [in_shape[0]], []
  
          def create_operator(self, ctx, shapes, dtypes):
              return MyAdd()
  
      enable_profiler(
          profile_filename=file_name,
          run=True,
          continuous_dump=True,
          aggregate_stats=True,
      )
      # clear aggregate stats
      profiler.dumps(reset=True)
      inp = mx.nd.zeros(shape=(100, 100))
      if mode == "imperative":
          y = mx.nd.Custom(inp, op_type="MyAdd1")
          z = mx.nd.Custom(inp, op_type="MyAdd2")
      elif mode == "symbolic":
          a = mx.symbol.Variable("a")
          b = mx.symbol.Custom(data=a, op_type="MyAdd1")
          c = mx.symbol.Custom(data=a, op_type="MyAdd2")
          y = b._bind(mx.cpu(), {"a": inp})
          z = c._bind(mx.cpu(), {"a": inp})
          yy = y.forward()
          zz = z.forward()
      mx.nd.waitall()
      profiler.dump(False)
      debug_str = profiler.dumps(format="json")
      check_custom_operator_profiling_multiple_custom_ops_output(
          debug_str
      )
      profiler.set_state("stop")
  
imports: from __future__ import print_function
  import time
  import os
  import csv
  import json
  import numpy
  from collections import OrderedDict
  import mxnet
  from mxnet import profiler
  from mxnet.gluon import nn
  from mxnet.test_utils import is_cd_run
  from common import run_in_spawned_process
  import pytest
label_desc: Use image node_id 16 for calling a global function with example usage: custom_operator_profiling_multiple_custom_ops(seed, mode, file_name) and returns: list, list, list,  list,  list, MyAdd, list, list, list,  list,  list, MyAdd