code: def save(self):
      if self._ps_collection is None:
          return
      for i, transformer in enumerate(self._transformers):
          table_name = self._table_names[i]
          if dist.get_world_size() > 1:
              if dist.get_rank() == 0:
                  ids = transformer.save()
                  numel = torch.tensor(ids.numel())
                  dist.broadcast(numel, src=0, group=self._pg)
                  dist.broadcast(ids, src=0, group=self._pg)
              else:
                  numel = torch.tensor(0)
                  dist.broadcast(numel, src=0, group=self._pg)
                  ids = torch.empty((numel // 2, 2), dtype=torch.int64)
                  dist.broadcast(ids, src=0, group=self._pg)
          else:
              ids = transformer.save()
  
          self._ps_collection[table_name].evict(ids)
  
file_path: torchrec/contrib/dynamic_embedding/src/torchrec_dynamic_embedding/id_transformer_collection.py
imports: from typing import List, Tuple, Union
  import torch
  import torch.distributed
  from torchrec import EmbeddingBagConfig, EmbeddingConfig, KeyedJaggedTensor
  from .distributed import broadcast_ids_to_evict, broadcast_transform_result, gather_global_ids, scatter_cache_ids
  from .id_transformer import IDTransformer, TensorList
  from .ps import PSCollection
label_desc: Use image node_id 4 for calling the IDTransformerCollection obj's underlying member method code with example usage: obj.save() without return types