class_docstr: Storage for node/edge feature data.
docstr: Fetch the features of the given node/edge IDs to the
  given device.
  
  Parameters
  ----------
  indices : Tensor
      Node or edge IDs.
  device : Device
      Device context.
  pin_memory :
  
  Returns
  -------
  Tensor
      Feature data stored in PyTorch Tensor.
docstr_tok: ["Fetch","the","features","of","the","given","node\/edge","IDs","to","the","given","device",".","Parameters","--","--","--","--","--","indices",":","Tensor","Node","or","edge","IDs",".","device",":","Device","Device","context",".","pin_memory",":","Returns","--","--","--","-","Tensor","Feature","data","stored","in","PyTorch","Tensor","."]
code: def fetch(self, indices, device=None, pin_memory=False, **kwargs):
      """Fetch the features of the given node/edge IDs to the
      given device.
  
      Parameters
      ----------
      indices : Tensor
          Node or edge IDs.
      device : Device
          Device context.
      pin_memory :
  
      Returns
      -------
      Tensor
          Feature data stored in PyTorch Tensor.
      """
      # Default implementation uses synchronous fetch.
  
      # Handle remote case
      if type(self.pg).__name__ in [
          "RemotePropertyGraph",
          "RemoteMGPropertyGraph",
      ]:
          indices = _convert_ar_to_numpy(indices)
          indices = indices + self.indices_offset
          # TODO: Raise Issue
          # We dont support numpy arrays in get_vertex_data, get_edge_data
          # for Remote  Graphs
          indices = indices.tolist()
      else:
          # For local case
          # we rely on cupy to handle various inputs cleanly like  GPU Tensor,
          # cupy array, cudf Series, cpu tensor etc
          import cupy as cp
  
          indices = cp.asarray(indices)
          indices = indices + self.indices_offset
  
      if self.storage_type == "node":
          result = self.pg.get_vertex_data(
              vertex_ids=indices,
              columns=[self.column],
              types=self.types_to_fetch,
          )
      else:
          result = self.pg.get_edge_data(
              edge_ids=indices,
              columns=[self.column],
              types=self.types_to_fetch,
          )
  
      if type(result).__name__ == "DataFrame":
          if _is_vector_feature(result[self.column]):
              if self.storage_type == "node":
                  result = self.pg.vertex_vector_property_to_array(
                      result, self.column
                  )
              else:
                  result = self.pg.edge_vector_property_to_array(
                      result, self.column
                  )
              if result.ndim == 2 and result.shape[1] == 1:
                  result = result.squeeze(1)
          else:
              result = result[self.column].values
  
          if hasattr(result, "compute"):
              result = result.compute()
          if len(result) == 0:
              raise ValueError(
                  f"{indices=} not found in FeatureStorage"
              )
          cap = result.toDlpack()
      else:
          # When backend is not dataframe(pandas, cuDF) we return lists
          result = result[self.column]
          cap = _convert_ar_to_numpy(result)
  
      if type(cap).__name__ == "PyCapsule":
          tensor = self.from_dlpack(cap)
          del cap
      else:
          tensor = cap
      if device:
          if type(tensor).__module__ == "torch":
              # Can only transfer to different device for pytorch
              tensor = tensor.to(device)
      return tensor
  
imports: import numpy
label_desc: Use image node_id 2 for calling the CuFeatureStorage obj's underlying member method code with example usage: obj.fetch(indices, device, pin_memory) and returns: tensor