code: def create_trainer(self):
      try:
          lr_per_sample = cntk.learning_parameter_schedule_per_sample(
              0.007
          )
          p = self.output.parameters
          # Three of four parameters are learned by first data_parallel_distributed_learner.
          learner1 = cntk.data_parallel_distributed_learner(
              cntk.sgd([p[0], p[1], p[2]], lr_per_sample)
          )
  
          # New API to mark which learner is to use for metric aggregaion.
          learner1.set_as_metric_aggregator()
  
          # The last parameter is learned by another data_parallel_distributed_learner.
          learner2 = cntk.data_parallel_distributed_learner(
              cntk.sgd([p[3]], lr_per_sample)
          )
  
          comm_rank = cntk.distributed.Communicator.rank()
          self.trainer = cntk.Trainer(
              self.output,
              (self.ce, self.err),
              [learner1, learner2],
              [
                  cntk.logging.ProgressPrinter(
                      freq=progress_freq, tag="Training", rank=comm_rank
                  )
              ],
          )
      except RuntimeError:
          self.trainer = None
      return
  
imports: import pytest
  import cntk
  import numpy
  import sys, os
  import argparse
  import re
  import platform
  from distributed_learner_test import mpiexec_execute
  from bmuf_metrics_aggregation_test import get_minibatch
label_desc: Use image node_id 2 for calling the TwoDataParallelTrainer obj's underlying member method code with example usage: obj.create_trainer() without return types