class_docstr: A class for managing Neptune experiment.
  
  Each time User creates new experiment instance of this class is created.
  It lets you manage experiment, :meth:`~neptune.experiments.Experiment.log_metric`,
  :meth:`~neptune.experiments.Experiment.log_text`,
  :meth:`~neptune.experiments.Experiment.log_image`,
  :meth:`~neptune.experiments.Experiment.set_property`,
  and much more.
  
  
  Args:
      backend (:obj:`neptune.ApiClient`): A ApiClient object
      project (:obj:`neptune.Project`): The project this experiment belongs to
      _id (:obj:`str`): Experiment id
      internal_id (:obj:`str`): internal ID
  
  Example:
      Assuming that `project` is an instance of :class:`~neptune.projects.Project`.
  
      .. code:: python3
  
          experiment = project.create_experiment()
  
  Warning:
      User should never create instances of this class manually.
      Always use: :meth:`~neptune.projects.Project.create_experiment`.
class_docstr_tok: ["A","class","for","managing","Neptune","experiment",".","Each","time","User","creates","new","experiment","instance","of","this","class","is","created",".","It","lets","you","manage","experiment",",",":","meth",":","`","~neptune.experiments.Experiment.log_metric","`",",",":","meth",":","`","~neptune.experiments.Experiment.log_text","`",",",":","meth",":","`","~neptune.experiments.Experiment.log_image","`",",",":","meth",":","`","~neptune.experiments.Experiment.set_property","`",",","and","much","more",".","Args",":","backend","(",":","obj",":","`","neptune.ApiClient","`",")",":","A","ApiClient","object","project","(",":","obj",":","`","neptune.Project","`",")",":","The","project","this","experiment","belongs","to","_id","(",":","obj",":","`","str","`",")",":","Experiment","id","internal_id","(",":","obj",":","`","str","`",")",":","internal","ID","Example",":","Assuming","that","`","project","`","is","an","instance","of",":","class",":","`","~neptune.projects.Project","`",".","..","code",":",":","python3","experiment","=","project.create_experiment","(",")","Warning",":","User","should","never","create","instances","of","this","class","manually",".","Always","use",":",":","meth",":","`","~neptune.projects.Project.create_experiment","`","."]
docstr: Retrieve GPU, CPU and memory utilization data.
  
  Get hardware utilization metrics for entire experiment as a single
  `pandas.DataFrame <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`_
  object. Returned DataFrame has following columns (assuming single GPU with 0 index):
  
      * `x_ram` - time (in milliseconds) from the experiment start,
      * `y_ram` - memory usage in GB,
      * `x_cpu` - time (in milliseconds) from the experiment start,
      * `y_cpu` - CPU utilization percentage (0-100),
      * `x_gpu_util_0` - time (in milliseconds) from the experiment start,
      * `y_gpu_util_0` - GPU utilization percentage (0-100),
      * `x_gpu_mem_0` - time (in milliseconds) from the experiment start,
      * `y_gpu_mem_0` - GPU memory usage in GB.
  
  | If more GPUs are available they have their separate columns with appropriate indices (0, 1, 2, ...),
    for example: `x_gpu_util_1`, `y_gpu_util_1`.
  | The returned DataFrame may contain ``NaN`` s if one of the metrics has more values than others.
  
  Returns:
      :obj:`pandas.DataFrame` - DataFrame containing the hardware utilization metrics.
  
  Examples:
      The following values denote that after 3 seconds, the experiment used 16.7 GB of RAM
  
          * `x_ram` = 3000
          * `y_ram` = 16.7
  
      Assuming that `experiment` is an instance of :class:`~neptune.experiments.Experiment`:
  
      .. code:: python3
  
          hardware_df = experiment.get_hardware_utilization()
docstr_tok: ["Retrieve","GPU",",","CPU","and","memory","utilization","data",".","Get","hardware","utilization","metrics","for","entire","experiment","as","a","single","`","pandas.DataFrame","<","https",":","\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.DataFrame.html",">","`","_","object",".","Returned","DataFrame","has","following","columns","(","assuming","single","GPU","with","0","index",")",":","*","`","x_ram","`","-","time","(","in","milliseconds",")","from","the","experiment","start",",","*","`","y_ram","`","-","memory","usage","in","GB",",","*","`","x_cpu","`","-","time","(","in","milliseconds",")","from","the","experiment","start",",","*","`","y_cpu","`","-","CPU","utilization","percentage","(","0-100",")",",","*","`","x_gpu_util_0","`","-","time","(","in","milliseconds",")","from","the","experiment","start",",","*","`","y_gpu_util_0","`","-","GPU","utilization","percentage","(","0-100",")",",","*","`","x_gpu_mem_0","`","-","time","(","in","milliseconds",")","from","the","experiment","start",",","*","`","y_gpu_mem_0","`","-","GPU","memory","usage","in","GB",".","|","If","more","GPUs","are","available","they","have","their","separate","columns","with","appropriate","indices","(","0",",","1",",","2",",","...",")",",","for","example",":","`","x_gpu_util_1","`",",","`","y_gpu_util_1","`",".","|","The","returned","DataFrame","may","contain","``","NaN","``","s","if","one","of","the","metrics","has","more","values","than","others",".","Returns",":",":","obj",":","`","pandas.DataFrame","`","-","DataFrame","containing","the","hardware","utilization","metrics",".","Examples",":","The","following","values","denote","that","after","3","seconds",",","the","experiment","used","16.7","GB","of","RAM","*","`","x_ram","`","=","3000","*","`","y_ram","`","=","16.7","Assuming","that","`","experiment","`","is","an","instance","of",":","class",":","`","~neptune.experiments.Experiment","`",":","..","code",":",":","python3","hardware_df","=","experiment.get_hardware_utilization","(",")"]
code: def get_hardware_utilization(self):
      """Retrieve GPU, CPU and memory utilization data.
  
      Get hardware utilization metrics for entire experiment as a single
      `pandas.DataFrame <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`_
      object. Returned DataFrame has following columns (assuming single GPU with 0 index):
  
          * `x_ram` - time (in milliseconds) from the experiment start,
          * `y_ram` - memory usage in GB,
          * `x_cpu` - time (in milliseconds) from the experiment start,
          * `y_cpu` - CPU utilization percentage (0-100),
          * `x_gpu_util_0` - time (in milliseconds) from the experiment start,
          * `y_gpu_util_0` - GPU utilization percentage (0-100),
          * `x_gpu_mem_0` - time (in milliseconds) from the experiment start,
          * `y_gpu_mem_0` - GPU memory usage in GB.
  
      | If more GPUs are available they have their separate columns with appropriate indices (0, 1, 2, ...),
        for example: `x_gpu_util_1`, `y_gpu_util_1`.
      | The returned DataFrame may contain ``NaN`` s if one of the metrics has more values than others.
  
      Returns:
          :obj:`pandas.DataFrame` - DataFrame containing the hardware utilization metrics.
  
      Examples:
          The following values denote that after 3 seconds, the experiment used 16.7 GB of RAM
  
              * `x_ram` = 3000
              * `y_ram` = 16.7
  
          Assuming that `experiment` is an instance of :class:`~neptune.experiments.Experiment`:
  
          .. code:: python3
  
              hardware_df = experiment.get_hardware_utilization()
      """
      metrics_csv = self._backend.get_metrics_csv(self)
      try:
          return pd.read_csv(metrics_csv)
      except EmptyDataError:
          return pd.DataFrame()
  
imports: import base64
  import logging
  import traceback
  import pandas
  import six
  from pandas.errors import EmptyDataError
  from neptune.common.experiments import LegacyExperiment
  from neptune.common.utils import align_channels_on_x, is_float, is_nan_or_inf
  from neptune.legacy.api_exceptions import ChannelDoesNotExist, ExperimentAlreadyFinished
  from neptune.legacy.exceptions import InvalidChannelValue, NeptuneIncorrectImportException, NoChannelValue
  from neptune.legacy.internal.channels.channels import ChannelNamespace, ChannelType, ChannelValue
  from neptune.legacy.internal.channels.channels_values_sender import ChannelsValuesSender
  from neptune.legacy.internal.execution.execution_context import ExecutionContext
  from neptune.legacy.internal.utils.deprecation import legacy_client_deprecation
  from neptune.legacy.internal.utils.image import get_image_content
label_desc: Use image node_id 36 for calling the Experiment obj's underlying member method code with example usage: obj.get_hardware_utilization() and returns: pd, pd