code: def _initialize_pp_process_group(self) -> None:
      rank = self.get_global_rank()
      world_size = self.get_world_size()
  
      # build rpc connection
      options = rpc.TensorPipeRpcBackendOptions(
          num_worker_threads=self._num_worker_threads
      )
  
      for pp_rank in self._pp_ranks:
          options.set_device_map(f"work{pp_rank}", {rank: pp_rank})
  
      rpc.init_rpc(
          name=f"work{rank}",
          rank=rank,
          world_size=world_size,
          rpc_backend_options=options,
      )
  
imports: import threading
  from typing import List
  import torch.distributed
  from torch.distributed import rpc
  from colossalai.legacy.tensor import ProcessGroup
label_desc: Use image node_id 4 for calling the PipelineProcessGroup obj's underlying member method code with example usage: obj._initialize_pp_process_group() without return types