code: def test_bottleneck_with_peer_memory(self) -> None:
      explicit_nhwc: bool = True
      dtype: torch.dtype = torch.float16
      N, C, H, W = 1, 64, 200, 336
      Hs = ((H + 8 * self.world_size - 1) // (8 * self.world_size)) * 8
      H = Hs * self.world_size
  
      gt_bottleneck = ground_truth_bottleneck(C, dtype, explicit_nhwc)
      gt = ground_truth(N, C, H, W, dtype, 1, gt_bottleneck)
  
      group = self.rank // self.world_size
      ranks = [
          group * self.world_size + i for i in range(self.world_size)
      ]
      rank_in_group = self.rank % self.world_size
  
      spatial_group_size, spatial_communicator = self.world_size, None
      peer_pool = PeerMemoryPool(0, 64 * 1024 * 1024, ranks)
      halo_exchanger_peer = HaloExchangerPeer(
          ranks, rank_in_group, peer_pool, explicit_nhwc, numSM=0
      )
      bt2 = n_way_spatial(
          halo_exchanger_peer,
          gt_bottleneck,
          gt,
          explicit_nhwc,
          self.world_size,
          self.rank,
          fp32_reduce=True,
      )
  
imports: import unittest
  import torch
  from torch.testing._internal import common_utils
  from apex.transformer.testing.distributed_test_base import NcclDistributedTestBase
label_desc: Use image node_id 3 for calling the TestBottleneck obj's underlying member method code with example usage: obj.test_bottleneck_with_peer_memory() without return types