From 6c83a4fc80252b35762f8dec9184acd2f930fc0a Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Wed, 13 May 2026 14:30:39 -0600 Subject: [PATCH] Improve device naming --- frigate/stats/intel_gpu_info.py | 41 +++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/frigate/stats/intel_gpu_info.py b/frigate/stats/intel_gpu_info.py index 0872f07877..5ca3066fbd 100644 --- a/frigate/stats/intel_gpu_info.py +++ b/frigate/stats/intel_gpu_info.py @@ -39,6 +39,15 @@ class IntelGpuNameResolver: self._names = names return names + cpu_name: Optional[str] = None + if "CPU" in devices: + try: + cpu_name = self._strip_trademarks( + core.get_property("CPU", "FULL_DEVICE_NAME") + ) + except Exception as exc: + logger.debug(f"Failed to read CPU FULL_DEVICE_NAME: {exc}") + for device in devices: if not device.startswith("GPU"): continue @@ -46,6 +55,7 @@ class IntelGpuNameResolver: try: pci = core.get_property(device, "DEVICE_PCI_INFO") raw_name = core.get_property(device, "FULL_DEVICE_NAME") + device_type = core.get_property(device, "DEVICE_TYPE") except Exception as exc: logger.debug(f"Failed to read properties for {device}: {exc}") continue @@ -54,7 +64,7 @@ class IntelGpuNameResolver: if not pdev: continue - names[pdev] = self._normalize_name(raw_name) + names[pdev] = self._resolve_name(raw_name, device_type, cpu_name) self._names = names return names @@ -66,11 +76,34 @@ class IntelGpuNameResolver: except AttributeError: return None - @staticmethod - def _normalize_name(name: str) -> str: - cleaned = re.sub(r"\(R\)|\(TM\)", "", name) + @classmethod + def _resolve_name(cls, raw_name: str, device_type, cpu_name: Optional[str]) -> str: + """Build a display name for a GPU. + + Modern integrated Intel GPUs are reported by OpenVINO with a generic + FULL_DEVICE_NAME like "Intel(R) Graphics (iGPU)" that gives no model + information. Since the iGPU is part of the CPU on these platforms, fall + back to the CPU name (which OpenVINO does report specifically) and + suffix it with "iGPU" so it's clear what the entry is. + """ + is_integrated = "INTEGRATED" in str(device_type).upper() + + if is_integrated and cpu_name: + short_cpu = re.sub(r"^Intel\s+", "", cpu_name) + return f"{short_cpu} iGPU" + + return cls._normalize_name(raw_name) + + @classmethod + def _normalize_name(cls, name: str) -> str: + cleaned = cls._strip_trademarks(name) cleaned = re.sub(r"\s*\((?:i|d)GPU\)\s*$", "", cleaned, flags=re.IGNORECASE) return " ".join(cleaned.split()) + @staticmethod + def _strip_trademarks(name: str) -> str: + cleaned = re.sub(r"\(R\)|\(TM\)", "", name) + return " ".join(cleaned.split()) + intel_gpu_name_resolver = IntelGpuNameResolver()