class_docstr: Create an experiment with time/memory checkpoints
code: def start(self):
      # print("Starting IPyExperiments")
      # base-line
      gc.collect()
      self.gpu_clear_cache()
  
      self.running = True
  
      if self.enable:
          self.cpu_ram_used_start = self.cpu_ram_used()
          self.gpu_ram_used_start = self.gpu_ram_used()
          # print(f"gpu used f{self.gpu_ram_used_start}")
  
          self.print_state()
          # XXX: perhaps prefix all the prints from exp with some |?
          print(
              "\n"
          )  # extra vertical white space, to not mix with user's outputs
  
      # start the per cell sub-system
      if self.cl_enable:
          self.cl = CellLogger(exp=self, **self.cl_kwargs)
          self.cl.start()
      else:
          self.cl = None
  
imports: import gc
  import logging
  import os
  import psutil
  import sys
  import threading
  import time
  import weakref
  from IPython import get_ipython
  from IPython.core.magics.namespace import NamespaceMagics
  from collections import namedtuple
  from .cell_logger import CellLogger, b2mb, int2width, get_nvml_gpu_id
label_desc: Use image node_id 3 for calling the IPyExperiments obj's underlying member method code with example usage: obj.start() without return types