system-monitor / app.py
gstaff's picture
Add project files.
6ac0749
import GPUtil
import matplotlib.pyplot as plt
import os
import psutil
import gradio as gr
# TODO: Use plotly trace to update a plot of the stats; try to get near parity to system monitor
# Ask: what stats are users most interested in knowing?
def get_stats(plot):
stats = ""
# Get CPU usage
cpu_percent = psutil.cpu_percent(interval=0)
# Get the number of CPU cores
num_cores = os.cpu_count()
# Get RAM usage
ram = psutil.virtual_memory()
total_ram = psutil.virtual_memory().total
stats += f"CPU Usage: {cpu_percent}%\n"
stats += f"Number of CPU Cores: {num_cores}\n"
stats += f"RAM Usage: {ram.percent}%\n"
stats += f"RAM Used: {ram.used / (1024 ** 3):.2f} GB\n"
stats += f"Total RAM: {total_ram / (1024 ** 3):.2f} GB\n"
# print(f"CPU Usage: {cpu_percent}%")
# print(f"Number of CPU Cores: {num_cores}")
# print(f"RAM Usage: {ram.percent}%")
# print(f"RAM Used: {ram.used / (1024 ** 3):.2f} GB")
# print(f"Total RAM: {total_ram / (1024 ** 3):.2f} GB")
# Get GPU usage and memory info
gpu_info = GPUtil.getGPUs()
for i, gpu in enumerate(gpu_info):
stats += f"GPU {i + 1}:\n"
stats += f" GPU Name: {gpu.name}\n"
stats += f" GPU Usage: {gpu.load * 100}%\n"
stats += f" GPU VRAM Usage: {(gpu.memoryUtil * 100):.2f}%\n"
stats += f" GPU Free VRAM: {(gpu.memoryFree / 1024):.2f} MB\n"
stats += f" GPU Total VRAM: {gpu.memoryTotal / 1024} MB\n\n"
# print(f"GPU {i + 1}:")
# print(f" GPU Name: {gpu.name}")
# print(f" GPU Usage: {gpu.load * 100}%")
# print(f" GPU VRAM Usage: {(gpu.memoryUtil * 100):.2f}%")
# print(f" GPU Free VRAM: {(gpu.memoryFree / 1024):.2f} MB")
# print(f" GPU Total VRAM: {gpu.memoryTotal / 1024} MB\n")
return stats, None
with gr.Blocks() as demo:
gr.Markdown(value='# System Monitor')
with gr.Row():
with gr.Column(scale=1):
gr.Markdown('## View system resource usage for the demo')
stats_box = gr.TextArea(label="System Stats")
with gr.Column(scale=1):
plot = gr.Plot(label="Plot", value=None)
dep = demo.load(get_stats, [plot], [stats_box, plot], every=5)
stats_box.change(get_stats, [plot], [stats_box, plot], every=5, cancels=[dep])
with gr.Accordion('Developer Notes:', open=False):
gr.Markdown('I\'ve seen a number of Ai tools that report system resource usage and think that is a good trend.\n\n'
'With more time I could see a "Task Manager" component for gradio being useful for demos.\n\n'
'The plot for this demo is broken but I may revisit this later.')
if __name__ == '__main__':
demo.queue().launch()