Spaces:
Runtime error
Runtime error
#!/usr/bin/env python | |
from __future__ import annotations | |
import collections | |
import gradio as gr | |
import nvitop | |
import pandas as pd | |
import plotly.express as px | |
import psutil | |
class SystemMonitor: | |
MAX_SIZE = 61 | |
def __init__(self): | |
self.devices = nvitop.Device.all() | |
self.cpu_memory_usage = collections.deque([0 for _ in range(self.MAX_SIZE)], maxlen=self.MAX_SIZE) | |
self.cpu_memory_usage_str = "" | |
self.gpu_memory_usage = collections.deque([0 for _ in range(self.MAX_SIZE)], maxlen=self.MAX_SIZE) | |
self.gpu_util = collections.deque([0 for _ in range(self.MAX_SIZE)], maxlen=self.MAX_SIZE) | |
self.gpu_memory_usage_str = "" | |
self.gpu_util_str = "" | |
def update(self) -> None: | |
self.update_cpu() | |
self.update_gpu() | |
def update_cpu(self) -> None: | |
memory = psutil.virtual_memory() | |
self.cpu_memory_usage.append(memory.percent) | |
self.cpu_memory_usage_str = ( | |
f"{memory.used / 1024**3:0.2f}GiB / {memory.total / 1024**3:0.2f}GiB ({memory.percent}%)" | |
) | |
def update_gpu(self) -> None: | |
if not self.devices: | |
return | |
device = self.devices[0] | |
self.gpu_memory_usage.append(device.memory_percent()) | |
self.gpu_util.append(device.gpu_utilization()) | |
self.gpu_memory_usage_str = f"{device.memory_usage()} ({device.memory_percent()}%)" | |
self.gpu_util_str = f"{device.gpu_utilization()}%" | |
def get_json(self) -> dict[str, str]: | |
return { | |
"CPU memory usage": self.cpu_memory_usage_str, | |
"GPU memory usage": self.gpu_memory_usage_str, | |
"GPU Util": self.gpu_util_str, | |
} | |
def get_graph_data(self) -> dict[str, list[int | float]]: | |
return { | |
"index": list(range(-self.MAX_SIZE + 1, 1)), | |
"CPU memory usage": self.cpu_memory_usage, | |
"GPU memory usage": self.gpu_memory_usage, | |
"GPU Util": self.gpu_util, | |
} | |
def get_graph(self): | |
df = pd.DataFrame(self.get_graph_data()) | |
return px.line( | |
df, | |
x="index", | |
y=[ | |
"CPU memory usage", | |
"GPU memory usage", | |
"GPU Util", | |
], | |
range_y=[-5, 105], | |
).update_layout(xaxis_title="Time", yaxis_title="Percentage") | |
def create_monitor_demo() -> gr.Blocks: | |
monitor = SystemMonitor() | |
with gr.Blocks() as demo: | |
gr.JSON(value=monitor.update, every=1, visible=False) | |
gr.JSON(value=monitor.get_json, show_label=False, every=1) | |
gr.Plot(value=monitor.get_graph, show_label=False, every=1) | |
return demo | |
if __name__ == "__main__": | |
demo = create_monitor_demo() | |
demo.queue(api_open=False).launch() | |