Spaces:
Running
Running
Version 0.1
Browse files
app.py
CHANGED
@@ -1,8 +1,16 @@
|
|
1 |
import matplotlib.pyplot as plt
|
|
|
2 |
import numpy as np
|
3 |
|
4 |
import gradio as gr
|
5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
|
7 |
# Sample test results with test names
|
8 |
MODELS = {
|
@@ -50,6 +58,9 @@ MODELS = {
|
|
50 |
}
|
51 |
}
|
52 |
|
|
|
|
|
|
|
53 |
def plot_model_stats(model_name: str) -> tuple[plt.Figure, str, str]:
|
54 |
"""Draws a pie chart of model's passed, failed, skipped, and error stats."""
|
55 |
model_stats = MODELS[model_name]
|
@@ -131,7 +142,7 @@ def plot_model_stats(model_name: str) -> tuple[plt.Figure, str, str]:
|
|
131 |
|
132 |
# Device label closer to chart and bigger
|
133 |
ax.set_title(device_label,
|
134 |
-
fontsize=28, weight='
|
135 |
fontfamily='monospace')
|
136 |
|
137 |
# Create both pie charts with device labels
|
@@ -146,22 +157,47 @@ def plot_model_stats(model_name: str) -> tuple[plt.Figure, str, str]:
|
|
146 |
|
147 |
# Add central shared title for model name
|
148 |
fig.suptitle(f'{model_name.lower()}',
|
149 |
-
fontsize=32, weight='
|
150 |
fontfamily='monospace', y=0.95)
|
151 |
|
152 |
# Clean layout with padding and space for central title
|
153 |
plt.tight_layout()
|
154 |
plt.subplots_adjust(top=0.85, wspace=0.4) # Added wspace for padding between charts
|
155 |
|
156 |
-
# Generate separate failed tests info for AMD and NVIDIA
|
157 |
-
amd_failed = model_stats['amd']['failed']
|
158 |
-
nvidia_failed = model_stats['nvidia']['failed']
|
|
|
|
|
|
|
|
|
|
|
159 |
|
160 |
-
|
161 |
-
amd_failed_info
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
162 |
|
163 |
-
|
164 |
-
nvidia_failed_info
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
165 |
|
166 |
return fig, amd_failed_info, nvidia_failed_info
|
167 |
|
@@ -292,10 +328,69 @@ dark_theme_css = """
|
|
292 |
border-color: #666666 !important;
|
293 |
}
|
294 |
|
295 |
-
/* Plot container */
|
296 |
.plot-container {
|
297 |
background-color: #000000 !important;
|
298 |
border: none !important;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
299 |
}
|
300 |
|
301 |
/* Text elements */
|
@@ -367,6 +462,8 @@ h1, h2, h3, p, .markdown {
|
|
367 |
resize: none !important;
|
368 |
scrollbar-width: thin !important;
|
369 |
scrollbar-color: #333333 #000000 !important;
|
|
|
|
|
370 |
}
|
371 |
|
372 |
/* WebKit scrollbar styling for failed tests */
|
@@ -387,10 +484,24 @@ h1, h2, h3, p, .markdown {
|
|
387 |
background-color: #555555 !important;
|
388 |
}
|
389 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
390 |
.failed-tests {
|
391 |
background-color: #000000 !important;
|
392 |
height: 220px !important;
|
393 |
max-height: 220px !important;
|
|
|
|
|
394 |
}
|
395 |
|
396 |
.failed-tests .gr-textbox {
|
@@ -398,8 +509,18 @@ h1, h2, h3, p, .markdown {
|
|
398 |
border: none !important;
|
399 |
height: 200px !important;
|
400 |
max-height: 200px !important;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
401 |
}
|
402 |
|
|
|
|
|
403 |
/* JavaScript to reset scroll position */
|
404 |
.scroll-reset {
|
405 |
animation: resetScroll 0.1s ease;
|
@@ -448,7 +569,7 @@ with gr.Blocks(title="Model Test Results Dashboard", css=dark_theme_css) as demo
|
|
448 |
with gr.Row():
|
449 |
with gr.Column(scale=1):
|
450 |
amd_failed_tests_output = gr.Textbox(
|
451 |
-
value="
|
452 |
lines=8,
|
453 |
max_lines=8,
|
454 |
interactive=False,
|
@@ -457,7 +578,7 @@ with gr.Blocks(title="Model Test Results Dashboard", css=dark_theme_css) as demo
|
|
457 |
)
|
458 |
with gr.Column(scale=1):
|
459 |
nvidia_failed_tests_output = gr.Textbox(
|
460 |
-
value="
|
461 |
lines=8,
|
462 |
max_lines=8,
|
463 |
interactive=False,
|
@@ -472,7 +593,7 @@ with gr.Blocks(title="Model Test Results Dashboard", css=dark_theme_css) as demo
|
|
472 |
outputs=[plot_output, amd_failed_tests_output, nvidia_failed_tests_output]
|
473 |
).then(
|
474 |
fn=None,
|
475 |
-
js="() => { setTimeout(() => { document.querySelectorAll('textarea').forEach(t => { if (t.closest('.failed-tests')) { t.scrollTo({ top: 0, behavior: 'smooth' }); } }); },
|
476 |
)
|
477 |
|
478 |
# Initialize with the first model
|
|
|
1 |
import matplotlib.pyplot as plt
|
2 |
+
import matplotlib
|
3 |
import numpy as np
|
4 |
|
5 |
import gradio as gr
|
6 |
|
7 |
+
# Configure matplotlib to prevent memory warnings and set dark background
|
8 |
+
matplotlib.rcParams['figure.max_open_warning'] = 0
|
9 |
+
matplotlib.rcParams['figure.facecolor'] = '#000000'
|
10 |
+
matplotlib.rcParams['axes.facecolor'] = '#000000'
|
11 |
+
matplotlib.rcParams['savefig.facecolor'] = '#000000'
|
12 |
+
plt.ioff() # Turn off interactive mode to prevent figure accumulation
|
13 |
+
|
14 |
|
15 |
# Sample test results with test names
|
16 |
MODELS = {
|
|
|
58 |
}
|
59 |
}
|
60 |
|
61 |
+
def generate_underlined_line(text: str) -> str:
|
62 |
+
return text + "\n" + "β" * len(text) + "\n"
|
63 |
+
|
64 |
def plot_model_stats(model_name: str) -> tuple[plt.Figure, str, str]:
|
65 |
"""Draws a pie chart of model's passed, failed, skipped, and error stats."""
|
66 |
model_stats = MODELS[model_name]
|
|
|
142 |
|
143 |
# Device label closer to chart and bigger
|
144 |
ax.set_title(device_label,
|
145 |
+
fontsize=28, weight='normal', pad=2, color='#FFFFFF',
|
146 |
fontfamily='monospace')
|
147 |
|
148 |
# Create both pie charts with device labels
|
|
|
157 |
|
158 |
# Add central shared title for model name
|
159 |
fig.suptitle(f'{model_name.lower()}',
|
160 |
+
fontsize=32, weight='bold', color='#CCCCCC',
|
161 |
fontfamily='monospace', y=0.95)
|
162 |
|
163 |
# Clean layout with padding and space for central title
|
164 |
plt.tight_layout()
|
165 |
plt.subplots_adjust(top=0.85, wspace=0.4) # Added wspace for padding between charts
|
166 |
|
167 |
+
# Generate separate failed tests info for AMD and NVIDIA with exclusive/common separation
|
168 |
+
amd_failed = set(model_stats['amd']['failed'])
|
169 |
+
nvidia_failed = set(model_stats['nvidia']['failed'])
|
170 |
+
|
171 |
+
# Find exclusive and common failures
|
172 |
+
amd_exclusive = amd_failed - nvidia_failed
|
173 |
+
nvidia_exclusive = nvidia_failed - amd_failed
|
174 |
+
common_failures = amd_failed & nvidia_failed
|
175 |
|
176 |
+
# Build AMD info
|
177 |
+
amd_failed_info = ""
|
178 |
+
if not amd_exclusive and not common_failures:
|
179 |
+
msg = "Error(s) detected" if model_stats["amd"]["error"] else "No failures"
|
180 |
+
amd_failed_info += generate_underlined_line(msg)
|
181 |
+
if amd_exclusive:
|
182 |
+
amd_failed_info += generate_underlined_line("Failures on AMD (exclusive):")
|
183 |
+
amd_failed_info += "\n".join(sorted(amd_exclusive))
|
184 |
+
amd_failed_info += "\n\n" if common_failures else ""
|
185 |
+
if common_failures:
|
186 |
+
amd_failed_info += generate_underlined_line("Failures on AMD (common):")
|
187 |
+
amd_failed_info += "\n".join(sorted(common_failures))
|
188 |
|
189 |
+
# Build NVIDIA info
|
190 |
+
nvidia_failed_info = ""
|
191 |
+
if not nvidia_exclusive and not common_failures:
|
192 |
+
msg = "Error(s) detected" if model_stats["nvidia"]["error"] else "No failures"
|
193 |
+
nvidia_failed_info += generate_underlined_line(msg)
|
194 |
+
if nvidia_exclusive:
|
195 |
+
nvidia_failed_info += generate_underlined_line("Failures on NVIDIA (exclusive):")
|
196 |
+
nvidia_failed_info += "\n".join(sorted(nvidia_exclusive))
|
197 |
+
nvidia_failed_info += "\n\n" if common_failures else ""
|
198 |
+
if common_failures:
|
199 |
+
nvidia_failed_info += generate_underlined_line("Failures on NVIDIA (common):")
|
200 |
+
nvidia_failed_info += "\n".join(sorted(common_failures))
|
201 |
|
202 |
return fig, amd_failed_info, nvidia_failed_info
|
203 |
|
|
|
328 |
border-color: #666666 !important;
|
329 |
}
|
330 |
|
331 |
+
/* Plot container with smooth transitions */
|
332 |
.plot-container {
|
333 |
background-color: #000000 !important;
|
334 |
border: none !important;
|
335 |
+
transition: opacity 0.6s ease-in-out !important;
|
336 |
+
}
|
337 |
+
|
338 |
+
/* Gradio plot component styling */
|
339 |
+
.gr-plot {
|
340 |
+
background-color: #000000 !important;
|
341 |
+
transition: opacity 0.6s ease-in-out !important;
|
342 |
+
}
|
343 |
+
|
344 |
+
.gr-plot .gradio-plot {
|
345 |
+
background-color: #000000 !important;
|
346 |
+
transition: opacity 0.6s ease-in-out !important;
|
347 |
+
}
|
348 |
+
|
349 |
+
.gr-plot img {
|
350 |
+
transition: opacity 0.6s ease-in-out !important;
|
351 |
+
}
|
352 |
+
|
353 |
+
/* Target the plot wrapper */
|
354 |
+
div[data-testid="plot"] {
|
355 |
+
background-color: #000000 !important;
|
356 |
+
}
|
357 |
+
|
358 |
+
/* Target all possible plot containers */
|
359 |
+
.plot-container img,
|
360 |
+
.gr-plot img,
|
361 |
+
.gradio-plot img {
|
362 |
+
background-color: #000000 !important;
|
363 |
+
}
|
364 |
+
|
365 |
+
/* Ensure plot area background */
|
366 |
+
.gr-plot > div,
|
367 |
+
.plot-container > div {
|
368 |
+
background-color: #000000 !important;
|
369 |
+
}
|
370 |
+
|
371 |
+
/* Prevent white flash during plot updates */
|
372 |
+
.plot-container::before {
|
373 |
+
content: "";
|
374 |
+
position: absolute;
|
375 |
+
top: 0;
|
376 |
+
left: 0;
|
377 |
+
right: 0;
|
378 |
+
bottom: 0;
|
379 |
+
background-color: #000000;
|
380 |
+
z-index: -1;
|
381 |
+
}
|
382 |
+
|
383 |
+
/* Force all plot elements to have black background */
|
384 |
+
.plot-container *,
|
385 |
+
.gr-plot *,
|
386 |
+
div[data-testid="plot"] * {
|
387 |
+
background-color: #000000 !important;
|
388 |
+
}
|
389 |
+
|
390 |
+
/* Override any white backgrounds in matplotlib */
|
391 |
+
.plot-container canvas,
|
392 |
+
.gr-plot canvas {
|
393 |
+
background-color: #000000 !important;
|
394 |
}
|
395 |
|
396 |
/* Text elements */
|
|
|
462 |
resize: none !important;
|
463 |
scrollbar-width: thin !important;
|
464 |
scrollbar-color: #333333 #000000 !important;
|
465 |
+
scroll-behavior: auto;
|
466 |
+
transition: opacity 0.5s ease-in-out !important;
|
467 |
}
|
468 |
|
469 |
/* WebKit scrollbar styling for failed tests */
|
|
|
484 |
background-color: #555555 !important;
|
485 |
}
|
486 |
|
487 |
+
/* Prevent white flash in text boxes during updates */
|
488 |
+
.failed-tests::before {
|
489 |
+
content: "";
|
490 |
+
position: absolute;
|
491 |
+
top: 0;
|
492 |
+
left: 0;
|
493 |
+
right: 0;
|
494 |
+
bottom: 0;
|
495 |
+
background-color: #000000;
|
496 |
+
z-index: -1;
|
497 |
+
}
|
498 |
+
|
499 |
.failed-tests {
|
500 |
background-color: #000000 !important;
|
501 |
height: 220px !important;
|
502 |
max-height: 220px !important;
|
503 |
+
position: relative;
|
504 |
+
transition: opacity 0.5s ease-in-out !important;
|
505 |
}
|
506 |
|
507 |
.failed-tests .gr-textbox {
|
|
|
509 |
border: none !important;
|
510 |
height: 200px !important;
|
511 |
max-height: 200px !important;
|
512 |
+
transition: opacity 0.5s ease-in-out !important;
|
513 |
+
}
|
514 |
+
|
515 |
+
/* Force all textbox elements to have black background */
|
516 |
+
.failed-tests *,
|
517 |
+
.failed-tests .gr-textbox *,
|
518 |
+
.failed-tests textarea * {
|
519 |
+
background-color: #000000 !important;
|
520 |
}
|
521 |
|
522 |
+
|
523 |
+
|
524 |
/* JavaScript to reset scroll position */
|
525 |
.scroll-reset {
|
526 |
animation: resetScroll 0.1s ease;
|
|
|
569 |
with gr.Row():
|
570 |
with gr.Column(scale=1):
|
571 |
amd_failed_tests_output = gr.Textbox(
|
572 |
+
value="Failures on AMD (exclusive):\nβββββββββββββββββββββββββββββ\nnetwork_timeout\n\nFailures on AMD (common):\nββββββββββββββββββββββββ\ndistributed",
|
573 |
lines=8,
|
574 |
max_lines=8,
|
575 |
interactive=False,
|
|
|
578 |
)
|
579 |
with gr.Column(scale=1):
|
580 |
nvidia_failed_tests_output = gr.Textbox(
|
581 |
+
value="Failures on NVIDIA (exclusive):\nβββββββββββββββββββββββββββββββββ\nmulti_gpu\n\nFailures on NVIDIA (common):\nββββββββββββββββββββββββββββ\ndistributed",
|
582 |
lines=8,
|
583 |
max_lines=8,
|
584 |
interactive=False,
|
|
|
593 |
outputs=[plot_output, amd_failed_tests_output, nvidia_failed_tests_output]
|
594 |
).then(
|
595 |
fn=None,
|
596 |
+
js="() => { setTimeout(() => { document.querySelectorAll('textarea').forEach(t => { if (t.closest('.failed-tests')) { t.scrollTop = 0; setTimeout(() => { t.style.scrollBehavior = 'smooth'; t.scrollTo({ top: 0, behavior: 'smooth' }); t.style.scrollBehavior = 'auto'; }, 50); } }); }, 300); }"
|
597 |
)
|
598 |
|
599 |
# Initialize with the first model
|