Start to add support for intel GPU stats

This commit is contained in:
Nick Mowen 2022-09-24 19:29:02 -06:00
parent 987bc050ed
commit 2e1958a20b
2 changed files with 50 additions and 11 deletions

View File

@ -13,7 +13,7 @@ from frigate.comms.dispatcher import Dispatcher
from frigate.config import FrigateConfig from frigate.config import FrigateConfig
from frigate.const import DRIVER_AMD, DRIVER_ENV_VAR, RECORD_DIR, CLIPS_DIR, CACHE_DIR from frigate.const import DRIVER_AMD, DRIVER_ENV_VAR, RECORD_DIR, CLIPS_DIR, CACHE_DIR
from frigate.types import StatsTrackingTypes, CameraMetricsTypes from frigate.types import StatsTrackingTypes, CameraMetricsTypes
from frigate.util import get_amd_gpu_stats, get_nvidia_gpu_stats from frigate.util import get_amd_gpu_stats, get_intel_gpu_stats, get_nvidia_gpu_stats
from frigate.version import VERSION from frigate.version import VERSION
from frigate.util import get_cpu_stats from frigate.util import get_cpu_stats
from frigate.object_detection import ObjectDetectProcess from frigate.object_detection import ObjectDetectProcess
@ -85,12 +85,12 @@ def get_temperatures() -> dict[str, float]:
def get_gpu_stats(config: FrigateConfig) -> dict[str, str]: def get_gpu_stats(config: FrigateConfig) -> dict[str, str]:
"""Parse GPUs from hwaccel args and use for stats.""" """Parse GPUs from hwaccel args and use for stats."""
hwaccel_args = set(map(lambda camera: camera.ffmpeg.hwaccel_args, config.cameras.values())) hwaccel_args = set(
map(lambda camera: camera.ffmpeg.hwaccel_args, config.cameras.values())
)
stats: dict[str, dict] = {} stats: dict[str, dict] = {}
for args in hwaccel_args: for args in hwaccel_args:
gpu: dict[str, str] = {}
if "cuvid" in args: if "cuvid" in args:
# nvidia GPU # nvidia GPU
nvidia_usage = get_nvidia_gpu_stats() nvidia_usage = get_nvidia_gpu_stats()
@ -99,23 +99,28 @@ def get_gpu_stats(config: FrigateConfig) -> dict[str, str]:
stats[nvidia_usage["name"]] = nvidia_usage stats[nvidia_usage["name"]] = nvidia_usage
elif "qsv" in args: elif "qsv" in args:
# intel QSV GPU # intel QSV GPU
gpu["name"] = "intel-qsv" intel_usage = get_intel_gpu_stats()
gpu["gpu_usage"] = "100"
gpu["memory_usage"] = "200" if intel_usage:
stats["intel-qsv"] = intel_usage
elif "vaapi" in args: elif "vaapi" in args:
driver = os.environ.get(DRIVER_ENV_VAR) driver = os.environ.get(DRIVER_ENV_VAR)
if driver == DRIVER_AMD: if driver == DRIVER_AMD:
# AMD VAAPI GPU
amd_usage = get_amd_gpu_stats() amd_usage = get_amd_gpu_stats()
if amd_usage: if amd_usage:
stats["amd-vaapi"] = amd_usage stats["amd-vaapi"] = amd_usage
else: else:
gpu["name"] = "intel-vaapi" # intel VAAPI GPU
gpu["usage"] = "100" intel_usage = get_intel_gpu_stats()
gpu["memory"] = "200"
if intel_usage:
stats["intel-qsv"] = intel_usage
elif "v4l2m2m" in args: elif "v4l2m2m" in args:
gpu["name"] = "RPi" # RPi v4l2m2m
stats["rpi-v4l2m2m"] = {}
return stats return stats

View File

@ -812,6 +812,40 @@ def get_amd_gpu_stats() -> dict[str, str]:
return results return results
def get_intel_gpu_stats() -> dict[str, str]:
"""Get stats using intel_gpu_top."""
radeontop_command = [
"timeout",
"1s",
"intel_gpu_top",
"-J",
"-o",
"-",
"-s",
"1"
]
p = sp.run(
radeontop_command,
encoding="ascii",
capture_output=True,
)
if p.returncode != 0:
logger.error(p.stderr)
return None
else:
usages = p.stdout.split(",")
results: dict[str, str] = {}
for hw in usages:
if "gpu" in hw:
results["gpu_usage"] = f"{hw.strip().split(' ')[1].split(' ')[0]} %"
elif "vram" in hw:
results["memory_usage"] = f"{hw.strip().split(' ')[1].split(' ')[0]} %"
return results
def get_nvidia_gpu_stats() -> dict[str, str]: def get_nvidia_gpu_stats() -> dict[str, str]:
"""Get stats using nvidia-smi.""" """Get stats using nvidia-smi."""