code: def start(self, f, carrier=None):
      if carrier is None:
          carrier = {}
      for rank in range(self.world_size):
          process_name = "process " + str(rank)
          output_or_exception_q = self.output_or_exception_q
          safe_to_exit = self.safe_to_exit
          width = self.console.width
          argv = sys.argv.copy()
          argv.extend(["--rank", str(rank)])
          process = multiprocessing.Process(
              target=self.__class__._run_process,
              name=process_name,
              args=(
                  carrier,
                  output_or_exception_q,
                  safe_to_exit,
                  width,
                  self.federation_session_id,
                  argv,
                  f,
              ),
          )
          self.processes.append(process)
  
      from fate.arch.protocol import mpc
  
      # TODO: not work for now, need to fix
      if mpc.ttp_required():
          ttp_process = multiprocessing.Process(
              target=self.__class__._run_ttp_server,
              name="TTP",
              args=(self.world_size,),
          )
          self.processes.append(ttp_process)
  
      for process in self.processes:
          process.start()
  
imports: import datetime
  import logging
  import multiprocessing
  import signal
  import sys
  import time
  import uuid
  from argparse import Namespace
  from dataclasses import dataclass, field
  from multiprocessing import Queue, Event
  from typing import List
  import rich
  import rich.console
  import rich.panel
  import rich.traceback
  from fate.arch import trace
  from .argparser import HfArgumentParser
label_desc: Use image node_id 2 for calling the MultiProcessLauncher obj's underlying member method code with example usage: obj.start(f, carrier) without return types