Skip to content

Commit

Permalink
Improve Intel GPU stats (#14073)
Browse files Browse the repository at this point in the history
* Fix formatting

* Fix test
  • Loading branch information
NickM-27 authored Sep 30, 2024
1 parent 18bf7f9 commit 4dc4704
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 27 deletions.
3 changes: 2 additions & 1 deletion frigate/test/test_gpu_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ def test_intel_gpu_stats(self, sp):
process.stdout = self.intel_results
sp.return_value = process
intel_stats = get_intel_gpu_stats()
print(f"the intel stats are {intel_stats}")
assert intel_stats == {
"gpu": "1.34%",
"gpu": "1.13%",
"mem": "-%",
}
83 changes: 57 additions & 26 deletions frigate/util/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,35 +279,66 @@ def get_intel_gpu_stats() -> dict[str, str]:
logger.error(f"Unable to poll intel GPU stats: {p.stderr}")
return None
else:
reading = "".join(p.stdout.split())
data = json.loads(f'[{"".join(p.stdout.split())}]')
results: dict[str, str] = {}
render = {"global": []}
video = {"global": []}

# render is used for qsv
render = []
for result in re.findall(r'"Render/3D/0":{[a-z":\d.,%]+}', reading):
packet = json.loads(result[14:])
single = packet.get("busy", 0.0)
render.append(float(single))

if render:
render_avg = sum(render) / len(render)
else:
render_avg = 1

# video is used for vaapi
video = []
for result in re.findall(r'"Video/\d":{[a-z":\d.,%]+}', reading):
packet = json.loads(result[10:])
single = packet.get("busy", 0.0)
video.append(float(single))

if video:
video_avg = sum(video) / len(video)
else:
video_avg = 1

results["gpu"] = f"{round((video_avg + render_avg) / 2, 2)}%"
for block in data:
global_engine = block.get("engines")

if global_engine:
render_frame = global_engine.get("Render/3D/0", {}).get("busy")
video_frame = global_engine.get("Video/0", {}).get("busy")

if render_frame is not None:
render["global"].append(float(render_frame))

if video_frame is not None:
video["global"].append(float(video_frame))

clients = block.get("clients", {})

if clients and len(clients):
for client_block in clients.values():
key = client_block["pid"]

if render.get(key) is None:
render[key] = []
video[key] = []

client_engine = client_block.get("engine-classes", {})

render_frame = client_engine.get("Render/3D", {}).get("busy")
video_frame = client_engine.get("Video", {}).get("busy")

if render_frame is not None:
render[key].append(float(render_frame))

if video_frame is not None:
video[key].append(float(video_frame))

for key in render.keys():
print(
f"new way has {key} :: {round(((sum(render[key]) / len(render[key])) + (sum(video[key]) / len(video[key]))) / 2, 2)}% total"
)

results["gpu"] = (
f"{round(((sum(render['global']) / len(render['global'])) + (sum(video['global']) / len(video['global']))) / 2, 2)}%"
)
results["mem"] = "-%"

if len(render.keys()) > 1:
results["clients"] = {}

for key in render.keys():
if key == "global":
continue

results["clients"][key] = (
f"{round(((sum(render[key]) / len(render[key])) + (sum(video[key]) / len(video[key]))) / 2, 2)}%"
)

return results


Expand Down

0 comments on commit 4dc4704

Please sign in to comment.