class_docstr: Ray resources required to schedule a trial.
  
  Parameters:
      cpu: Number of CPUs to allocate to the trial.
      gpu: Number of GPUs to allocate to the trial.
      memory: Memory to reserve for the trial.
      object_store_memory: Object store memory to reserve.
      extra_cpu: Extra CPUs to reserve in case the trial needs to
          launch additional Ray actors that use CPUs.
      extra_gpu: Extra GPUs to reserve in case the trial needs to
          launch additional Ray actors that use GPUs.
      extra_memory: Memory to reserve for the trial launching
          additional Ray actors that use memory.
      extra_object_store_memory: Object store memory to reserve for
          the trial launching additional Ray actors that use object store
          memory.
      custom_resources: Mapping of resource to quantity to allocate
          to the trial.
      extra_custom_resources: Extra custom resources to reserve in
          case the trial needs to launch additional Ray actors that use
          any of these custom resources.
      has_placement_group: Bool indicating if the trial also
          has an associated placement group.
code: def summary_string(self):
      summary = "{} CPUs, {} GPUs".format(
          self.cpu + self.extra_cpu, self.gpu + self.extra_gpu
      )
      if self.memory or self.extra_memory:
          summary += ", {} GiB heap".format(
              round((self.memory + self.extra_memory) / (1024**3), 2)
          )
      if self.object_store_memory or self.extra_object_store_memory:
          summary += ", {} GiB objects".format(
              round(
                  (
                      self.object_store_memory
                      + self.extra_object_store_memory
                  )
                  / (1024**3),
                  2,
              )
          )
      custom_summary = ", ".join(
          [
              "{} {}".format(self.get_res_total(res), res)
              for res in self.custom_resources
              if not res.startswith(NODE_ID_PREFIX)
          ]
      )
      if custom_summary:
          summary += " ({})".format(custom_summary)
      return summary
  
imports: import logging
  import os
  import time
  from collections import namedtuple
  from numbers import Number
  from typing import Any, Dict, Optional
  import ray
  from ray._private.resource_spec import NODE_ID_PREFIX
label_desc: Use image node_id 2 for calling the _Resources obj's underlying member method code with example usage: obj.summary_string() and returns: summary