Spaces:
Running
Running
Commit
·
cae17c8
0
Parent(s):
Reset history
Browse files- .gitattributes +35 -0
- README.md +12 -0
- app.py +89 -0
- gpus.csv +45 -0
- requirements.txt +2 -0
.gitattributes
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
README.md
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: PLUS Lab GPUs
|
3 |
+
emoji: ➕
|
4 |
+
colorFrom: blue
|
5 |
+
colorTo: purple
|
6 |
+
sdk: gradio
|
7 |
+
sdk_version: 5.13.1
|
8 |
+
app_file: app.py
|
9 |
+
pinned: false
|
10 |
+
---
|
11 |
+
|
12 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
app.py
ADDED
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import datetime
|
2 |
+
import gradio as gr
|
3 |
+
import pandas as pd
|
4 |
+
import plotly.express as px
|
5 |
+
|
6 |
+
def split_multi_users(dfs):
|
7 |
+
df = dfs.copy()
|
8 |
+
df["usernames"] = df["username"].apply(lambda x: x.split(", "))
|
9 |
+
df["count"] = 1
|
10 |
+
new_df = []
|
11 |
+
for row in df.to_dict(orient="records"):
|
12 |
+
gpu_users_num = len(row["usernames"])
|
13 |
+
for username in row["usernames"]:
|
14 |
+
new_row = row.copy()
|
15 |
+
new_row["count"] = 1 / gpu_users_num
|
16 |
+
new_row["username"] = username
|
17 |
+
new_df.append(new_row)
|
18 |
+
df = pd.DataFrame(new_df)
|
19 |
+
return df
|
20 |
+
|
21 |
+
def plot_now():
|
22 |
+
dfs = pd.read_csv("hf://spaces/pluslab/PLUS_Lab_GPUs/gpus.csv")
|
23 |
+
dfs = dfs.drop(columns=["Unnamed: 0"])
|
24 |
+
dfs = dfs.fillna("FREE")
|
25 |
+
dfs_plot = split_multi_users(dfs)
|
26 |
+
fig = px.bar(
|
27 |
+
dfs_plot, x="count", y="server", color="username",
|
28 |
+
title=f"Last Updated {min(dfs['timestamp'])}",
|
29 |
+
color_discrete_map={
|
30 |
+
"FREE": "black",
|
31 |
+
},
|
32 |
+
text=dfs_plot['username'].astype(str) + "<br>" + dfs_plot['device'].astype(str),
|
33 |
+
)
|
34 |
+
fig.update_layout(
|
35 |
+
yaxis={'categoryorder': 'array', 'categoryarray': dfs_plot["server"].unique()[::-1]},
|
36 |
+
barcornerradius=50,
|
37 |
+
)
|
38 |
+
fig.update_traces(textposition='inside', insidetextanchor='middle')
|
39 |
+
print(dfs_plot)
|
40 |
+
return fig, dfs
|
41 |
+
|
42 |
+
def plot_history(sample=True, sampling_interval_minutes=180):
|
43 |
+
dfh = pd.read_pickle("hf://spaces/pluslab/PLUS_Lab_GPUs/history.pkl.gz", )
|
44 |
+
dfh = dfh.fillna("FREE")
|
45 |
+
dfh = split_multi_users(dfh)
|
46 |
+
dfh = dfh[["polling_timestamp", "username", "count"]]
|
47 |
+
dfh = dfh.groupby(["polling_timestamp", "username"]).sum()
|
48 |
+
dfh = dfh.reset_index()
|
49 |
+
dfh = dfh.sort_values(by=["polling_timestamp", "count"], ascending=False)
|
50 |
+
if sample:
|
51 |
+
unique_timestamps = dfh["polling_timestamp"].unique()
|
52 |
+
sampled_timestamps = [unique_timestamps[0]]
|
53 |
+
for i, t in enumerate(unique_timestamps[1:]):
|
54 |
+
diff = sampled_timestamps[-1] - t
|
55 |
+
if diff > datetime.timedelta(minutes=sampling_interval_minutes):
|
56 |
+
sampled_timestamps.append(t)
|
57 |
+
dfh = dfh[dfh["polling_timestamp"].isin(sampled_timestamps)]
|
58 |
+
fig = px.area(dfh, x="polling_timestamp", y="count", color='username', color_discrete_map={"FREE": "black",}, markers=True, line_shape='spline',)
|
59 |
+
return fig, dfh
|
60 |
+
|
61 |
+
|
62 |
+
def plot_figs():
|
63 |
+
fig_now, dfn = plot_now()
|
64 |
+
try:
|
65 |
+
fig_history, dfh = plot_history()
|
66 |
+
except Exception as e:
|
67 |
+
print(e)
|
68 |
+
fig_history = None
|
69 |
+
dfh = None
|
70 |
+
return fig_now, dfn, fig_history
|
71 |
+
|
72 |
+
demo = gr.Interface(
|
73 |
+
fn=plot_figs,
|
74 |
+
inputs = [
|
75 |
+
|
76 |
+
],
|
77 |
+
outputs = [
|
78 |
+
gr.Plot(label="GPU Status", elem_classes="plotcss"),
|
79 |
+
gr.Dataframe(label="GPU Status Details"),
|
80 |
+
gr.Plot(label="History", elem_classes="plotcss"),
|
81 |
+
],
|
82 |
+
live=True,
|
83 |
+
flagging_options=[],
|
84 |
+
css=".plotcss {max-width: 820px !important;}"
|
85 |
+
)
|
86 |
+
|
87 |
+
if __name__ == "__main__":
|
88 |
+
demo.launch(debug=False)
|
89 |
+
|
gpus.csv
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
,timestamp,server,name,device,utilization.gpu [%],utilization.memory [%],temperature.gpu,power.draw [W],username
|
2 |
+
0,2025/06/25 05:32:45.940,pluslab-a100.cs.ucla.edu,NVIDIA A100-SXM4-40GB,0,99 %,57 %,62,367.02 W,xueqing.wu
|
3 |
+
1,2025/06/25 05:32:45.959,pluslab-a100.cs.ucla.edu,NVIDIA A100-SXM4-40GB,1,99 %,53 %,63,374.97 W,xueqing.wu
|
4 |
+
2,2025/06/25 05:32:45.973,pluslab-a100.cs.ucla.edu,NVIDIA A100-SXM4-40GB,2,99 %,52 %,52,373.61 W,xueqing.wu
|
5 |
+
3,2025/06/25 05:32:45.989,pluslab-a100.cs.ucla.edu,NVIDIA A100-SXM4-40GB,3,98 %,59 %,53,387.15 W,xueqing.wu
|
6 |
+
0,2025/06/25 05:32:47.148,pluslab01-a100.cs.ucla.edu,NVIDIA A100 80GB PCIe,0,99 %,93 %,63,291.88 W,ponienkung
|
7 |
+
1,2025/06/25 05:32:47.159,pluslab01-a100.cs.ucla.edu,NVIDIA A100 80GB PCIe,1,99 %,51 %,72,306.29 W,junyizhang
|
8 |
+
2,2025/06/25 05:32:47.166,pluslab01-a100.cs.ucla.edu,NVIDIA A100 80GB PCIe,2,0 %,0 %,61,77.14 W,junyizhang
|
9 |
+
3,2025/06/25 05:32:47.174,pluslab01-a100.cs.ucla.edu,NVIDIA A100 80GB PCIe,3,0 %,0 %,58,76.64 W,junyizhang
|
10 |
+
4,2025/06/25 05:32:47.181,pluslab01-a100.cs.ucla.edu,NVIDIA A100 80GB PCIe,4,92 %,44 %,72,282.15 W,fanyin20
|
11 |
+
5,2025/06/25 05:32:47.188,pluslab01-a100.cs.ucla.edu,NVIDIA A100 80GB PCIe,5,92 %,42 %,72,329.60 W,fanyin20
|
12 |
+
6,2025/06/25 05:32:47.194,pluslab01-a100.cs.ucla.edu,NVIDIA A100 80GB PCIe,6,99 %,51 %,73,315.57 W,junyizhang
|
13 |
+
7,2025/06/25 05:32:47.200,pluslab01-a100.cs.ucla.edu,NVIDIA A100 80GB PCIe,7,0 %,0 %,43,64.30 W,xueqing.wu
|
14 |
+
0,2025/06/25 05:32:48.343,pluslab01-h100.cs.ucla.edu,NVIDIA H100 80GB HBM3,0,0 %,0 %,48,72.64 W,
|
15 |
+
1,2025/06/25 05:32:48.360,pluslab01-h100.cs.ucla.edu,NVIDIA H100 80GB HBM3,1,0 %,0 %,48,78.20 W,
|
16 |
+
2,2025/06/25 05:32:48.375,pluslab01-h100.cs.ucla.edu,NVIDIA H100 80GB HBM3,2,77 %,56 %,64,368.90 W,haikang
|
17 |
+
3,2025/06/25 05:32:48.389,pluslab01-h100.cs.ucla.edu,NVIDIA H100 80GB HBM3,3,77 %,57 %,60,356.04 W,haikang
|
18 |
+
4,2025/06/25 05:32:48.404,pluslab01-h100.cs.ucla.edu,NVIDIA H100 80GB HBM3,4,75 %,56 %,61,353.75 W,haikang
|
19 |
+
5,2025/06/25 05:32:48.420,pluslab01-h100.cs.ucla.edu,NVIDIA H100 80GB HBM3,5,40 %,14 %,53,214.77 W,ponienkung
|
20 |
+
6,2025/06/25 05:32:48.434,pluslab01-h100.cs.ucla.edu,NVIDIA H100 80GB HBM3,6,39 %,13 %,56,229.54 W,ponienkung
|
21 |
+
7,2025/06/25 05:32:48.449,pluslab01-h100.cs.ucla.edu,NVIDIA H100 80GB HBM3,7,0 %,0 %,47,75.22 W,
|
22 |
+
0,2025/06/25 05:32:49.926,pluslab-a6000.cs.ucla.edu,NVIDIA RTX A6000,0,100 %,1 %,85,187.87 W,xueqing.wu
|
23 |
+
1,2025/06/25 05:32:49.942,pluslab-a6000.cs.ucla.edu,NVIDIA RTX A6000,1,99 %,3 %,59,194.41 W,xueqing.wu
|
24 |
+
2,2025/06/25 05:32:49.951,pluslab-a6000.cs.ucla.edu,NVIDIA RTX A6000,2,99 %,3 %,66,199.23 W,xueqing.wu
|
25 |
+
3,2025/06/25 05:32:49.961,pluslab-a6000.cs.ucla.edu,NVIDIA RTX A6000,3,96 %,3 %,62,190.80 W,xueqing.wu
|
26 |
+
4,2025/06/25 05:32:49.971,pluslab-a6000.cs.ucla.edu,NVIDIA RTX A6000,4,0 %,0 %,30,22.88 W,
|
27 |
+
5,2025/06/25 05:32:49.979,pluslab-a6000.cs.ucla.edu,NVIDIA RTX A6000,5,0 %,0 %,29,28.40 W,
|
28 |
+
6,2025/06/25 05:32:49.986,pluslab-a6000.cs.ucla.edu,NVIDIA RTX A6000,6,0 %,0 %,31,26.89 W,
|
29 |
+
7,2025/06/25 05:32:49.992,pluslab-a6000.cs.ucla.edu,NVIDIA RTX A6000,7,0 %,0 %,30,21.56 W,
|
30 |
+
0,2025/06/25 05:32:51.188,pluslab01-a6000.cs.ucla.edu,NVIDIA RTX A6000,0,0 %,0 %,69,97.21 W,xueqing.wu
|
31 |
+
1,2025/06/25 05:32:51.194,pluslab01-a6000.cs.ucla.edu,NVIDIA RTX A6000,1,0 %,0 %,60,87.13 W,xueqing.wu
|
32 |
+
2,2025/06/25 05:32:51.197,pluslab01-a6000.cs.ucla.edu,NVIDIA RTX A6000,2,16 %,12 %,73,259.84 W,xueqing.wu
|
33 |
+
3,2025/06/25 05:32:51.199,pluslab01-a6000.cs.ucla.edu,NVIDIA RTX A6000,3,0 %,0 %,63,86.67 W,xueqing.wu
|
34 |
+
4,2025/06/25 05:32:51.201,pluslab01-a6000.cs.ucla.edu,NVIDIA RTX A6000,4,0 %,0 %,26,22.41 W,
|
35 |
+
5,2025/06/25 05:32:51.205,pluslab01-a6000.cs.ucla.edu,NVIDIA RTX A6000,5,0 %,0 %,25,19.62 W,
|
36 |
+
6,2025/06/25 05:32:51.210,pluslab01-a6000.cs.ucla.edu,NVIDIA RTX A6000,6,0 %,0 %,27,20.53 W,
|
37 |
+
7,2025/06/25 05:32:51.214,pluslab01-a6000.cs.ucla.edu,NVIDIA RTX A6000,7,0 %,0 %,27,26.57 W,haikang
|
38 |
+
0,2025/06/25 05:32:52.698,pluslab02-a6000.cs.ucla.edu,NVIDIA RTX A6000,0,0 %,0 %,28,26.73 W,
|
39 |
+
1,2025/06/25 05:32:52.726,pluslab02-a6000.cs.ucla.edu,NVIDIA RTX A6000,1,0 %,0 %,26,30.76 W,
|
40 |
+
2,2025/06/25 05:32:52.754,pluslab02-a6000.cs.ucla.edu,NVIDIA RTX A6000,2,92 %,94 %,68,264.96 W,hzhang19
|
41 |
+
3,2025/06/25 05:32:52.782,pluslab02-a6000.cs.ucla.edu,NVIDIA RTX A6000,3,100 %,95 %,63,256.09 W,hzhang19
|
42 |
+
4,2025/06/25 05:32:52.816,pluslab02-a6000.cs.ucla.edu,NVIDIA RTX A6000,4,100 %,75 %,71,292.37 W,xueqing.wu
|
43 |
+
5,2025/06/25 05:32:52.836,pluslab02-a6000.cs.ucla.edu,NVIDIA RTX A6000,5,78 %,54 %,61,290.91 W,xueqing.wu
|
44 |
+
6,2025/06/25 05:32:52.871,pluslab02-a6000.cs.ucla.edu,NVIDIA RTX A6000,6,74 %,42 %,71,291.68 W,xueqing.wu
|
45 |
+
7,2025/06/25 05:32:52.890,pluslab02-a6000.cs.ucla.edu,NVIDIA RTX A6000,7,86 %,62 %,66,291.55 W,xueqing.wu
|
requirements.txt
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
plotly==5.24.1
|
2 |
+
pandas==2.2.3
|