| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- import logging
- from typing import Dict, Optional, List
- from gpustack.detectors.base import (
- GPUDetector,
- GPUDevicesStatus,
- SystemInfoDetector,
- )
- from gpustack.detectors.runtime.runtime import Runtime
- from gpustack.schemas.workers import SystemInfo
- from gpustack.detectors.fastfetch.fastfetch import Fastfetch
- logger = logging.getLogger(__name__)
- class DetectorFactory:
- def __init__(
- self,
- device: Optional[str] = None,
- gpu_detectors: Optional[Dict[str, List[GPUDetector]]] = None,
- system_info_detector: Optional[SystemInfoDetector] = None,
- ):
- self.system_info_detector = system_info_detector or Fastfetch()
- self.device = device
- if device:
- self.gpu_detectors = gpu_detectors.get(device) or []
- else:
- self.gpu_detectors = [Runtime()]
- def detect_gpus(self) -> GPUDevicesStatus:
- for detector in self.gpu_detectors:
- if detector.is_available():
- gpus = detector.gather_gpu_info()
- if gpus:
- return self._filter_gpu_devices(gpus)
- return []
- def detect_system_info(self) -> SystemInfo:
- return self.system_info_detector.gather_system_info()
- @staticmethod
- def _filter_gpu_devices(gpu_devices: GPUDevicesStatus) -> GPUDevicesStatus:
- filtered: GPUDevicesStatus = []
- for device in gpu_devices:
- if not device.memory or not device.memory.total or device.memory.total <= 0:
- logger.debug(
- f"Skipping GPU device {device.name} ({device.device_index}, {device.device_chip_index}) due to invalid memory info"
- )
- continue
- filtered.append(device)
- return filtered
|