class_docstr: Processes the sparse features of DLRM. Does embedding lookups for all EmbeddingBag
  and embedding features of each collection.
  
  Args:
      embedding_bag_collection (EmbeddingBagCollection): represents a collection of
          pooled embeddings.
  
  Example::
  
      eb1_config = EmbeddingBagConfig(
         name="t1", embedding_dim=3, num_embeddings=10, feature_names=["f1"]
      )
      eb2_config = EmbeddingBagConfig(
         name="t2", embedding_dim=4, num_embeddings=10, feature_names=["f2"]
      )
  
      ebc = EmbeddingBagCollection(tables=[eb1_config, eb2_config])
      sparse_arch = SparseArch(embedding_bag_collection)
  
      #     0       1        2  <-- batch
      # 0   [0,1] None    [2]
      # 1   [3]    [4]    [5,6,7]
      # ^
      # feature
      features = KeyedJaggedTensor.from_offsets_sync(
         keys=["f1", "f2"],
         values=torch.tensor([0, 1, 2, 3, 4, 5, 6, 7]),
         offsets=torch.tensor([0, 2, 2, 3, 4, 5, 8]),
      )
  
      sparse_embeddings = sparse_arch(features)
class_docstr_tok: ["Processes","the","sparse","features","of","DLRM",".","Does","embedding","lookups","for","all","EmbeddingBag","and","embedding","features","of","each","collection",".","Args",":","embedding_bag_collection","(","EmbeddingBagCollection",")",":","represents","a","collection","of","pooled","embeddings",".","Example",":",":","eb1_config","=","EmbeddingBagConfig","(","name=","''","t1","''",",","embedding_dim=3",",","num_embeddings=10",",","feature_names=","[","``","f1","''","]",")","eb2_config","=","EmbeddingBagConfig","(","name=","''","t2","''",",","embedding_dim=4",",","num_embeddings=10",",","feature_names=","[","``","f2","''","]",")","ebc","=","EmbeddingBagCollection","(","tables=","[","eb1_config",",","eb2_config","]",")","sparse_arch","=","SparseArch","(","embedding_bag_collection",")","#","0","1","2","<","--","batch","#","0","[","0,1","]","None","[","2","]","#","1","[","3","]","[","4","]","[","5,6,7","]","#","^","#","feature","features","=","KeyedJaggedTensor.from_offsets_sync","(","keys=","[","``","f1","''",",","``","f2","''","]",",","values=torch.tensor","(","[","0",",","1",",","2",",","3",",","4",",","5",",","6",",","7","]",")",",","offsets=torch.tensor","(","[","0",",","2",",","2",",","3",",","4",",","5",",","8","]",")",",",")","sparse_embeddings","=","sparse_arch","(","features",")"]
code: def sparse_feature_names(self) -> List[str]:
      return self._sparse_feature_names
  
imports: from typing import Dict, List, Optional, Tuple
  import torch
  from torch import nn
  from torchrec.datasets.utils import Batch
  from torchrec.modules.crossnet import LowRankCrossNet
  from torchrec.modules.embedding_modules import EmbeddingBagCollection
  from torchrec.modules.mlp import MLP
  from torchrec.sparse.jagged_tensor import KeyedJaggedTensor, KeyedTensor
label_desc: Use image node_id 3 for calling the SparseArch obj's underlying member method code with example usage: obj.sparse_feature_names() and returns: self