code: def probe(self) -> dict:
      device_data = self.metrics[0]._gc_ipu_info.getDevices()  # type: ignore
      device_count = len(device_data)
      devices = []
      for i, device in enumerate(device_data):
          device_metrics: Dict[str, str] = dict(device)
          devices.append(
              {
                  "id": device_metrics.get("id") or i,
                  "board ipu index": device_metrics.get(
                      "board ipu index"
                  ),
                  "board type": device_metrics.get("board type")
                  or "unknown",
              }
          )
  
      return {
          self.name: {
              "device_count": device_count,
              "devices": devices,
              "vendor": "Graphcore",
          }
      }
  
file_path: wandb/wandb/sdk/internal/system/assets/ipu.py
imports: import threading
  from collections import deque
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Tuple, Union
  import wandb
  from .aggregators import aggregate_mean
  from .asset_registry import asset_registry
  from .interfaces import Interface, Metric, MetricsMonitor
label_desc: Use image node_id 5 for calling the IPU obj's underlying member method code with example usage: obj.probe() and returns: dict