code: def collect_via_pynvml(self, stats_config):
          
          try:
              NVML_TEMPERATURE_GPU = 0
              pynvml.nvmlInit()
              device_count = pynvml.nvmlDeviceGetCount()
  
              for device_index in xrange(device_count):
                  handle = pynvml.nvmlDeviceGetHandleByIndex(device_index)
                  memoryInfo = pynvml.nvmlDeviceGetMemoryInfo(handle)
                  utilizationRates = pynvml.nvmlDeviceGetUtilizationRates(handle)
  
                  metrics = {
                      'memory.total': memoryInfo.total / 1024 / 1024,
                      'memory.used': memoryInfo.total / 1024 / 1024,
                      'memory.free': memoryInfo.free / 1024 / 1024,
                      'utilization.gpu': utilizationRates.gpu,
                      'utilization.memory': utilizationRates.memory,
                      'temperature.gpu':
                          pynvml.nvmlDeviceGetTemperature(handle,
                                                          NVML_TEMPERATURE_GPU)
                  }
  
                  for stat_name in stats_config[1:]:
                      metric = metrics.get(stat_name)
                      if metric:
                          metric_name = 'gpu_{index}.{stat_name}'.format(
                              index=str(device_index),
                              stat_name=stat_name
                          )
                          self.publish(metric_name, metric)
          finally:
              pynvml.nvmlShutdown()
docs: Use pynvml python binding to collect metrics
          :param stats_config:
          :return: