code: def load(
      self,
      search_space: List[ShardingOption],
      enumerator: Optional[Enumerator] = None,
  ) -> None:
      self.enumerator = enumerator
      sharding_options_by_fqn: Dict[str, List[ShardingOption]] = {}
      for sharding_option in search_space:
          sharding_options_by_fqn.setdefault(
              sharding_option.fqn, []
          ).append(sharding_option)
      for sharding_options in sharding_options_by_fqn.values():
          sharding_options.sort(
              key=lambda x: _sharding_option_score(x, self.use_depth)
          )
      # currently only use 1st sharding option for proposal only.
      # TODO: could traverse through multiple options like GreedyProposer
      proposal = [
          sharding_options[0]
          for sharding_options in sharding_options_by_fqn.values()
      ]
      # deepcopy so it won't affect other proposers
      self.starting_proposal = copy.deepcopy(proposal)
      self.proposal = copy.deepcopy(self.starting_proposal)
  
imports: import copy
  import itertools
  import logging
  from decimal import Decimal
  from typing import cast, Dict, List, Optional, Set, Tuple, Union
  import torch
  from torchrec.distributed.embedding_types import EmbeddingComputeKernel
  from torchrec.distributed.planner.types import Enumerator, Perf, Proposer, ShardingOption, Topology
  from torchrec.distributed.planner.utils import BinarySearchPredicate, bytes_to_gb, prod
label_desc: Use image node_id 2 for calling the EmbeddingOffloadScaleupProposer obj's underlying member method code with example usage: obj.load(search_space, enumerator) without return types