class_docstr: Class that enables tracking of the maximum memory utilization on a
  system.
  
  This creates a thread which samples the available memory every sample_interval_s
  seconds. The "available" memory is reported directly from psutil.
  See https://psutil.readthedocs.io/en/latest/#psutil.virtual_memory for more
  information.
code: def _track_memory_utilization(
      sample_interval_s: float,
      print_updates: bool,
      output_dict: dict,
      stop_event: threading.Event,
  ):
      import psutil
  
      min_available = float("inf")
  
      while not stop_event.is_set():
          memory_stats = psutil.virtual_memory()
  
          if memory_stats.available < min_available:
              if print_updates:
                  print(
                      "{before:.02f} -> {after:.02f}".format(
                          before=min_available / (1 << 30),
                          after=memory_stats.available / (1 << 30),
                      )
                  )
              min_available = memory_stats.available
  
          time.sleep(sample_interval_s)
  
      output_dict["min_available_bytes"] = min_available
  
file_path: ray/release/air_tests/air_benchmarks/mlperf-train/metric_utils.py
imports: import threading
  import time
label_desc: Use image node_id 2 for calling the MaxMemoryUtilizationTracker obj's underlying member method code with example usage: obj._track_memory_utilization(sample_interval_s, print_updates, output_dict, stop_event) without return types