class_docstr: Base class for table wise sharding.
class_docstr_tok: ["Base","class","for","table","wise","sharding","."]
code: def feature_names_per_rank(self) -> List[List[str]]:
      feature_names = []
      for (
          grouped_embedding_configs
      ) in self._grouped_embedding_configs_per_rank:
          feature_names_per_rank = []
          for grouped_config in grouped_embedding_configs:
              feature_names_per_rank.extend(
                  grouped_config.feature_names()
              )
          feature_names.append(feature_names_per_rank)
      return feature_names
  
imports: from typing import Any, Callable, cast, Dict, List, Optional, TypeVar, Union
  import torch
  import torch.distributed
  from torchrec.distributed.dist_data import EmbeddingsAllToOne, KJTAllToAll, KJTOneToAll, PooledEmbeddingsAllToAll, VariableBatchPooledEmbeddingsAllToAll
  from torchrec.distributed.embedding_lookup import GroupedPooledEmbeddingsLookup, InferGroupedPooledEmbeddingsLookup
  from torchrec.distributed.embedding_sharding import BaseEmbeddingDist, BaseEmbeddingLookup, BaseSparseFeaturesDist, EmbeddingSharding, EmbeddingShardingContext, EmbeddingShardingInfo, group_tables
  from torchrec.distributed.embedding_types import BaseGroupedFeatureProcessor, EmbeddingComputeKernel, GroupedEmbeddingConfig, KJTList, ShardedEmbeddingTable
  from torchrec.distributed.types import Awaitable, CommOp, NullShardingContext, QuantizedCommCodecs, ShardedTensorMetadata, ShardingEnv, ShardMetadata
  from torchrec.sparse.jagged_tensor import KeyedJaggedTensor
  from torchrec.streamable import Multistreamable
label_desc: Use image node_id 11 for calling the BaseTwEmbeddingSharding obj's underlying member method code with example usage: obj.feature_names_per_rank() and returns: feature_names