code: def track_gpu(self):
      if not self.nvml:
          return
  
      self.nvml.nvmlInit()
      for i in range(self.n_gpu):
          handle = self.nvml.nvmlDeviceGetHandleByIndex(i)
          self.data.update(
              {
                  f"gpu.memory.used.{i}": self.nvml.nvmlDeviceGetMemoryInfo(
                      handle
                  ).used,
                  f"gpu.utilization.{i}": self.nvml.nvmlDeviceGetUtilizationRates(
                      handle
                  ).gpu,
                  f"gpu.temperature.{i}": self.nvml.nvmlDeviceGetTemperature(
                      handle, self.nvml.NVML_TEMPERATURE_GPU
                  ),
                  f"gpu.power.usage.{i}": self.nvml.nvmlDeviceGetPowerUsage(
                      handle
                  ),
              }
          )
  
      self.data.update(self.process_monitor.track_gpus())
  
      self.nvml.nvmlShutdown()
  
imports: import time
  from pathlib import Path
  import psutil
  from labml import logger
  from labml.internal.computer.monitor.process import ProcessMonitor
  from labml.logger import Text
  from labml.utils.notice import labml_notice
label_desc: Use image node_id 5 for calling the Scanner obj's underlying member method code with example usage: obj.track_gpu() without return types