class_docstr: Automatically monitors and logs device stats during training, validation and testing stage.
  ``DeviceStatsMonitor`` is a special callback as it requires a ``logger`` to passed as argument to the ``Trainer``.
  
  Args:
      cpu_stats: if ``None``, it will log CPU stats only if the accelerator is CPU.
          If ``True``, it will log CPU stats regardless of the accelerator.
          If ``False``, it will not log CPU stats regardless of the accelerator.
  
  Raises:
      MisconfigurationException:
          If ``Trainer`` has no logger.
      ModuleNotFoundError:
          If ``psutil`` is not installed and CPU stats are monitored.
  
  Example::
  
      from lightning import Trainer
      from lightning.pytorch.callbacks import DeviceStatsMonitor
      device_stats = DeviceStatsMonitor()
      trainer = Trainer(callbacks=[device_stats])
class_docstr_tok: ["Automatically","monitors","and","logs","device","stats","during","training",",","validation","and","testing","stage",".","``","DeviceStatsMonitor","``","is","a","special","callback","as","it","requires","a","``","logger","``","to","passed","as","argument","to","the","``","Trainer","``",".","Args",":","cpu_stats",":","if","``","None","``",",","it","will","log","CPU","stats","only","if","the","accelerator","is","CPU",".","If","``","True","``",",","it","will","log","CPU","stats","regardless","of","the","accelerator",".","If","``","False","``",",","it","will","not","log","CPU","stats","regardless","of","the","accelerator",".","Raises",":","MisconfigurationException",":","If","``","Trainer","``","has","no","logger",".","ModuleNotFoundError",":","If","``","psutil","``","is","not","installed","and","CPU","stats","are","monitored",".","Example",":",":","from","lightning","import","Trainer","from","lightning.pytorch.callbacks","import","DeviceStatsMonitor","device_stats","=","DeviceStatsMonitor","(",")","trainer","=","Trainer","(","callbacks=","[","device_stats","]",")"]
code: def _get_and_log_device_stats(
      self, trainer: "pl.Trainer", key: str
  ) -> None:
      if not trainer._logger_connector.should_update_logs:
          return
  
      device = trainer.strategy.root_device
      if self._cpu_stats is False and device.type == "cpu":
          # cpu stats are disabled
          return
  
      device_stats = trainer.accelerator.get_device_stats(device)
  
      if self._cpu_stats and device.type != "cpu":
          # Don't query CPU stats twice if CPU is accelerator
          from lightning.pytorch.accelerators.cpu import get_cpu_stats
  
          device_stats.update(get_cpu_stats())
  
      for logger in trainer.loggers:
          separator = logger.group_separator
          prefixed_device_stats = _prefix_metric_keys(
              device_stats,
              f"{self.__class__.__qualname__}.{key}",
              separator,
          )
          logger.log_metrics(
              prefixed_device_stats,
              step=trainer.fit_loop.epoch_loop._batches_that_stepped,
          )
  
file_path: pytorch-lightning/src/lightning/pytorch/callbacks/device_stats_monitor.py
imports: from typing import Any, Dict, Optional
  from typing_extensions import override
  import lightning.pytorch
  from lightning.pytorch.accelerators.cpu import _PSUTIL_AVAILABLE
  from lightning.pytorch.callbacks.callback import Callback
  from lightning.pytorch.utilities.exceptions import MisconfigurationException
  from lightning.pytorch.utilities.types import STEP_OUTPUT
label_desc: Use image node_id 3 for calling the DeviceStatsMonitor obj's underlying member method code with example usage: obj._get_and_log_device_stats(trainer, key) without return types