code: def create_output_dist(
      self,
      device: Optional[torch.device] = None,
  ) -> BaseEmbeddingDist[
      NullShardingContext, List[torch.Tensor], torch.Tensor
  ]:
      device = device if device is not None else self._device
      assert device is not None
  
      dist_out = InferCwPooledEmbeddingDist(
          device,
          self._world_size,
      )
  
      if self._permute_embeddings and self._embedding_order != list(
          range(len(self._embedding_order))
      ):
          return InferCwPooledEmbeddingDistWithPermute(
              device,
              self._world_size,
              self._embedding_dims,
              self._embedding_order,
          )
  
      return dist_out
  
imports: from typing import Any, Callable, Dict, List, Optional, Set, Tuple, TypeVar
  import torch
  import torch.distributed
  from fbgemm_gpu.permute_pooled_embedding_modules_split import PermutePooledEmbeddingsSplit
  from torchrec.distributed.dist_data import EmbeddingsAllToOne
  from torchrec.distributed.embedding_lookup import GroupedPooledEmbeddingsLookup, InferGroupedPooledEmbeddingsLookup
  from torchrec.distributed.embedding_sharding import BaseEmbeddingDist, BaseEmbeddingLookup, BaseSparseFeaturesDist, EmbeddingShardingContext, EmbeddingShardingInfo
  from torchrec.distributed.embedding_types import BaseGroupedFeatureProcessor, EmbeddingComputeKernel, KJTList, ShardedEmbeddingTable
  from torchrec.distributed.sharding.tw_sharding import BaseTwEmbeddingSharding, InferTwSparseFeaturesDist, TwPooledEmbeddingDist, TwSparseFeaturesDist
  from torchrec.distributed.types import NullShardingContext, QuantizedCommCodecs, ShardedTensorMetadata, ShardingEnv, ShardMetadata
  from torchrec.sparse.jagged_tensor import KeyedJaggedTensor
  from torchrec.streamable import Multistreamable
label_desc: Use image node_id 3 for calling the InferCwPooledEmbeddingSharding obj's underlying member method code with example usage: obj.create_output_dist(device) and returns: dist_out, InferCwPooledEmbeddingDistWithPermute