class_docstr: The abstract sparse optimizer.
  
  Note: dgl sparse optimizer only work with dgl.NodeEmbedding
  
  Parameters
  ----------
  params : list of NodeEmbedding
      The list of NodeEmbeddings.
  lr : float
      The learning rate.
code: def _shared_setup(self):
      for emb in self._params:
          emb_name = emb.name
          if self._rank == 0:  # the master gpu process
              opt_meta = create_shared_mem_array(
                  emb_name + "_opt_meta",
                  (self._world_size, self._world_size),
                  th.int32,
              ).zero_()
  
          if self._rank == 0:
              emb.store.set(emb_name + "_opt_meta", emb_name)
              self._opt_meta[emb_name] = opt_meta
          elif self._rank > 0:
              # receive
              emb.store.wait([emb_name + "_opt_meta"])
              opt_meta = get_shared_mem_array(
                  emb_name + "_opt_meta",
                  (self._world_size, self._world_size),
                  th.int32,
              )
              self._opt_meta[emb_name] = opt_meta
  
imports: import abc
  from abc import abstractmethod
  import torch
  from ...cuda import nccl
  from ...nn.pytorch import NodeEmbedding
  from ...partition import NDArrayPartition
  from ...utils import create_shared_mem_array, gather_pinned_tensor_rows, get_shared_mem_array, pin_memory_inplace, scatter_pinned_tensor_rows
label_desc: Use image node_id 5 for calling the SparseGradOptimizer obj's underlying member method code with example usage: obj._shared_setup() without return types