manueldeprada HF Staff commited on
Commit
d87fc8a
·
verified ·
1 Parent(s): 212576c

Upload folder using huggingface_hub

Browse files
Files changed (13) hide show
  1. .gitignore +2 -0
  2. .vscode/launch.json +16 -0
  3. CLAUDE.md +91 -0
  4. README.md +26 -5
  5. app.py +305 -0
  6. data.py +240 -0
  7. model_page.py +180 -0
  8. requirements.txt +1 -0
  9. sample_amd.json +1839 -0
  10. sample_nvidia.json +1475 -0
  11. styles.css +669 -0
  12. summary_page.py +231 -0
  13. utils.py +51 -0
.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ __pycache__
2
+ __ignore*
.vscode/launch.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ // Use IntelliSense to learn about possible attributes.
3
+ // Hover to view descriptions of existing attributes.
4
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5
+ "version": "0.2.0",
6
+ "configurations": [
7
+ {
8
+ "name": "Python Debugger: Current File",
9
+ "type": "debugpy",
10
+ "request": "launch",
11
+ "program": "${file}",
12
+ "console": "integratedTerminal",
13
+ "justMyCode": false
14
+ }
15
+ ]
16
+ }
CLAUDE.md ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ This is **TCID** (Transformer CI Dashboard) - a Gradio-based web dashboard that displays test results for Transformer models across AMD and NVIDIA hardware. The application fetches CI test data from HuggingFace datasets and presents it through interactive visualizations and detailed failure reports.
8
+
9
+ ## Architecture
10
+
11
+ ### Core Components
12
+
13
+ - **`app.py`** - Main Gradio application with UI components, plotting functions, and data visualization logic
14
+ - **`data.py`** - Data fetching module that retrieves test results from HuggingFace datasets for AMD and NVIDIA CI runs
15
+ - **`styles.css`** - Complete dark theme styling for the Gradio interface
16
+ - **`requirements.txt`** - Python dependencies (matplotlib only)
17
+
18
+ ### Data Flow
19
+
20
+ 1. **Data Loading**: `get_data()` in `data.py` fetches latest CI results from:
21
+ - AMD: `hf://datasets/optimum-amd/transformers_daily_ci`
22
+ - NVIDIA: `hf://datasets/hf-internal-testing/transformers_daily_ci`
23
+
24
+ 2. **Data Processing**: Results are joined and filtered to show only important models defined in `IMPORTANT_MODELS` list
25
+
26
+ 3. **Visualization**: Two main views:
27
+ - **Summary Page**: Horizontal bar charts showing test results for all models
28
+ - **Detail View**: Pie charts for individual models with failure details
29
+
30
+ ### UI Architecture
31
+
32
+ - **Sidebar**: Model selection, refresh controls, CI job links
33
+ - **Main Content**: Dynamic display switching between summary and detail views
34
+ - **Auto-refresh**: Data reloads every 15 minutes via background threading
35
+
36
+ ## Running the Application
37
+
38
+ ### Development Commands
39
+
40
+ ```bash
41
+ # Install dependencies
42
+ pip install -r requirements.txt
43
+
44
+ # Run the application
45
+ python app.py
46
+ ```
47
+
48
+ ### HuggingFace Spaces Deployment
49
+
50
+ This application is configured for HuggingFace Spaces deployment:
51
+ - **Framework**: Gradio 5.38.0
52
+ - **App file**: `app.py`
53
+ - **Configuration**: See `README.md` header for Spaces metadata
54
+
55
+ ## Key Data Structures
56
+
57
+ ### Model Results DataFrame
58
+ The joined DataFrame contains these columns:
59
+ - `success_amd` / `success_nvidia` - Number of passing tests
60
+ - `failed_multi_no_amd` / `failed_multi_no_nvidia` - Multi-GPU failure counts
61
+ - `failed_single_no_amd` / `failed_single_no_nvidia` - Single-GPU failure counts
62
+ - `failures_amd` / `failures_nvidia` - Detailed failure information objects
63
+ - `job_link_amd` / `job_link_nvidia` - CI job URLs
64
+
65
+ ### Important Models List
66
+ Predefined list in `data.py` focusing on significant models:
67
+ - Classic models: bert, gpt2, t5, vit, clip, whisper
68
+ - Modern models: llama, gemma3, qwen2, mistral3
69
+ - Multimodal: qwen2_5_vl, llava, smolvlm, internvl
70
+
71
+ ## Styling and Theming
72
+
73
+ The application uses a comprehensive dark theme with:
74
+ - Fixed sidebar layout (300px width)
75
+ - Black background throughout (`#000000`)
76
+ - Custom scrollbars with dark styling
77
+ - Monospace fonts for technical aesthetics
78
+ - Gradient buttons and hover effects
79
+
80
+ ## Error Handling
81
+
82
+ - **Data Loading Failures**: Falls back to predefined model list for testing
83
+ - **Missing Model Data**: Shows "No data available" message in visualizations
84
+ - **Empty Results**: Gracefully handles cases with no test results
85
+
86
+ ## Performance Considerations
87
+
88
+ - **Memory Management**: Matplotlib configured to prevent memory warnings
89
+ - **Interactive Mode**: Disabled to prevent figure accumulation
90
+ - **Auto-reload**: Background threading with daemon timers
91
+ - **Data Caching**: Global variables store loaded data between UI updates
README.md CHANGED
@@ -1,12 +1,33 @@
1
  ---
2
  title: Tcid
3
- emoji: 🏃
4
- colorFrom: gray
5
- colorTo: blue
6
  sdk: gradio
7
- sdk_version: 5.45.0
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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  title: Tcid
3
+ emoji: 👁
4
+ colorFrom: indigo
5
+ colorTo: pink
6
  sdk: gradio
7
+ sdk_version: 5.38.0
8
  app_file: app.py
9
  pinned: false
10
+ short_description: A dashboard
11
  ---
12
 
13
+ # TCID
14
+
15
+ This space displays the state of the `transformers` CI on two hardwares, for a subset of models. The CI is run daily, on both AMD MI325 and Nvidia A10. The CI runs a different number of tests for each model. When a test finishes, it is assigned a status depending on its outcome:
16
+
17
+ - passed: the test finsihed and the expected output (or outputs) were retrieved;
18
+ - failed: the test either did not finish or the output was different from the expected output;
19
+ - skipped: the test was not run, which usually happens when a test is incompatible with a model. For instance, some models skip `flash-attention`-related tests because they are incompatible with `flash-attention`;
20
+ - error: the test did not finish and python crashed;
21
+
22
+ The dashboard is divided in two main parts:
23
+
24
+ ## Summary page
25
+
26
+ On the summary page, you can see a snapshot of the mix of test passed, failed and skipped for each model. The summary page also features an "Overall failures rate" for AMD and NVIDIA, which is computed this way:
27
+ ```overall_failure_rate = (failed + error) / (passed + failed + error)```
28
+
29
+ We do not account for the test skipped in this overall failure rate, because skipped test have no chance to neither pass nor fail.
30
+
31
+ ## Models page
32
+
33
+ From the sidebar, you can access a detailled view of each model. In it, you will find the breakdown of test statuses and the names of the test that failed for single and multi-gpu runs.
app.py ADDED
@@ -0,0 +1,305 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import matplotlib.pyplot as plt
2
+ import matplotlib
3
+ import pandas as pd
4
+ import gradio as gr
5
+
6
+ from data import CIResults
7
+ from utils import logger
8
+ from summary_page import create_summary_page
9
+ from model_page import plot_model_stats
10
+
11
+
12
+ # Configure matplotlib to prevent memory warnings and set dark background
13
+ matplotlib.rcParams['figure.facecolor'] = '#000000'
14
+ matplotlib.rcParams['axes.facecolor'] = '#000000'
15
+ matplotlib.rcParams['savefig.facecolor'] = '#000000'
16
+ plt.ioff() # Turn off interactive mode to prevent figure accumulation
17
+
18
+
19
+ # Load data once at startup
20
+ Ci_results = CIResults()
21
+ Ci_results.load_data()
22
+ # Start the auto-reload scheduler
23
+ Ci_results.schedule_data_reload()
24
+
25
+
26
+ # Function to check if a model has failures
27
+ def model_has_failures(model_name):
28
+ """Check if a model has any failures (AMD or NVIDIA)."""
29
+ if Ci_results.df is None or Ci_results.df.empty:
30
+ return False
31
+
32
+ # Normalize model name to match DataFrame index
33
+ model_name_lower = model_name.lower()
34
+
35
+ # Check if model exists in DataFrame
36
+ if model_name_lower not in Ci_results.df.index:
37
+ return False
38
+ row = Ci_results.df.loc[model_name_lower]
39
+
40
+ # Check for failures in both AMD and NVIDIA
41
+ amd_multi_failures = row.get('failed_multi_no_amd', 0)
42
+ amd_single_failures = row.get('failed_single_no_amd', 0)
43
+ nvidia_multi_failures = row.get('failed_multi_no_nvidia', 0)
44
+ nvidia_single_failures = row.get('failed_single_no_nvidia', 0)
45
+ return any([
46
+ amd_multi_failures > 0,
47
+ amd_single_failures > 0,
48
+ nvidia_multi_failures > 0,
49
+ nvidia_single_failures > 0,
50
+ ])
51
+
52
+
53
+ # Function to get current description text
54
+ def get_description_text():
55
+ """Get description text with integrated last update time."""
56
+ msg = [
57
+ "Transformer CI Dashboard",
58
+ "-",
59
+ "AMD runs on MI325",
60
+ "NVIDIA runs on A10",
61
+ ]
62
+ msg = ["**" + x + "**" for x in msg] + [""]
63
+ if Ci_results.latest_update_msg:
64
+ msg.append(f"*({Ci_results.latest_update_msg})*")
65
+ else:
66
+ msg.append("*(loading...)*")
67
+ return "<br>".join(msg)
68
+
69
+ # Load CSS from external file
70
+ def load_css():
71
+ try:
72
+ with open("styles.css", "r") as f:
73
+ css_content = f.read()
74
+
75
+ return css_content
76
+ except FileNotFoundError:
77
+ logger.warning("styles.css not found, using minimal default styles")
78
+ return "body { background: #000; color: #fff; }"
79
+
80
+
81
+ # Create the Gradio interface with sidebar and dark theme
82
+ with gr.Blocks(title="Model Test Results Dashboard", css=load_css()) as demo:
83
+
84
+
85
+ with gr.Row():
86
+ # Sidebar for model selection
87
+ with gr.Column(scale=1, elem_classes=["sidebar"]):
88
+ gr.Markdown("# 🤖 TCID", elem_classes=["sidebar-title"])
89
+
90
+ # Description with integrated last update time
91
+ description_text = get_description_text()
92
+ description_display = gr.Markdown(description_text, elem_classes=["sidebar-description"])
93
+
94
+ # Summary button at the top
95
+ summary_button = gr.Button(
96
+ "summary\n📊",
97
+ variant="primary",
98
+ size="lg",
99
+ elem_classes=["summary-button"]
100
+ )
101
+
102
+ # Model selection header (clickable toggle)
103
+ model_toggle_button = gr.Button(
104
+ f"► Select model ({len(Ci_results.available_models)})",
105
+ variant="secondary",
106
+ elem_classes=["model-header"]
107
+ )
108
+
109
+ # Model buttons container (collapsible) - start folded
110
+ with gr.Column(elem_classes=["model-list", "model-list-hidden"]) as model_list_container:
111
+ # Create individual buttons for each model
112
+ model_buttons = []
113
+ model_choices = [model.lower() for model in Ci_results.available_models] if Ci_results.available_models else ["auto", "bert", "clip", "llama"]
114
+
115
+ print(f"Creating {len(model_choices)} model buttons: {model_choices}")
116
+
117
+ for model_name in model_choices:
118
+ # Check if model has failures to determine styling
119
+ has_failures = model_has_failures(model_name)
120
+ button_classes = ["model-button"]
121
+ if has_failures:
122
+ button_classes.append("model-button-failed")
123
+
124
+ btn = gr.Button(
125
+ model_name,
126
+ variant="secondary",
127
+ size="sm",
128
+ elem_classes=button_classes
129
+ )
130
+ model_buttons.append(btn)
131
+
132
+ # CI job links at bottom of sidebar
133
+ ci_links_display = gr.Markdown("🔗 **CI Jobs:** *Loading...*", elem_classes=["sidebar-links"])
134
+
135
+ # Main content area
136
+ with gr.Column(scale=4, elem_classes=["main-content"]):
137
+ # Summary display (default view)
138
+ summary_display = gr.Plot(
139
+ value=create_summary_page(Ci_results.df, Ci_results.available_models),
140
+ label="",
141
+ format="png",
142
+ elem_classes=["plot-container"],
143
+ visible=True
144
+ )
145
+
146
+ # Detailed view components (hidden by default)
147
+ with gr.Column(visible=False, elem_classes=["detail-view"]) as detail_view:
148
+
149
+ # Create the plot output
150
+ plot_output = gr.Plot(
151
+ label="",
152
+ format="png",
153
+ elem_classes=["plot-container"]
154
+ )
155
+
156
+ # Create two separate failed tests displays in a row layout
157
+ with gr.Row():
158
+ with gr.Column(scale=1):
159
+ amd_failed_tests_output = gr.Textbox(
160
+ value="",
161
+ lines=8,
162
+ max_lines=8,
163
+ interactive=False,
164
+ container=False,
165
+ elem_classes=["failed-tests"]
166
+ )
167
+ with gr.Column(scale=1):
168
+ nvidia_failed_tests_output = gr.Textbox(
169
+ value="",
170
+ lines=8,
171
+ max_lines=8,
172
+ interactive=False,
173
+ container=False,
174
+ elem_classes=["failed-tests"]
175
+ )
176
+
177
+ # Set up click handlers for model buttons
178
+ for i, btn in enumerate(model_buttons):
179
+ model_name = model_choices[i]
180
+ btn.click(
181
+ fn=lambda selected_model=model_name: plot_model_stats(Ci_results.df, selected_model),
182
+ outputs=[plot_output, amd_failed_tests_output, nvidia_failed_tests_output]
183
+ ).then(
184
+ fn=lambda: [gr.update(visible=False), gr.update(visible=True)],
185
+ outputs=[summary_display, detail_view]
186
+ )
187
+
188
+ # Model toggle functionality
189
+ def toggle_model_list(current_visible):
190
+ """Toggle the visibility of the model list."""
191
+ new_visible = not current_visible
192
+ arrow = "▼" if new_visible else "►"
193
+ button_text = f"{arrow} Select model ({len(Ci_results.available_models)})"
194
+
195
+ # Use CSS classes instead of Gradio visibility
196
+ css_classes = ["model-list"]
197
+ if new_visible:
198
+ css_classes.append("model-list-visible")
199
+ else:
200
+ css_classes.append("model-list-hidden")
201
+
202
+ return gr.update(value=button_text), gr.update(elem_classes=css_classes), new_visible
203
+
204
+ # Track model list visibility state
205
+ model_list_visible = gr.State(False)
206
+
207
+ model_toggle_button.click(
208
+ fn=toggle_model_list,
209
+ inputs=[model_list_visible],
210
+ outputs=[model_toggle_button, model_list_container, model_list_visible]
211
+ )
212
+
213
+ # Summary button click handler
214
+ def show_summary_and_update_links():
215
+ """Show summary page and update CI links."""
216
+ return create_summary_page(Ci_results.df, Ci_results.available_models), get_description_text(), get_ci_links()
217
+
218
+ summary_button.click(
219
+ fn=show_summary_and_update_links,
220
+ outputs=[summary_display, description_display, ci_links_display]
221
+ ).then(
222
+ fn=lambda: [gr.update(visible=True), gr.update(visible=False)],
223
+ outputs=[summary_display, detail_view]
224
+ )
225
+
226
+ # Function to get CI job links
227
+ def get_ci_links():
228
+ """Get CI job links from the most recent data."""
229
+ try:
230
+ # Check if df exists and is not empty
231
+ if Ci_results.df is None or Ci_results.df.empty:
232
+ return "🔗 **CI Jobs:** *Loading...*"
233
+
234
+ # Get links from any available model (they should be the same for all models in a run)
235
+ amd_multi_link = None
236
+ amd_single_link = None
237
+ nvidia_multi_link = None
238
+ nvidia_single_link = None
239
+
240
+ for model_name in Ci_results.df.index:
241
+ row = Ci_results.df.loc[model_name]
242
+
243
+ # Extract AMD links
244
+ if pd.notna(row.get('job_link_amd')) and (not amd_multi_link or not amd_single_link):
245
+ amd_link_raw = row.get('job_link_amd')
246
+ if isinstance(amd_link_raw, dict):
247
+ if 'multi' in amd_link_raw and not amd_multi_link:
248
+ amd_multi_link = amd_link_raw['multi']
249
+ if 'single' in amd_link_raw and not amd_single_link:
250
+ amd_single_link = amd_link_raw['single']
251
+
252
+ # Extract NVIDIA links
253
+ if pd.notna(row.get('job_link_nvidia')) and (not nvidia_multi_link or not nvidia_single_link):
254
+ nvidia_link_raw = row.get('job_link_nvidia')
255
+ if isinstance(nvidia_link_raw, dict):
256
+ if 'multi' in nvidia_link_raw and not nvidia_multi_link:
257
+ nvidia_multi_link = nvidia_link_raw['multi']
258
+ if 'single' in nvidia_link_raw and not nvidia_single_link:
259
+ nvidia_single_link = nvidia_link_raw['single']
260
+
261
+ # Break if we have all links
262
+ if amd_multi_link and amd_single_link and nvidia_multi_link and nvidia_single_link:
263
+ break
264
+
265
+
266
+ # Add FAQ link at the bottom
267
+ links_md = "❓ [**FAQ**](https://huggingface.co/spaces/transformers-community/transformers-ci-dashboard/blob/main/README.md)\n\n"
268
+ links_md += "🔗 **CI Jobs:**\n\n"
269
+
270
+ # AMD links
271
+ if amd_multi_link or amd_single_link:
272
+ links_md += "**AMD:**\n"
273
+ if amd_multi_link:
274
+ links_md += f"• [Multi GPU]({amd_multi_link})\n"
275
+ if amd_single_link:
276
+ links_md += f"• [Single GPU]({amd_single_link})\n"
277
+ links_md += "\n"
278
+
279
+ # NVIDIA links
280
+ if nvidia_multi_link or nvidia_single_link:
281
+ links_md += "**NVIDIA:**\n"
282
+ if nvidia_multi_link:
283
+ links_md += f"• [Multi GPU]({nvidia_multi_link})\n"
284
+ if nvidia_single_link:
285
+ links_md += f"• [Single GPU]({nvidia_single_link})\n"
286
+
287
+ if not (amd_multi_link or amd_single_link or nvidia_multi_link or nvidia_single_link):
288
+ links_md += "*No links available*"
289
+
290
+ return links_md
291
+ except Exception as e:
292
+ logger.error(f"getting CI links: {e}")
293
+ return "🔗 **CI Jobs:** *Error loading links*\n\n❓ **[FAQ](README.md)**"
294
+
295
+
296
+ # Auto-update CI links when the interface loads
297
+ demo.load(
298
+ fn=get_ci_links,
299
+ outputs=[ci_links_display]
300
+ )
301
+
302
+
303
+ # Gradio entrypoint
304
+ if __name__ == "__main__":
305
+ demo.launch()
data.py ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from huggingface_hub import HfFileSystem
2
+ import pandas as pd
3
+ from utils import logger
4
+ from datetime import datetime
5
+ import threading
6
+ import traceback
7
+ import json
8
+ import re
9
+
10
+ # NOTE: if caching is an issue, try adding `use_listings_cache=False`
11
+ fs = HfFileSystem()
12
+
13
+ IMPORTANT_MODELS = [
14
+ "auto",
15
+ "bert", # old but dominant (encoder only)
16
+ "gpt2", # old (decoder)
17
+ "t5", # old (encoder-decoder)
18
+ "modernbert", # (encoder only)
19
+ "vit", # old (vision) - fixed comma
20
+ "clip", # old but dominant (vision)
21
+ "detr", # objection detection, segmentation (vision)
22
+ "table-transformer", # objection detection (visioin) - maybe just detr?
23
+ "got_ocr2", # ocr (vision)
24
+ "whisper", # old but dominant (audio)
25
+ "wav2vec2", # old (audio)
26
+ "llama", # new and dominant (meta)
27
+ "gemma3", # new (google)
28
+ "qwen2", # new (Alibaba)
29
+ "mistral3", # new (Mistral) - added missing comma
30
+ "qwen2_5_vl", # new (vision)
31
+ "llava", # many models from it (vision)
32
+ "smolvlm", # new (video)
33
+ "internvl", # new (video)
34
+ "gemma3n", # new (omnimodal models)
35
+ "qwen2_5_omni", # new (omnimodal models)
36
+ ]
37
+
38
+ KEYS_TO_KEEP = [
39
+ "success_amd",
40
+ "success_nvidia",
41
+ "skipped_amd",
42
+ "skipped_nvidia",
43
+ "failed_multi_no_amd",
44
+ "failed_multi_no_nvidia",
45
+ "failed_single_no_amd",
46
+ "failed_single_no_nvidia",
47
+ "failures_amd",
48
+ "failures_nvidia",
49
+ "job_link_amd",
50
+ "job_link_nvidia",
51
+ ]
52
+
53
+
54
+ def log_dataframe_link(link: str) -> str:
55
+ """
56
+ Adds the link to the dataset in the logs, modifies it to get a clockable link and then returns the date of the
57
+ report.
58
+ """
59
+ logger.info(f"Reading df located at {link}")
60
+ # Make sure the links starts with an http adress
61
+ if link.startswith("hf://"):
62
+ link = "https://huggingface.co/" + link.removeprefix("hf://")
63
+ # Pattern to match transformers_daily_ci followed by any path, then a date (YYYY-MM-DD format)
64
+ pattern = r'transformers_daily_ci(.*?)/(\d{4}-\d{2}-\d{2})'
65
+ match = re.search(pattern, link)
66
+ # Failure case:
67
+ if not match:
68
+ logger.error("Could not find transformers_daily_ci and.or date in the link")
69
+ return "9999-99-99"
70
+ # Replace the path between with blob/main
71
+ path_between = match.group(1)
72
+ link = link.replace("transformers_daily_ci" + path_between, "transformers_daily_ci/blob/main")
73
+ logger.info(f"Link to data source: {link}")
74
+ # Return the date
75
+ return match.group(2)
76
+
77
+ def infer_latest_update_msg(date_df_amd: str, date_df_nvidia: str) -> str:
78
+ # Early return if one of the dates is invalid
79
+ if date_df_amd.startswith("9999") and date_df_nvidia.startswith("9999"):
80
+ return "could not find last update time"
81
+ # Warn if dates are not the same
82
+ if date_df_amd != date_df_nvidia:
83
+ logger.warning(f"Different dates found: {date_df_amd} (AMD) vs {date_df_nvidia} (NVIDIA)")
84
+ # Take the latest date and format it
85
+ try:
86
+ latest_date = max(date_df_amd, date_df_nvidia)
87
+ yyyy, mm, dd = latest_date.split("-")
88
+ return f"last updated {mm}/{dd}/{yyyy}"
89
+ except Exception as e:
90
+ logger.error(f"When trying to infer latest date, got error {e}")
91
+ return "could not find last update time"
92
+
93
+ def read_one_dataframe(json_path: str, device_label: str) -> tuple[pd.DataFrame, str]:
94
+ df_upload_date = log_dataframe_link(json_path)
95
+ df = pd.read_json(json_path, orient="index", encoding_errors="ignore")
96
+ df.index.name = "model_name"
97
+ df[f"failed_multi_no_{device_label}"] = df["failures"].apply(lambda x: len(x["multi"]) if "multi" in x else 0)
98
+ df[f"failed_single_no_{device_label}"] = df["failures"].apply(lambda x: len(x["single"]) if "single" in x else 0)
99
+ return df, df_upload_date
100
+
101
+ def get_distant_data() -> tuple[pd.DataFrame, str]:
102
+ # Retrieve AMD dataframe
103
+ amd_src = "hf://datasets/optimum-amd/transformers_daily_ci/**/runs/**/ci_results_run_models_gpu/model_results.json"
104
+ files_amd = sorted(fs.glob(amd_src, refresh=True), reverse=True)
105
+ df_amd, date_df_amd = read_one_dataframe(f"hf://{files_amd[0]}", "amd")
106
+ # Retrieve NVIDIA dataframe, which pattern should be:
107
+ # hf://datasets/hf-internal-testing`/transformers_daily_ci/raw/main/YYYY-MM-DD/ci_results_run_models_gpu/model_results.json
108
+ nvidia_src = "hf://datasets/hf-internal-testing/transformers_daily_ci/*/ci_results_run_models_gpu/model_results.json"
109
+ files_nvidia = sorted(fs.glob(nvidia_src, refresh=True), reverse=True)
110
+ # NOTE: should this be removeprefix instead of lstrip?
111
+ nvidia_path = files_nvidia[0].lstrip('datasets/hf-internal-testing/transformers_daily_ci/')
112
+ nvidia_path = "https://huggingface.co/datasets/hf-internal-testing/transformers_daily_ci/raw/main/" + nvidia_path
113
+ df_nvidia, date_df_nvidia = read_one_dataframe(nvidia_path, "nvidia")
114
+ # Infer and format the latest df date
115
+ latest_update_msg = infer_latest_update_msg(date_df_amd, date_df_nvidia)
116
+ # Join both dataframes
117
+ joined = df_amd.join(df_nvidia, rsuffix="_nvidia", lsuffix="_amd", how="outer")
118
+ joined = joined[KEYS_TO_KEEP]
119
+ joined.index = joined.index.str.replace("^models_", "", regex=True)
120
+ # Fitler out all but important models
121
+ important_models_lower = [model.lower() for model in IMPORTANT_MODELS]
122
+ filtered_joined = joined[joined.index.str.lower().isin(important_models_lower)]
123
+ # Warn for ach missing important models
124
+ for model in IMPORTANT_MODELS:
125
+ if model not in filtered_joined.index:
126
+ print(f"[WARNING] Model {model} was missing from index.")
127
+ return filtered_joined, latest_update_msg
128
+
129
+
130
+ def get_sample_data() -> tuple[pd.DataFrame, str]:
131
+ # Retrieve sample dataframes
132
+ df_amd, _ = read_one_dataframe("sample_amd.json", "amd")
133
+ df_nvidia, _ = read_one_dataframe("sample_nvidia.json", "nvidia")
134
+ # Join both dataframes
135
+ joined = df_amd.join(df_nvidia, rsuffix="_nvidia", lsuffix="_amd", how="outer")
136
+ joined = joined[KEYS_TO_KEEP]
137
+ joined.index = joined.index.str.replace("^models_", "", regex=True)
138
+ # Fitler out all but important models
139
+ important_models_lower = [model.lower() for model in IMPORTANT_MODELS]
140
+ filtered_joined = joined[joined.index.str.lower().isin(important_models_lower)]
141
+ # Prefix all model names with "sample_"
142
+ filtered_joined.index = "sample_" + filtered_joined.index
143
+ return filtered_joined, "sample data was loaded"
144
+
145
+ def safe_extract(row: pd.DataFrame, key: str) -> int:
146
+ return int(row.get(key, 0)) if pd.notna(row.get(key, 0)) else 0
147
+
148
+ def extract_model_data(row: pd.Series) -> tuple[dict[str, int], dict[str, int], int, int, int, int]:
149
+ """Extract and process model data from DataFrame row."""
150
+ # Handle missing values and get counts directly from dataframe
151
+ success_nvidia = safe_extract(row, "success_nvidia")
152
+ success_amd = safe_extract(row, "success_amd")
153
+
154
+ skipped_nvidia = safe_extract(row, "skipped_nvidia")
155
+ skipped_amd = safe_extract(row, "skipped_amd")
156
+
157
+ failed_multi_amd = safe_extract(row, 'failed_multi_no_amd')
158
+ failed_multi_nvidia = safe_extract(row, 'failed_multi_no_nvidia')
159
+ failed_single_amd = safe_extract(row, 'failed_single_no_amd')
160
+ failed_single_nvidia = safe_extract(row, 'failed_single_no_nvidia')
161
+ # Calculate total failures
162
+ total_failed_amd = failed_multi_amd + failed_single_amd
163
+ total_failed_nvidia = failed_multi_nvidia + failed_single_nvidia
164
+ # Create stats dictionaries directly from dataframe values
165
+ amd_stats = {
166
+ 'passed': success_amd,
167
+ 'failed': total_failed_amd,
168
+ 'skipped': skipped_amd,
169
+ 'error': 0 # Not available in this dataset
170
+ }
171
+ nvidia_stats = {
172
+ 'passed': success_nvidia,
173
+ 'failed': total_failed_nvidia,
174
+ 'skipped': skipped_nvidia,
175
+ 'error': 0 # Not available in this dataset
176
+ }
177
+ return amd_stats, nvidia_stats, failed_multi_amd, failed_single_amd, failed_multi_nvidia, failed_single_nvidia
178
+
179
+
180
+
181
+ class CIResults:
182
+
183
+ def __init__(self):
184
+ self.df = pd.DataFrame()
185
+ self.available_models = []
186
+ self.latest_update_msg = ""
187
+
188
+ def load_data(self) -> None:
189
+ """Load data from the data source."""
190
+ # Try loading the distant data, and fall back on sample data for local tinkering
191
+ try:
192
+ logger.info("Loading distant data...")
193
+ new_df, latest_update_msg = get_distant_data()
194
+ self.latest_update_msg = latest_update_msg
195
+ except Exception as e:
196
+ error_msg = [
197
+ "Loading data failed:",
198
+ "-" * 120,
199
+ traceback.format_exc(),
200
+ "-" * 120,
201
+ "Falling back on sample data."
202
+ ]
203
+ logger.error("\n".join(error_msg))
204
+ new_df, latest_update_msg = get_sample_data()
205
+ self.latest_update_msg = latest_update_msg
206
+ # Update attributes
207
+ self.df = new_df
208
+ self.available_models = new_df.index.tolist()
209
+ # Log and return distant load status
210
+ logger.info(f"Data loaded successfully: {len(self.available_models)} models")
211
+ logger.info(f"Models: {self.available_models[:5]}{'...' if len(self.available_models) > 5 else ''}")
212
+ logger.info(f"Latest update message: {self.latest_update_msg}")
213
+ # Log a preview of the df
214
+ msg = {}
215
+ for model in self.available_models[:3]:
216
+ msg[model] = {}
217
+ for col in self.df.columns:
218
+ value = self.df.loc[model, col]
219
+ if not isinstance(value, int):
220
+ value = str(value)
221
+ if len(value) > 10:
222
+ value = value[:10] + "..."
223
+ msg[model][col] = value
224
+ logger.info(json.dumps(msg, indent=4))
225
+
226
+ def schedule_data_reload(self):
227
+ """Schedule the next data reload."""
228
+ def reload_data():
229
+ self.load_data()
230
+ # Schedule the next reload in 15 minutes (900 seconds)
231
+ timer = threading.Timer(900.0, reload_data)
232
+ timer.daemon = True # Dies when main thread dies
233
+ timer.start()
234
+ logger.info("Next data reload scheduled in 15 minutes")
235
+
236
+ # Start the first reload timer
237
+ timer = threading.Timer(900.0, reload_data)
238
+ timer.daemon = True
239
+ timer.start()
240
+ logger.info("Data auto-reload scheduled every 15 minutes")
model_page.py ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import matplotlib.pyplot as plt
2
+ import pandas as pd
3
+ from utils import generate_underlined_line
4
+ from data import extract_model_data
5
+
6
+ # Figure dimensions
7
+ FIGURE_WIDTH_DUAL = 18
8
+ FIGURE_HEIGHT_DUAL = 9
9
+
10
+ # Colors
11
+ COLORS = {
12
+ 'passed': '#4CAF50', # Medium green
13
+ 'failed': '#E53E3E', # More red
14
+ 'skipped': '#FFD54F', # Medium yellow
15
+ 'error': '#8B0000' # Dark red
16
+ }
17
+
18
+ # Styling constants
19
+ BLACK = '#000000'
20
+ LABEL_COLOR = '#AAAAAA'
21
+ TITLE_COLOR = '#FFFFFF'
22
+
23
+ # Font sizes
24
+ DEVICE_TITLE_FONT_SIZE = 28
25
+
26
+ # Layout constants
27
+ SEPARATOR_LINE_Y_END = 0.85
28
+ SUBPLOT_TOP = 0.85
29
+ SUBPLOT_WSPACE = 0.4
30
+ PIE_START_ANGLE = 90
31
+ BORDER_LINE_WIDTH = 0.5
32
+ SEPARATOR_ALPHA = 0.5
33
+ SEPARATOR_LINE_WIDTH = 1
34
+ DEVICE_TITLE_PAD = 2
35
+ MODEL_TITLE_Y = 1
36
+
37
+ # Processing constants
38
+ MAX_FAILURE_ITEMS = 10
39
+
40
+
41
+ def _create_pie_chart(ax: plt.Axes, device_label: str, filtered_stats: dict) -> None:
42
+ """Create a pie chart for device statistics."""
43
+ if not filtered_stats:
44
+ ax.text(0.5, 0.5, 'No test results',
45
+ horizontalalignment='center', verticalalignment='center',
46
+ transform=ax.transAxes, fontsize=14, color='#888888',
47
+ fontfamily='monospace', weight='normal')
48
+ ax.set_title(device_label, fontsize=DEVICE_TITLE_FONT_SIZE, weight='bold',
49
+ pad=DEVICE_TITLE_PAD, color=TITLE_COLOR, fontfamily='monospace')
50
+ ax.axis('off')
51
+ return
52
+
53
+ chart_colors = [COLORS[category] for category in filtered_stats.keys()]
54
+
55
+ # Create minimal pie chart - full pie, no donut effect
56
+ wedges, texts, autotexts = ax.pie(
57
+ filtered_stats.values(),
58
+ labels=[label.lower() for label in filtered_stats.keys()], # Lowercase for minimal look
59
+ colors=chart_colors,
60
+ autopct=lambda pct: f'{round(pct * sum(filtered_stats.values()) / 100)}',
61
+ startangle=PIE_START_ANGLE,
62
+ explode=None, # No separation
63
+ shadow=False,
64
+ wedgeprops=dict(edgecolor='#1a1a1a', linewidth=BORDER_LINE_WIDTH), # Minimal borders
65
+ textprops={'fontsize': 12, 'weight': 'normal',
66
+ 'color': LABEL_COLOR, 'fontfamily': 'monospace'}
67
+ )
68
+
69
+ # Enhanced percentage text styling for better readability
70
+ for autotext in autotexts:
71
+ autotext.set_color(BLACK) # Black text for better contrast
72
+ autotext.set_weight('bold')
73
+ autotext.set_fontsize(14)
74
+ autotext.set_fontfamily('monospace')
75
+
76
+ # Minimal category labels
77
+ for text in texts:
78
+ text.set_color(LABEL_COLOR)
79
+ text.set_weight('normal')
80
+ text.set_fontsize(13)
81
+ text.set_fontfamily('monospace')
82
+
83
+ # Device label closer to chart and bigger
84
+ ax.set_title(device_label, fontsize=DEVICE_TITLE_FONT_SIZE, weight='normal',
85
+ pad=DEVICE_TITLE_PAD, color=TITLE_COLOR, fontfamily='monospace')
86
+
87
+
88
+ def plot_model_stats(df: pd.DataFrame, model_name: str) -> tuple[plt.Figure, str, str]:
89
+ """Draws pie charts of model's passed, failed, skipped, and error stats for AMD and NVIDIA."""
90
+ # Handle case where the dataframe is empty or the model name could not be found in it
91
+ if df.empty or model_name not in df.index:
92
+ # Create empty stats for both devices
93
+ amd_filtered = {}
94
+ nvidia_filtered = {}
95
+ failures_amd = failures_nvidia = {}
96
+ else:
97
+ row = df.loc[model_name]
98
+
99
+ # Extract and process model data
100
+ amd_stats, nvidia_stats = extract_model_data(row)[:2]
101
+
102
+ # Filter out categories with 0 values for cleaner visualization
103
+ amd_filtered = {k: v for k, v in amd_stats.items() if v > 0}
104
+ nvidia_filtered = {k: v for k, v in nvidia_stats.items() if v > 0}
105
+
106
+ # Generate failure info directly from dataframe
107
+ failures_amd = row.get('failures_amd', None)
108
+ failures_amd = {} if (failures_amd is None or pd.isna(failures_amd)) else dict(failures_amd)
109
+ failures_nvidia = row.get('failures_nvidia')
110
+ failures_nvidia = {} if (failures_nvidia is None or pd.isna(failures_nvidia)) else dict(failures_nvidia)
111
+
112
+ # failure_xxx = {"single": [test, ...], "multi": [...]}
113
+ # test = {"line": test_name. "trace": error_msg}
114
+
115
+ # Always create figure with two subplots side by side with padding
116
+ fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(FIGURE_WIDTH_DUAL, FIGURE_HEIGHT_DUAL), facecolor=BLACK)
117
+ ax1.set_facecolor(BLACK)
118
+ ax2.set_facecolor(BLACK)
119
+
120
+ # Create both pie charts with device labels
121
+ _create_pie_chart(ax1, "amd", amd_filtered)
122
+ _create_pie_chart(ax2, "nvidia", nvidia_filtered)
123
+
124
+ # Add subtle separation line between charts - stops at device labels level
125
+ line_x = 0.5
126
+ fig.add_artist(plt.Line2D([line_x, line_x], [0.0, SEPARATOR_LINE_Y_END],
127
+ color='#333333', linewidth=SEPARATOR_LINE_WIDTH,
128
+ alpha=SEPARATOR_ALPHA, transform=fig.transFigure))
129
+
130
+ # Add central shared title for model name
131
+ fig.suptitle(f'{model_name.lower()}', fontsize=32, weight='bold',
132
+ color='#CCCCCC', fontfamily='monospace', y=MODEL_TITLE_Y)
133
+
134
+ # Clean layout with padding and space for central title
135
+ plt.tight_layout()
136
+ plt.subplots_adjust(top=SUBPLOT_TOP, wspace=SUBPLOT_WSPACE)
137
+
138
+ amd_failed_info = prepare_textbox_content(failures_amd, 'AMD', bool(amd_filtered))
139
+ nvidia_failed_info = prepare_textbox_content(failures_nvidia, 'NVIDIA', bool(nvidia_filtered))
140
+
141
+ return fig, amd_failed_info, nvidia_failed_info
142
+
143
+
144
+ def prepare_textbox_content(failures: dict[str, list], device: str, data_available: bool) -> str:
145
+ """Extract failure information from failures object."""
146
+ # Catch the case where there is no data
147
+ if not data_available:
148
+ return generate_underlined_line(f"No data for {device}")
149
+ # Catch the case where there are no failures
150
+ if not failures:
151
+ return generate_underlined_line(f"No failures for {device}")
152
+
153
+ # Summary of failures
154
+ single_failures = failures.get("single", [])
155
+ multi_failures = failures.get("multi", [])
156
+ info_lines = [
157
+ generate_underlined_line(f"Failure summary for {device}:"),
158
+ f"Single GPU failures: {len(single_failures)}",
159
+ f"Multi GPU failures: {len(multi_failures)}",
160
+ ""
161
+ ]
162
+
163
+ # Add single-gpu failures
164
+ if single_failures:
165
+ info_lines.append(generate_underlined_line("Single GPU failures:"))
166
+ for test in single_failures:
167
+ name = test.get("line", "::*could not find name*")
168
+ name = name.split("::")[-1]
169
+ info_lines.append(name)
170
+ info_lines.append("\n")
171
+
172
+ # Add multi-gpu failures
173
+ if multi_failures:
174
+ info_lines.append(generate_underlined_line("Multi GPU failures:"))
175
+ for test in multi_failures:
176
+ name = test.get("line", "::*could not find name*")
177
+ name = name.split("::")[-1]
178
+ info_lines.append(name)
179
+
180
+ return "\n".join(info_lines)
requirements.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ matplotlib>=3.8
sample_amd.json ADDED
@@ -0,0 +1,1839 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "models_auto": {
3
+ "failed": {
4
+ "PyTorch": {
5
+ "unclassified": 0,
6
+ "single": 0,
7
+ "multi": 0
8
+ },
9
+ "TensorFlow": {
10
+ "unclassified": 0,
11
+ "single": 0,
12
+ "multi": 0
13
+ },
14
+ "Flax": {
15
+ "unclassified": 0,
16
+ "single": 0,
17
+ "multi": 0
18
+ },
19
+ "Tokenizers": {
20
+ "unclassified": 0,
21
+ "single": 0,
22
+ "multi": 0
23
+ },
24
+ "Pipelines": {
25
+ "unclassified": 0,
26
+ "single": 0,
27
+ "multi": 0
28
+ },
29
+ "Trainer": {
30
+ "unclassified": 0,
31
+ "single": 0,
32
+ "multi": 0
33
+ },
34
+ "ONNX": {
35
+ "unclassified": 0,
36
+ "single": 0,
37
+ "multi": 0
38
+ },
39
+ "Auto": {
40
+ "unclassified": 0,
41
+ "single": 0,
42
+ "multi": 0
43
+ },
44
+ "Quantization": {
45
+ "unclassified": 0,
46
+ "single": 0,
47
+ "multi": 0
48
+ },
49
+ "Unclassified": {
50
+ "unclassified": 0,
51
+ "single": 0,
52
+ "multi": 0
53
+ }
54
+ },
55
+ "errors": 0,
56
+ "success": 80,
57
+ "skipped": 2,
58
+ "time_spent": "0.99, 2.41, ",
59
+ "failures": {},
60
+ "job_link": {
61
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301329937",
62
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330183"
63
+ }
64
+ },
65
+ "models_bert": {
66
+ "failed": {
67
+ "PyTorch": {
68
+ "unclassified": 0,
69
+ "single": 0,
70
+ "multi": 0
71
+ },
72
+ "TensorFlow": {
73
+ "unclassified": 0,
74
+ "single": 0,
75
+ "multi": 0
76
+ },
77
+ "Flax": {
78
+ "unclassified": 0,
79
+ "single": 0,
80
+ "multi": 0
81
+ },
82
+ "Tokenizers": {
83
+ "unclassified": 0,
84
+ "single": 0,
85
+ "multi": 0
86
+ },
87
+ "Pipelines": {
88
+ "unclassified": 0,
89
+ "single": 0,
90
+ "multi": 0
91
+ },
92
+ "Trainer": {
93
+ "unclassified": 0,
94
+ "single": 0,
95
+ "multi": 0
96
+ },
97
+ "ONNX": {
98
+ "unclassified": 0,
99
+ "single": 0,
100
+ "multi": 0
101
+ },
102
+ "Auto": {
103
+ "unclassified": 0,
104
+ "single": 0,
105
+ "multi": 0
106
+ },
107
+ "Quantization": {
108
+ "unclassified": 0,
109
+ "single": 0,
110
+ "multi": 0
111
+ },
112
+ "Unclassified": {
113
+ "unclassified": 0,
114
+ "single": 0,
115
+ "multi": 0
116
+ }
117
+ },
118
+ "errors": 0,
119
+ "success": 239,
120
+ "skipped": 111,
121
+ "time_spent": "8.85, 0:01:00, ",
122
+ "failures": {},
123
+ "job_link": {
124
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301329946",
125
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330199"
126
+ }
127
+ },
128
+ "models_clip": {
129
+ "failed": {
130
+ "PyTorch": {
131
+ "unclassified": 0,
132
+ "single": 0,
133
+ "multi": 0
134
+ },
135
+ "TensorFlow": {
136
+ "unclassified": 0,
137
+ "single": 0,
138
+ "multi": 0
139
+ },
140
+ "Flax": {
141
+ "unclassified": 0,
142
+ "single": 0,
143
+ "multi": 0
144
+ },
145
+ "Tokenizers": {
146
+ "unclassified": 0,
147
+ "single": 0,
148
+ "multi": 0
149
+ },
150
+ "Pipelines": {
151
+ "unclassified": 0,
152
+ "single": 0,
153
+ "multi": 0
154
+ },
155
+ "Trainer": {
156
+ "unclassified": 0,
157
+ "single": 0,
158
+ "multi": 0
159
+ },
160
+ "ONNX": {
161
+ "unclassified": 0,
162
+ "single": 0,
163
+ "multi": 0
164
+ },
165
+ "Auto": {
166
+ "unclassified": 0,
167
+ "single": 0,
168
+ "multi": 0
169
+ },
170
+ "Quantization": {
171
+ "unclassified": 0,
172
+ "single": 0,
173
+ "multi": 0
174
+ },
175
+ "Unclassified": {
176
+ "unclassified": 0,
177
+ "single": 0,
178
+ "multi": 0
179
+ }
180
+ },
181
+ "errors": 0,
182
+ "success": 288,
183
+ "skipped": 590,
184
+ "time_spent": "0:01:55, 0:01:58, ",
185
+ "failures": {},
186
+ "job_link": {
187
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330217",
188
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301329991"
189
+ }
190
+ },
191
+ "models_detr": {
192
+ "failed": {
193
+ "PyTorch": {
194
+ "unclassified": 0,
195
+ "single": 0,
196
+ "multi": 0
197
+ },
198
+ "TensorFlow": {
199
+ "unclassified": 0,
200
+ "single": 0,
201
+ "multi": 0
202
+ },
203
+ "Flax": {
204
+ "unclassified": 0,
205
+ "single": 0,
206
+ "multi": 0
207
+ },
208
+ "Tokenizers": {
209
+ "unclassified": 0,
210
+ "single": 0,
211
+ "multi": 0
212
+ },
213
+ "Pipelines": {
214
+ "unclassified": 0,
215
+ "single": 0,
216
+ "multi": 0
217
+ },
218
+ "Trainer": {
219
+ "unclassified": 0,
220
+ "single": 0,
221
+ "multi": 0
222
+ },
223
+ "ONNX": {
224
+ "unclassified": 0,
225
+ "single": 0,
226
+ "multi": 0
227
+ },
228
+ "Auto": {
229
+ "unclassified": 0,
230
+ "single": 0,
231
+ "multi": 0
232
+ },
233
+ "Quantization": {
234
+ "unclassified": 0,
235
+ "single": 0,
236
+ "multi": 0
237
+ },
238
+ "Unclassified": {
239
+ "unclassified": 0,
240
+ "single": 0,
241
+ "multi": 0
242
+ }
243
+ },
244
+ "errors": 0,
245
+ "success": 77,
246
+ "skipped": 159,
247
+ "time_spent": "4.40, 6.77, ",
248
+ "failures": {},
249
+ "job_link": {
250
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330035",
251
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330267"
252
+ }
253
+ },
254
+ "models_gemma3": {
255
+ "failed": {
256
+ "PyTorch": {
257
+ "unclassified": 0,
258
+ "single": 6,
259
+ "multi": 7
260
+ },
261
+ "TensorFlow": {
262
+ "unclassified": 0,
263
+ "single": 0,
264
+ "multi": 0
265
+ },
266
+ "Flax": {
267
+ "unclassified": 0,
268
+ "single": 0,
269
+ "multi": 0
270
+ },
271
+ "Tokenizers": {
272
+ "unclassified": 0,
273
+ "single": 0,
274
+ "multi": 0
275
+ },
276
+ "Pipelines": {
277
+ "unclassified": 0,
278
+ "single": 0,
279
+ "multi": 0
280
+ },
281
+ "Trainer": {
282
+ "unclassified": 0,
283
+ "single": 0,
284
+ "multi": 0
285
+ },
286
+ "ONNX": {
287
+ "unclassified": 0,
288
+ "single": 0,
289
+ "multi": 0
290
+ },
291
+ "Auto": {
292
+ "unclassified": 0,
293
+ "single": 0,
294
+ "multi": 0
295
+ },
296
+ "Quantization": {
297
+ "unclassified": 0,
298
+ "single": 0,
299
+ "multi": 0
300
+ },
301
+ "Unclassified": {
302
+ "unclassified": 0,
303
+ "single": 0,
304
+ "multi": 0
305
+ }
306
+ },
307
+ "errors": 0,
308
+ "success": 349,
309
+ "skipped": 260,
310
+ "time_spent": "0:11:14, 0:11:08, ",
311
+ "failures": {
312
+ "single": [
313
+ {
314
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3IntegrationTest::test_model_1b_text_only",
315
+ "trace": "(line 715) AssertionError: Lists differ: ['Wri[57 chars]s, a silent stream,\\nInto the neural net, a wa[42 chars],\\n'] != ['Wri[57 chars]s, a river deep,\\nWith patterns hidden, secret[46 chars]ing']"
316
+ },
317
+ {
318
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3IntegrationTest::test_model_4b_batch",
319
+ "trace": "(line 715) AssertionError: Lists differ: ['use[114 chars]rown cow standing on a sandy beach with clear [264 chars]cow\"] != ['use[114 chars]rown and white cow standing on a sandy beach n[272 chars]ach']"
320
+ },
321
+ {
322
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3IntegrationTest::test_model_4b_batch_crops",
323
+ "trace": "(line 715) AssertionError: Lists differ: [\"user\\nYou are a helpful assistant.\\n\\nHe[678 chars]h a'] != ['user\\nYou are a helpful assistant.\\n\\nHe[658 chars]h a']"
324
+ },
325
+ {
326
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3IntegrationTest::test_model_4b_bf16",
327
+ "trace": "(line 715) AssertionError: Lists differ: ['use[114 chars]rown cow standing on a sandy beach with clear [55 chars]ike'] != ['use[114 chars]rown and white cow standing on a sandy beach w[68 chars]oks']"
328
+ },
329
+ {
330
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3IntegrationTest::test_model_4b_crops",
331
+ "trace": "(line 715) AssertionError: Lists differ: [\"use[251 chars]. There's a blue sky with some white clouds in the background\"] != [\"use[251 chars]. There's a bright blue sky with some white clouds in the\"]"
332
+ },
333
+ {
334
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3IntegrationTest::test_model_4b_multiimage",
335
+ "trace": "(line 715) AssertionError: Lists differ: [\"use[122 chars]n\\n**Main Features:**\\n\\n* **Chinese Archway[19 chars]ent\"] != [\"use[122 chars]n\\n**Overall Scene:**\\n\\nIt looks like a stree[18 chars]nt,\"]"
336
+ }
337
+ ],
338
+ "multi": [
339
+ {
340
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3Vision2TextModelTest::test_model_parallelism",
341
+ "trace": "(line 925) RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:1 and cuda:0!"
342
+ },
343
+ {
344
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3IntegrationTest::test_model_1b_text_only",
345
+ "trace": "(line 715) AssertionError: Lists differ: ['Wri[57 chars]s, a silent stream,\\nInto the neural net, a wa[42 chars],\\n'] != ['Wri[57 chars]s, a river deep,\\nWith patterns hidden, secret[46 chars]ing']"
346
+ },
347
+ {
348
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3IntegrationTest::test_model_4b_batch",
349
+ "trace": "(line 715) AssertionError: Lists differ: ['use[114 chars]rown cow standing on a sandy beach with clear [264 chars]cow\"] != ['use[114 chars]rown and white cow standing on a sandy beach n[272 chars]ach']"
350
+ },
351
+ {
352
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3IntegrationTest::test_model_4b_batch_crops",
353
+ "trace": "(line 715) AssertionError: Lists differ: [\"user\\nYou are a helpful assistant.\\n\\nHe[678 chars]h a'] != ['user\\nYou are a helpful assistant.\\n\\nHe[658 chars]h a']"
354
+ },
355
+ {
356
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3IntegrationTest::test_model_4b_bf16",
357
+ "trace": "(line 715) AssertionError: Lists differ: ['use[114 chars]rown cow standing on a sandy beach with clear [55 chars]ike'] != ['use[114 chars]rown and white cow standing on a sandy beach w[68 chars]oks']"
358
+ },
359
+ {
360
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3IntegrationTest::test_model_4b_crops",
361
+ "trace": "(line 715) AssertionError: Lists differ: [\"use[251 chars]. There's a blue sky with some white clouds in the background\"] != [\"use[251 chars]. There's a bright blue sky with some white clouds in the\"]"
362
+ },
363
+ {
364
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3IntegrationTest::test_model_4b_multiimage",
365
+ "trace": "(line 715) AssertionError: Lists differ: [\"use[122 chars]n\\n**Main Features:**\\n\\n* **Chinese Archway[19 chars]ent\"] != [\"use[122 chars]n\\n**Overall Scene:**\\n\\nIt looks like a stree[18 chars]nt,\"]"
366
+ }
367
+ ]
368
+ },
369
+ "job_link": {
370
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330061",
371
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330319"
372
+ }
373
+ },
374
+ "models_gemma3n": {
375
+ "failed": {
376
+ "PyTorch": {
377
+ "unclassified": 0,
378
+ "single": 0,
379
+ "multi": 0
380
+ },
381
+ "TensorFlow": {
382
+ "unclassified": 0,
383
+ "single": 0,
384
+ "multi": 0
385
+ },
386
+ "Flax": {
387
+ "unclassified": 0,
388
+ "single": 0,
389
+ "multi": 0
390
+ },
391
+ "Tokenizers": {
392
+ "unclassified": 0,
393
+ "single": 0,
394
+ "multi": 0
395
+ },
396
+ "Pipelines": {
397
+ "unclassified": 0,
398
+ "single": 0,
399
+ "multi": 0
400
+ },
401
+ "Trainer": {
402
+ "unclassified": 0,
403
+ "single": 0,
404
+ "multi": 0
405
+ },
406
+ "ONNX": {
407
+ "unclassified": 0,
408
+ "single": 0,
409
+ "multi": 0
410
+ },
411
+ "Auto": {
412
+ "unclassified": 0,
413
+ "single": 0,
414
+ "multi": 0
415
+ },
416
+ "Quantization": {
417
+ "unclassified": 0,
418
+ "single": 0,
419
+ "multi": 0
420
+ },
421
+ "Unclassified": {
422
+ "unclassified": 0,
423
+ "single": 0,
424
+ "multi": 0
425
+ }
426
+ },
427
+ "errors": 0,
428
+ "success": 197,
429
+ "skipped": 635,
430
+ "time_spent": "0:01:06, 0:01:08, ",
431
+ "failures": {},
432
+ "job_link": {
433
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330294",
434
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330077"
435
+ }
436
+ },
437
+ "models_got_ocr2": {
438
+ "failed": {
439
+ "PyTorch": {
440
+ "unclassified": 0,
441
+ "single": 0,
442
+ "multi": 0
443
+ },
444
+ "TensorFlow": {
445
+ "unclassified": 0,
446
+ "single": 0,
447
+ "multi": 0
448
+ },
449
+ "Flax": {
450
+ "unclassified": 0,
451
+ "single": 0,
452
+ "multi": 0
453
+ },
454
+ "Tokenizers": {
455
+ "unclassified": 0,
456
+ "single": 0,
457
+ "multi": 0
458
+ },
459
+ "Pipelines": {
460
+ "unclassified": 0,
461
+ "single": 0,
462
+ "multi": 0
463
+ },
464
+ "Trainer": {
465
+ "unclassified": 0,
466
+ "single": 0,
467
+ "multi": 0
468
+ },
469
+ "ONNX": {
470
+ "unclassified": 0,
471
+ "single": 0,
472
+ "multi": 0
473
+ },
474
+ "Auto": {
475
+ "unclassified": 0,
476
+ "single": 0,
477
+ "multi": 0
478
+ },
479
+ "Quantization": {
480
+ "unclassified": 0,
481
+ "single": 0,
482
+ "multi": 0
483
+ },
484
+ "Unclassified": {
485
+ "unclassified": 0,
486
+ "single": 0,
487
+ "multi": 0
488
+ }
489
+ },
490
+ "errors": 0,
491
+ "success": 147,
492
+ "skipped": 163,
493
+ "time_spent": "0:01:03, 0:01:01, ",
494
+ "failures": {},
495
+ "job_link": {
496
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330314",
497
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330094"
498
+ }
499
+ },
500
+ "models_gpt2": {
501
+ "failed": {
502
+ "PyTorch": {
503
+ "unclassified": 0,
504
+ "single": 0,
505
+ "multi": 0
506
+ },
507
+ "TensorFlow": {
508
+ "unclassified": 0,
509
+ "single": 0,
510
+ "multi": 0
511
+ },
512
+ "Flax": {
513
+ "unclassified": 0,
514
+ "single": 0,
515
+ "multi": 0
516
+ },
517
+ "Tokenizers": {
518
+ "unclassified": 0,
519
+ "single": 0,
520
+ "multi": 0
521
+ },
522
+ "Pipelines": {
523
+ "unclassified": 0,
524
+ "single": 0,
525
+ "multi": 0
526
+ },
527
+ "Trainer": {
528
+ "unclassified": 0,
529
+ "single": 0,
530
+ "multi": 0
531
+ },
532
+ "ONNX": {
533
+ "unclassified": 0,
534
+ "single": 0,
535
+ "multi": 0
536
+ },
537
+ "Auto": {
538
+ "unclassified": 0,
539
+ "single": 0,
540
+ "multi": 0
541
+ },
542
+ "Quantization": {
543
+ "unclassified": 0,
544
+ "single": 0,
545
+ "multi": 0
546
+ },
547
+ "Unclassified": {
548
+ "unclassified": 0,
549
+ "single": 0,
550
+ "multi": 0
551
+ }
552
+ },
553
+ "errors": 0,
554
+ "success": 249,
555
+ "skipped": 99,
556
+ "time_spent": "0:02:01, 0:01:46, ",
557
+ "failures": {},
558
+ "job_link": {
559
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330311",
560
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330113"
561
+ }
562
+ },
563
+ "models_internvl": {
564
+ "failed": {
565
+ "PyTorch": {
566
+ "unclassified": 0,
567
+ "single": 1,
568
+ "multi": 1
569
+ },
570
+ "TensorFlow": {
571
+ "unclassified": 0,
572
+ "single": 0,
573
+ "multi": 0
574
+ },
575
+ "Flax": {
576
+ "unclassified": 0,
577
+ "single": 0,
578
+ "multi": 0
579
+ },
580
+ "Tokenizers": {
581
+ "unclassified": 0,
582
+ "single": 0,
583
+ "multi": 0
584
+ },
585
+ "Pipelines": {
586
+ "unclassified": 0,
587
+ "single": 0,
588
+ "multi": 0
589
+ },
590
+ "Trainer": {
591
+ "unclassified": 0,
592
+ "single": 0,
593
+ "multi": 0
594
+ },
595
+ "ONNX": {
596
+ "unclassified": 0,
597
+ "single": 0,
598
+ "multi": 0
599
+ },
600
+ "Auto": {
601
+ "unclassified": 0,
602
+ "single": 0,
603
+ "multi": 0
604
+ },
605
+ "Quantization": {
606
+ "unclassified": 0,
607
+ "single": 0,
608
+ "multi": 0
609
+ },
610
+ "Unclassified": {
611
+ "unclassified": 0,
612
+ "single": 0,
613
+ "multi": 0
614
+ }
615
+ },
616
+ "errors": 0,
617
+ "success": 253,
618
+ "skipped": 107,
619
+ "time_spent": "0:01:50, 0:02:00, ",
620
+ "failures": {
621
+ "multi": [
622
+ {
623
+ "line": "tests/models/internvl/test_modeling_internvl.py::InternVLLlamaIntegrationTest::test_llama_small_model_integration_forward",
624
+ "trace": "(line 727) AssertionError: False is not true : Actual logits: tensor([ -9.8750, -0.4885, 1.4668, -10.3359, -10.3359], dtype=torch.float16)"
625
+ }
626
+ ],
627
+ "single": [
628
+ {
629
+ "line": "tests/models/internvl/test_modeling_internvl.py::InternVLLlamaIntegrationTest::test_llama_small_model_integration_forward",
630
+ "trace": "(line 727) AssertionError: False is not true : Actual logits: tensor([ -9.8750, -0.4885, 1.4668, -10.3359, -10.3359], dtype=torch.float16)"
631
+ }
632
+ ]
633
+ },
634
+ "job_link": {
635
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330361",
636
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330105"
637
+ }
638
+ },
639
+ "models_llama": {
640
+ "failed": {
641
+ "PyTorch": {
642
+ "unclassified": 0,
643
+ "single": 1,
644
+ "multi": 1
645
+ },
646
+ "TensorFlow": {
647
+ "unclassified": 0,
648
+ "single": 0,
649
+ "multi": 0
650
+ },
651
+ "Flax": {
652
+ "unclassified": 0,
653
+ "single": 0,
654
+ "multi": 0
655
+ },
656
+ "Tokenizers": {
657
+ "unclassified": 0,
658
+ "single": 0,
659
+ "multi": 0
660
+ },
661
+ "Pipelines": {
662
+ "unclassified": 0,
663
+ "single": 0,
664
+ "multi": 0
665
+ },
666
+ "Trainer": {
667
+ "unclassified": 0,
668
+ "single": 0,
669
+ "multi": 0
670
+ },
671
+ "ONNX": {
672
+ "unclassified": 0,
673
+ "single": 0,
674
+ "multi": 0
675
+ },
676
+ "Auto": {
677
+ "unclassified": 0,
678
+ "single": 0,
679
+ "multi": 0
680
+ },
681
+ "Quantization": {
682
+ "unclassified": 0,
683
+ "single": 0,
684
+ "multi": 0
685
+ },
686
+ "Unclassified": {
687
+ "unclassified": 0,
688
+ "single": 0,
689
+ "multi": 0
690
+ }
691
+ },
692
+ "errors": 0,
693
+ "success": 235,
694
+ "skipped": 101,
695
+ "time_spent": "0:03:15, 0:02:51, ",
696
+ "failures": {
697
+ "multi": [
698
+ {
699
+ "line": "tests/models/llama/test_modeling_llama.py::LlamaIntegrationTest::test_model_7b_logits_bf16",
700
+ "trace": "(line 727) AssertionError: False is not true"
701
+ }
702
+ ],
703
+ "single": [
704
+ {
705
+ "line": "tests/models/llama/test_modeling_llama.py::LlamaIntegrationTest::test_model_7b_logits_bf16",
706
+ "trace": "(line 727) AssertionError: False is not true"
707
+ }
708
+ ]
709
+ },
710
+ "job_link": {
711
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330531",
712
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330138"
713
+ }
714
+ },
715
+ "models_llava": {
716
+ "failed": {
717
+ "PyTorch": {
718
+ "unclassified": 0,
719
+ "single": 1,
720
+ "multi": 1
721
+ },
722
+ "TensorFlow": {
723
+ "unclassified": 0,
724
+ "single": 0,
725
+ "multi": 0
726
+ },
727
+ "Flax": {
728
+ "unclassified": 0,
729
+ "single": 0,
730
+ "multi": 0
731
+ },
732
+ "Tokenizers": {
733
+ "unclassified": 0,
734
+ "single": 0,
735
+ "multi": 0
736
+ },
737
+ "Pipelines": {
738
+ "unclassified": 0,
739
+ "single": 0,
740
+ "multi": 0
741
+ },
742
+ "Trainer": {
743
+ "unclassified": 0,
744
+ "single": 0,
745
+ "multi": 0
746
+ },
747
+ "ONNX": {
748
+ "unclassified": 0,
749
+ "single": 0,
750
+ "multi": 0
751
+ },
752
+ "Auto": {
753
+ "unclassified": 0,
754
+ "single": 0,
755
+ "multi": 0
756
+ },
757
+ "Quantization": {
758
+ "unclassified": 0,
759
+ "single": 0,
760
+ "multi": 0
761
+ },
762
+ "Unclassified": {
763
+ "unclassified": 0,
764
+ "single": 0,
765
+ "multi": 0
766
+ }
767
+ },
768
+ "errors": 0,
769
+ "success": 206,
770
+ "skipped": 124,
771
+ "time_spent": "0:03:58, 0:04:34, ",
772
+ "failures": {
773
+ "multi": [
774
+ {
775
+ "line": "tests/models/llava/test_modeling_llava.py::LlavaForConditionalGenerationIntegrationTest::test_batched_generation",
776
+ "trace": "(line 399) importlib.metadata.PackageNotFoundError: No package metadata was found for bitsandbytes"
777
+ }
778
+ ],
779
+ "single": [
780
+ {
781
+ "line": "tests/models/llava/test_modeling_llava.py::LlavaForConditionalGenerationIntegrationTest::test_batched_generation",
782
+ "trace": "(line 399) importlib.metadata.PackageNotFoundError: No package metadata was found for bitsandbytes"
783
+ }
784
+ ]
785
+ },
786
+ "job_link": {
787
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330406",
788
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330161"
789
+ }
790
+ },
791
+ "models_mistral3": {
792
+ "failed": {
793
+ "PyTorch": {
794
+ "unclassified": 0,
795
+ "single": 1,
796
+ "multi": 1
797
+ },
798
+ "TensorFlow": {
799
+ "unclassified": 0,
800
+ "single": 0,
801
+ "multi": 0
802
+ },
803
+ "Flax": {
804
+ "unclassified": 0,
805
+ "single": 0,
806
+ "multi": 0
807
+ },
808
+ "Tokenizers": {
809
+ "unclassified": 0,
810
+ "single": 0,
811
+ "multi": 0
812
+ },
813
+ "Pipelines": {
814
+ "unclassified": 0,
815
+ "single": 0,
816
+ "multi": 0
817
+ },
818
+ "Trainer": {
819
+ "unclassified": 0,
820
+ "single": 0,
821
+ "multi": 0
822
+ },
823
+ "ONNX": {
824
+ "unclassified": 0,
825
+ "single": 0,
826
+ "multi": 0
827
+ },
828
+ "Auto": {
829
+ "unclassified": 0,
830
+ "single": 0,
831
+ "multi": 0
832
+ },
833
+ "Quantization": {
834
+ "unclassified": 0,
835
+ "single": 0,
836
+ "multi": 0
837
+ },
838
+ "Unclassified": {
839
+ "unclassified": 0,
840
+ "single": 0,
841
+ "multi": 0
842
+ }
843
+ },
844
+ "errors": 0,
845
+ "success": 199,
846
+ "skipped": 105,
847
+ "time_spent": "0:04:34, 0:04:39, ",
848
+ "failures": {
849
+ "single": [
850
+ {
851
+ "line": "tests/models/mistral3/test_modeling_mistral3.py::Mistral3IntegrationTest::test_mistral3_integration_generate",
852
+ "trace": "(line 715) AssertionError: 'The [14 chars] two cats lying on a pink surface, which appea[21 chars] bed' != 'The [14 chars] two tabby cats lying on a pink surface, which[23 chars]n or'"
853
+ }
854
+ ],
855
+ "multi": [
856
+ {
857
+ "line": "tests/models/mistral3/test_modeling_mistral3.py::Mistral3IntegrationTest::test_mistral3_integration_generate",
858
+ "trace": "(line 715) AssertionError: 'The [14 chars] two cats lying on a pink surface, which appea[21 chars] bed' != 'The [14 chars] two tabby cats lying on a pink surface, which[23 chars]n or'"
859
+ }
860
+ ]
861
+ },
862
+ "job_link": {
863
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330418",
864
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301329678"
865
+ }
866
+ },
867
+ "models_modernbert": {
868
+ "failed": {
869
+ "PyTorch": {
870
+ "unclassified": 0,
871
+ "single": 0,
872
+ "multi": 0
873
+ },
874
+ "TensorFlow": {
875
+ "unclassified": 0,
876
+ "single": 0,
877
+ "multi": 0
878
+ },
879
+ "Flax": {
880
+ "unclassified": 0,
881
+ "single": 0,
882
+ "multi": 0
883
+ },
884
+ "Tokenizers": {
885
+ "unclassified": 0,
886
+ "single": 0,
887
+ "multi": 0
888
+ },
889
+ "Pipelines": {
890
+ "unclassified": 0,
891
+ "single": 0,
892
+ "multi": 0
893
+ },
894
+ "Trainer": {
895
+ "unclassified": 0,
896
+ "single": 0,
897
+ "multi": 0
898
+ },
899
+ "ONNX": {
900
+ "unclassified": 0,
901
+ "single": 0,
902
+ "multi": 0
903
+ },
904
+ "Auto": {
905
+ "unclassified": 0,
906
+ "single": 0,
907
+ "multi": 0
908
+ },
909
+ "Quantization": {
910
+ "unclassified": 0,
911
+ "single": 0,
912
+ "multi": 0
913
+ },
914
+ "Unclassified": {
915
+ "unclassified": 0,
916
+ "single": 0,
917
+ "multi": 0
918
+ }
919
+ },
920
+ "errors": 0,
921
+ "success": 142,
922
+ "skipped": 102,
923
+ "time_spent": "0:01:03, 9.02, ",
924
+ "failures": {},
925
+ "job_link": {
926
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301329712",
927
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330429"
928
+ }
929
+ },
930
+ "models_qwen2": {
931
+ "failed": {
932
+ "PyTorch": {
933
+ "unclassified": 0,
934
+ "single": 1,
935
+ "multi": 1
936
+ },
937
+ "TensorFlow": {
938
+ "unclassified": 0,
939
+ "single": 0,
940
+ "multi": 0
941
+ },
942
+ "Flax": {
943
+ "unclassified": 0,
944
+ "single": 0,
945
+ "multi": 0
946
+ },
947
+ "Tokenizers": {
948
+ "unclassified": 0,
949
+ "single": 0,
950
+ "multi": 0
951
+ },
952
+ "Pipelines": {
953
+ "unclassified": 0,
954
+ "single": 0,
955
+ "multi": 0
956
+ },
957
+ "Trainer": {
958
+ "unclassified": 0,
959
+ "single": 0,
960
+ "multi": 0
961
+ },
962
+ "ONNX": {
963
+ "unclassified": 0,
964
+ "single": 0,
965
+ "multi": 0
966
+ },
967
+ "Auto": {
968
+ "unclassified": 0,
969
+ "single": 0,
970
+ "multi": 0
971
+ },
972
+ "Quantization": {
973
+ "unclassified": 0,
974
+ "single": 0,
975
+ "multi": 0
976
+ },
977
+ "Unclassified": {
978
+ "unclassified": 0,
979
+ "single": 0,
980
+ "multi": 0
981
+ }
982
+ },
983
+ "errors": 0,
984
+ "success": 217,
985
+ "skipped": 113,
986
+ "time_spent": "0:01:08, 0:01:05, ",
987
+ "failures": {
988
+ "multi": [
989
+ {
990
+ "line": "tests/models/qwen2/test_modeling_qwen2.py::Qwen2IntegrationTest::test_export_static_cache",
991
+ "trace": "(line 715) AssertionError: Lists differ: ['My [35 chars], organic, gluten free, vegan, and vegetarian. I love to use'] != ['My [35 chars], organic, gluten free, vegan, and free from preservatives. I']"
992
+ }
993
+ ],
994
+ "single": [
995
+ {
996
+ "line": "tests/models/qwen2/test_modeling_qwen2.py::Qwen2IntegrationTest::test_export_static_cache",
997
+ "trace": "(line 715) AssertionError: Lists differ: ['My [35 chars], organic, gluten free, vegan, and vegetarian. I love to use'] != ['My [35 chars], organic, gluten free, vegan, and free from preservatives. I']"
998
+ }
999
+ ]
1000
+ },
1001
+ "job_link": {
1002
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301329761",
1003
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330508"
1004
+ }
1005
+ },
1006
+ "models_qwen2_5_omni": {
1007
+ "failed": {
1008
+ "PyTorch": {
1009
+ "unclassified": 0,
1010
+ "single": 2,
1011
+ "multi": 2
1012
+ },
1013
+ "TensorFlow": {
1014
+ "unclassified": 0,
1015
+ "single": 0,
1016
+ "multi": 0
1017
+ },
1018
+ "Flax": {
1019
+ "unclassified": 0,
1020
+ "single": 0,
1021
+ "multi": 0
1022
+ },
1023
+ "Tokenizers": {
1024
+ "unclassified": 0,
1025
+ "single": 0,
1026
+ "multi": 0
1027
+ },
1028
+ "Pipelines": {
1029
+ "unclassified": 0,
1030
+ "single": 0,
1031
+ "multi": 0
1032
+ },
1033
+ "Trainer": {
1034
+ "unclassified": 0,
1035
+ "single": 0,
1036
+ "multi": 0
1037
+ },
1038
+ "ONNX": {
1039
+ "unclassified": 0,
1040
+ "single": 0,
1041
+ "multi": 0
1042
+ },
1043
+ "Auto": {
1044
+ "unclassified": 0,
1045
+ "single": 0,
1046
+ "multi": 0
1047
+ },
1048
+ "Quantization": {
1049
+ "unclassified": 0,
1050
+ "single": 0,
1051
+ "multi": 0
1052
+ },
1053
+ "Unclassified": {
1054
+ "unclassified": 0,
1055
+ "single": 0,
1056
+ "multi": 0
1057
+ }
1058
+ },
1059
+ "errors": 0,
1060
+ "success": 167,
1061
+ "skipped": 141,
1062
+ "time_spent": "0:02:23, 0:01:53, ",
1063
+ "failures": {
1064
+ "multi": [
1065
+ {
1066
+ "line": "tests/models/qwen2_5_omni/test_modeling_qwen2_5_omni.py::Qwen2_5OmniThinkerForConditionalGenerationModelTest::test_model_parallelism",
1067
+ "trace": "(line 715) AssertionError: Items in the second set but not the first:"
1068
+ },
1069
+ {
1070
+ "line": "tests/models/qwen2_5_omni/test_modeling_qwen2_5_omni.py::Qwen2_5OmniModelIntegrationTest::test_small_model_integration_test_batch",
1071
+ "trace": "(line 715) AssertionError: Lists differ: [\"sys[293 chars]s shattering, and the dog appears to be a Labrador Retriever.\"] != [\"sys[293 chars]s shattering, and the dog is a Labrador Retriever.\"]"
1072
+ }
1073
+ ],
1074
+ "single": [
1075
+ {
1076
+ "line": "tests/models/qwen2_5_omni/test_modeling_qwen2_5_omni.py::Qwen2_5OmniModelIntegrationTest::test_small_model_integration_test",
1077
+ "trace": "(line 700) requests.exceptions.ConnectionError: HTTPSConnectionPool(host='qianwen-res.oss-accelerate-overseas.aliyuncs.com', port=443): Max retries exceeded with url: /Qwen2-VL/demo_small.jpg (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7cb8c91d02f0>: Failed to establish a new connection: [Errno -2] Name or service not known'))"
1078
+ },
1079
+ {
1080
+ "line": "tests/models/qwen2_5_omni/test_modeling_qwen2_5_omni.py::Qwen2_5OmniModelIntegrationTest::test_small_model_integration_test_batch",
1081
+ "trace": "(line 715) AssertionError: Lists differ: [\"sys[109 chars]d is a glass shattering, and the dog is a Labr[187 chars]er.\"] != [\"sys[109 chars]d is glass shattering, and the dog is a Labrad[185 chars]er.\"]"
1082
+ }
1083
+ ]
1084
+ },
1085
+ "job_link": {
1086
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301329806",
1087
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330503"
1088
+ }
1089
+ },
1090
+ "models_qwen2_5_vl": {
1091
+ "failed": {
1092
+ "PyTorch": {
1093
+ "unclassified": 0,
1094
+ "single": 1,
1095
+ "multi": 1
1096
+ },
1097
+ "TensorFlow": {
1098
+ "unclassified": 0,
1099
+ "single": 0,
1100
+ "multi": 0
1101
+ },
1102
+ "Flax": {
1103
+ "unclassified": 0,
1104
+ "single": 0,
1105
+ "multi": 0
1106
+ },
1107
+ "Tokenizers": {
1108
+ "unclassified": 0,
1109
+ "single": 0,
1110
+ "multi": 0
1111
+ },
1112
+ "Pipelines": {
1113
+ "unclassified": 0,
1114
+ "single": 0,
1115
+ "multi": 0
1116
+ },
1117
+ "Trainer": {
1118
+ "unclassified": 0,
1119
+ "single": 0,
1120
+ "multi": 0
1121
+ },
1122
+ "ONNX": {
1123
+ "unclassified": 0,
1124
+ "single": 0,
1125
+ "multi": 0
1126
+ },
1127
+ "Auto": {
1128
+ "unclassified": 0,
1129
+ "single": 0,
1130
+ "multi": 0
1131
+ },
1132
+ "Quantization": {
1133
+ "unclassified": 0,
1134
+ "single": 0,
1135
+ "multi": 0
1136
+ },
1137
+ "Unclassified": {
1138
+ "unclassified": 0,
1139
+ "single": 0,
1140
+ "multi": 0
1141
+ }
1142
+ },
1143
+ "errors": 0,
1144
+ "success": 205,
1145
+ "skipped": 113,
1146
+ "time_spent": "0:02:32, 0:02:29, ",
1147
+ "failures": {
1148
+ "multi": [
1149
+ {
1150
+ "line": "tests/models/qwen2_5_vl/test_modeling_qwen2_5_vl.py::Qwen2_5_VLIntegrationTest::test_small_model_integration_test_batch_different_resolutions",
1151
+ "trace": "(line 715) AssertionError: Lists differ: ['sys[314 chars]ion\\n addCriterion\\n\\n addCriterion\\n\\n addCri[75 chars]n\\n'] != ['sys[314 chars]ion\\nThe dog in the picture appears to be a La[81 chars] is']"
1152
+ }
1153
+ ],
1154
+ "single": [
1155
+ {
1156
+ "line": "tests/models/qwen2_5_vl/test_modeling_qwen2_5_vl.py::Qwen2_5_VLIntegrationTest::test_small_model_integration_test_batch_different_resolutions",
1157
+ "trace": "(line 715) AssertionError: Lists differ: ['sys[314 chars]ion\\n addCriterion\\n\\n addCriterion\\n\\n addCri[75 chars]n\\n'] != ['sys[314 chars]ion\\nThe dog in the picture appears to be a La[81 chars] is']"
1158
+ }
1159
+ ]
1160
+ },
1161
+ "job_link": {
1162
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301329760",
1163
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330498"
1164
+ }
1165
+ },
1166
+ "models_smolvlm": {
1167
+ "failed": {
1168
+ "PyTorch": {
1169
+ "unclassified": 0,
1170
+ "single": 0,
1171
+ "multi": 0
1172
+ },
1173
+ "TensorFlow": {
1174
+ "unclassified": 0,
1175
+ "single": 0,
1176
+ "multi": 0
1177
+ },
1178
+ "Flax": {
1179
+ "unclassified": 0,
1180
+ "single": 0,
1181
+ "multi": 0
1182
+ },
1183
+ "Tokenizers": {
1184
+ "unclassified": 0,
1185
+ "single": 0,
1186
+ "multi": 0
1187
+ },
1188
+ "Pipelines": {
1189
+ "unclassified": 0,
1190
+ "single": 0,
1191
+ "multi": 0
1192
+ },
1193
+ "Trainer": {
1194
+ "unclassified": 0,
1195
+ "single": 0,
1196
+ "multi": 0
1197
+ },
1198
+ "ONNX": {
1199
+ "unclassified": 0,
1200
+ "single": 0,
1201
+ "multi": 0
1202
+ },
1203
+ "Auto": {
1204
+ "unclassified": 0,
1205
+ "single": 0,
1206
+ "multi": 0
1207
+ },
1208
+ "Quantization": {
1209
+ "unclassified": 0,
1210
+ "single": 0,
1211
+ "multi": 0
1212
+ },
1213
+ "Unclassified": {
1214
+ "unclassified": 0,
1215
+ "single": 0,
1216
+ "multi": 0
1217
+ }
1218
+ },
1219
+ "errors": 0,
1220
+ "success": 323,
1221
+ "skipped": 231,
1222
+ "time_spent": "0:01:08, 0:01:13, ",
1223
+ "failures": {},
1224
+ "job_link": {
1225
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330553",
1226
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301329835"
1227
+ }
1228
+ },
1229
+ "models_t5": {
1230
+ "failed": {
1231
+ "PyTorch": {
1232
+ "unclassified": 0,
1233
+ "single": 2,
1234
+ "multi": 3
1235
+ },
1236
+ "TensorFlow": {
1237
+ "unclassified": 0,
1238
+ "single": 0,
1239
+ "multi": 0
1240
+ },
1241
+ "Flax": {
1242
+ "unclassified": 0,
1243
+ "single": 0,
1244
+ "multi": 0
1245
+ },
1246
+ "Tokenizers": {
1247
+ "unclassified": 0,
1248
+ "single": 0,
1249
+ "multi": 0
1250
+ },
1251
+ "Pipelines": {
1252
+ "unclassified": 0,
1253
+ "single": 0,
1254
+ "multi": 0
1255
+ },
1256
+ "Trainer": {
1257
+ "unclassified": 0,
1258
+ "single": 0,
1259
+ "multi": 0
1260
+ },
1261
+ "ONNX": {
1262
+ "unclassified": 0,
1263
+ "single": 0,
1264
+ "multi": 0
1265
+ },
1266
+ "Auto": {
1267
+ "unclassified": 0,
1268
+ "single": 0,
1269
+ "multi": 0
1270
+ },
1271
+ "Quantization": {
1272
+ "unclassified": 0,
1273
+ "single": 0,
1274
+ "multi": 0
1275
+ },
1276
+ "Unclassified": {
1277
+ "unclassified": 0,
1278
+ "single": 0,
1279
+ "multi": 0
1280
+ }
1281
+ },
1282
+ "errors": 0,
1283
+ "success": 254,
1284
+ "skipped": 325,
1285
+ "time_spent": "0:01:50, 0:01:40, ",
1286
+ "failures": {
1287
+ "multi": [
1288
+ {
1289
+ "line": "tests/models/t5/test_modeling_t5.py::T5ModelTest::test_multi_gpu_data_parallel_forward",
1290
+ "trace": "(line 131) TypeError: EncoderDecoderCache.__init__() missing 1 required positional argument: 'cross_attention_cache'"
1291
+ },
1292
+ {
1293
+ "line": "tests/models/t5/test_modeling_t5.py::T5ModelIntegrationTests::test_export_t5_summarization",
1294
+ "trace": "(line 687) AttributeError: 'dict' object has no attribute 'batch_size'"
1295
+ },
1296
+ {
1297
+ "line": "tests/models/t5/test_modeling_t5.py::T5ModelIntegrationTests::test_small_integration_test",
1298
+ "trace": "(line 727) AssertionError: False is not true"
1299
+ }
1300
+ ],
1301
+ "single": [
1302
+ {
1303
+ "line": "tests/models/t5/test_modeling_t5.py::T5ModelIntegrationTests::test_export_t5_summarization",
1304
+ "trace": "(line 687) AttributeError: 'dict' object has no attribute 'batch_size'"
1305
+ },
1306
+ {
1307
+ "line": "tests/models/t5/test_modeling_t5.py::T5ModelIntegrationTests::test_small_integration_test",
1308
+ "trace": "(line 727) AssertionError: False is not true"
1309
+ }
1310
+ ]
1311
+ },
1312
+ "job_link": {
1313
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301329815",
1314
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330559"
1315
+ }
1316
+ },
1317
+ "models_vit": {
1318
+ "failed": {
1319
+ "PyTorch": {
1320
+ "unclassified": 0,
1321
+ "single": 0,
1322
+ "multi": 0
1323
+ },
1324
+ "TensorFlow": {
1325
+ "unclassified": 0,
1326
+ "single": 0,
1327
+ "multi": 0
1328
+ },
1329
+ "Flax": {
1330
+ "unclassified": 0,
1331
+ "single": 0,
1332
+ "multi": 0
1333
+ },
1334
+ "Tokenizers": {
1335
+ "unclassified": 0,
1336
+ "single": 0,
1337
+ "multi": 0
1338
+ },
1339
+ "Pipelines": {
1340
+ "unclassified": 0,
1341
+ "single": 0,
1342
+ "multi": 0
1343
+ },
1344
+ "Trainer": {
1345
+ "unclassified": 0,
1346
+ "single": 0,
1347
+ "multi": 0
1348
+ },
1349
+ "ONNX": {
1350
+ "unclassified": 0,
1351
+ "single": 0,
1352
+ "multi": 0
1353
+ },
1354
+ "Auto": {
1355
+ "unclassified": 0,
1356
+ "single": 0,
1357
+ "multi": 0
1358
+ },
1359
+ "Quantization": {
1360
+ "unclassified": 0,
1361
+ "single": 0,
1362
+ "multi": 0
1363
+ },
1364
+ "Unclassified": {
1365
+ "unclassified": 0,
1366
+ "single": 0,
1367
+ "multi": 0
1368
+ }
1369
+ },
1370
+ "errors": 0,
1371
+ "success": 135,
1372
+ "skipped": 93,
1373
+ "time_spent": "9.85, 7.74, ",
1374
+ "failures": {},
1375
+ "job_link": {
1376
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301329875",
1377
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330596"
1378
+ }
1379
+ },
1380
+ "models_wav2vec2": {
1381
+ "failed": {
1382
+ "PyTorch": {
1383
+ "unclassified": 0,
1384
+ "single": 0,
1385
+ "multi": 0
1386
+ },
1387
+ "TensorFlow": {
1388
+ "unclassified": 0,
1389
+ "single": 0,
1390
+ "multi": 0
1391
+ },
1392
+ "Flax": {
1393
+ "unclassified": 0,
1394
+ "single": 0,
1395
+ "multi": 0
1396
+ },
1397
+ "Tokenizers": {
1398
+ "unclassified": 0,
1399
+ "single": 0,
1400
+ "multi": 0
1401
+ },
1402
+ "Pipelines": {
1403
+ "unclassified": 0,
1404
+ "single": 0,
1405
+ "multi": 0
1406
+ },
1407
+ "Trainer": {
1408
+ "unclassified": 0,
1409
+ "single": 0,
1410
+ "multi": 0
1411
+ },
1412
+ "ONNX": {
1413
+ "unclassified": 0,
1414
+ "single": 0,
1415
+ "multi": 0
1416
+ },
1417
+ "Auto": {
1418
+ "unclassified": 0,
1419
+ "single": 0,
1420
+ "multi": 0
1421
+ },
1422
+ "Quantization": {
1423
+ "unclassified": 0,
1424
+ "single": 0,
1425
+ "multi": 0
1426
+ },
1427
+ "Unclassified": {
1428
+ "unclassified": 0,
1429
+ "single": 0,
1430
+ "multi": 0
1431
+ }
1432
+ },
1433
+ "errors": 0,
1434
+ "success": 292,
1435
+ "skipped": 246,
1436
+ "time_spent": "0:01:56, 0:01:54, ",
1437
+ "failures": {},
1438
+ "job_link": {
1439
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301329877",
1440
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330632"
1441
+ }
1442
+ },
1443
+ "models_whisper": {
1444
+ "failed": {
1445
+ "PyTorch": {
1446
+ "unclassified": 0,
1447
+ "single": 40,
1448
+ "multi": 42
1449
+ },
1450
+ "TensorFlow": {
1451
+ "unclassified": 0,
1452
+ "single": 0,
1453
+ "multi": 0
1454
+ },
1455
+ "Flax": {
1456
+ "unclassified": 0,
1457
+ "single": 0,
1458
+ "multi": 0
1459
+ },
1460
+ "Tokenizers": {
1461
+ "unclassified": 0,
1462
+ "single": 0,
1463
+ "multi": 0
1464
+ },
1465
+ "Pipelines": {
1466
+ "unclassified": 0,
1467
+ "single": 0,
1468
+ "multi": 0
1469
+ },
1470
+ "Trainer": {
1471
+ "unclassified": 0,
1472
+ "single": 0,
1473
+ "multi": 0
1474
+ },
1475
+ "ONNX": {
1476
+ "unclassified": 0,
1477
+ "single": 0,
1478
+ "multi": 0
1479
+ },
1480
+ "Auto": {
1481
+ "unclassified": 0,
1482
+ "single": 0,
1483
+ "multi": 0
1484
+ },
1485
+ "Quantization": {
1486
+ "unclassified": 0,
1487
+ "single": 0,
1488
+ "multi": 0
1489
+ },
1490
+ "Unclassified": {
1491
+ "unclassified": 0,
1492
+ "single": 0,
1493
+ "multi": 0
1494
+ }
1495
+ },
1496
+ "errors": 0,
1497
+ "success": 537,
1498
+ "skipped": 337,
1499
+ "time_spent": "0:03:23, 0:03:02, ",
1500
+ "failures": {
1501
+ "single": [
1502
+ {
1503
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_distil_token_timestamp_generation",
1504
+ "trace": "(line 2938) Failed: (subprocess)"
1505
+ },
1506
+ {
1507
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_generate_with_forced_decoder_ids",
1508
+ "trace": "(line 2938) Failed: (subprocess)"
1509
+ },
1510
+ {
1511
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_generate_with_prompt_ids",
1512
+ "trace": "(line 2938) Failed: (subprocess)"
1513
+ },
1514
+ {
1515
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_generate_with_prompt_ids_task_language",
1516
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1517
+ },
1518
+ {
1519
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_language_detection",
1520
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1521
+ },
1522
+ {
1523
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_batched_generation",
1524
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1525
+ },
1526
+ {
1527
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_batched_generation_multilingual",
1528
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1529
+ },
1530
+ {
1531
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_generation",
1532
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1533
+ },
1534
+ {
1535
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_generation_multilingual",
1536
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1537
+ },
1538
+ {
1539
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_logits_librispeech",
1540
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1541
+ },
1542
+ {
1543
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_timestamp_generation",
1544
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1545
+ },
1546
+ {
1547
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_small_en_logits_librispeech",
1548
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1549
+ },
1550
+ {
1551
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_small_longform_timestamps_generation",
1552
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1553
+ },
1554
+ {
1555
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_small_token_timestamp_generation",
1556
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1557
+ },
1558
+ {
1559
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_speculative_decoding_distil",
1560
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1561
+ },
1562
+ {
1563
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_speculative_decoding_non_distil",
1564
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1565
+ },
1566
+ {
1567
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_en_batched_generation",
1568
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1569
+ },
1570
+ {
1571
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_en_generation",
1572
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1573
+ },
1574
+ {
1575
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_generation",
1576
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1577
+ },
1578
+ {
1579
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_logits_librispeech",
1580
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1581
+ },
1582
+ {
1583
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_longform_timestamps_generation",
1584
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1585
+ },
1586
+ {
1587
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_specaugment_librispeech",
1588
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1589
+ },
1590
+ {
1591
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_static_generation",
1592
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1593
+ },
1594
+ {
1595
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_static_generation_long_form",
1596
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1597
+ },
1598
+ {
1599
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_timestamp_generation",
1600
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1601
+ },
1602
+ {
1603
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_token_timestamp_batch_generation",
1604
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1605
+ },
1606
+ {
1607
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_token_timestamp_generation",
1608
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1609
+ },
1610
+ {
1611
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_token_timestamp_generation_longform",
1612
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1613
+ },
1614
+ {
1615
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_empty_longform",
1616
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1617
+ },
1618
+ {
1619
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_multi_batch",
1620
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1621
+ },
1622
+ {
1623
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_multi_batch_hard",
1624
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1625
+ },
1626
+ {
1627
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_multi_batch_hard_prev_cond",
1628
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1629
+ },
1630
+ {
1631
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_multi_batch_prev_cond",
1632
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1633
+ },
1634
+ {
1635
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_no_speech_detection",
1636
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1637
+ },
1638
+ {
1639
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_prompt_ids",
1640
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1641
+ },
1642
+ {
1643
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_single_batch",
1644
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1645
+ },
1646
+ {
1647
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_single_batch_beam",
1648
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1649
+ },
1650
+ {
1651
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_single_batch_prev_cond",
1652
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1653
+ },
1654
+ {
1655
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_shortform_multi_batch_hard_prev_cond",
1656
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1657
+ },
1658
+ {
1659
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_shortform_single_batch_prev_cond",
1660
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1661
+ }
1662
+ ],
1663
+ "multi": [
1664
+ {
1665
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelTest::test_multi_gpu_data_parallel_forward",
1666
+ "trace": "(line 2938) Failed: (subprocess)"
1667
+ },
1668
+ {
1669
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_distil_token_timestamp_generation",
1670
+ "trace": "(line 2938) Failed: (subprocess)"
1671
+ },
1672
+ {
1673
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_generate_with_forced_decoder_ids",
1674
+ "trace": "(line 2938) Failed: (subprocess)"
1675
+ },
1676
+ {
1677
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_generate_with_prompt_ids",
1678
+ "trace": "(line 131) TypeError: EncoderDecoderCache.__init__() missing 1 required positional argument: 'cross_attention_cache'"
1679
+ },
1680
+ {
1681
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_generate_with_prompt_ids_task_language",
1682
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1683
+ },
1684
+ {
1685
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_language_detection",
1686
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1687
+ },
1688
+ {
1689
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_batched_generation",
1690
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1691
+ },
1692
+ {
1693
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_batched_generation_multilingual",
1694
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1695
+ },
1696
+ {
1697
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_generation",
1698
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1699
+ },
1700
+ {
1701
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_generation_multilingual",
1702
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1703
+ },
1704
+ {
1705
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_logits_librispeech",
1706
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1707
+ },
1708
+ {
1709
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_timestamp_generation",
1710
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1711
+ },
1712
+ {
1713
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_small_en_logits_librispeech",
1714
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1715
+ },
1716
+ {
1717
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_small_longform_timestamps_generation",
1718
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1719
+ },
1720
+ {
1721
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_small_token_timestamp_generation",
1722
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1723
+ },
1724
+ {
1725
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_speculative_decoding_distil",
1726
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1727
+ },
1728
+ {
1729
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_speculative_decoding_non_distil",
1730
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1731
+ },
1732
+ {
1733
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_en_batched_generation",
1734
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1735
+ },
1736
+ {
1737
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_en_generation",
1738
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1739
+ },
1740
+ {
1741
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_generation",
1742
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1743
+ },
1744
+ {
1745
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_logits_librispeech",
1746
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1747
+ },
1748
+ {
1749
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_longform_timestamps_generation",
1750
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1751
+ },
1752
+ {
1753
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_specaugment_librispeech",
1754
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1755
+ },
1756
+ {
1757
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_static_generation",
1758
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1759
+ },
1760
+ {
1761
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_static_generation_long_form",
1762
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1763
+ },
1764
+ {
1765
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_timestamp_generation",
1766
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1767
+ },
1768
+ {
1769
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_token_timestamp_batch_generation",
1770
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1771
+ },
1772
+ {
1773
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_token_timestamp_generation",
1774
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1775
+ },
1776
+ {
1777
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_token_timestamp_generation_longform",
1778
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1779
+ },
1780
+ {
1781
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_empty_longform",
1782
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1783
+ },
1784
+ {
1785
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_empty_longform_multi_gpu",
1786
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1787
+ },
1788
+ {
1789
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_multi_batch",
1790
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1791
+ },
1792
+ {
1793
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_multi_batch_hard",
1794
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1795
+ },
1796
+ {
1797
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_multi_batch_hard_prev_cond",
1798
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1799
+ },
1800
+ {
1801
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_multi_batch_prev_cond",
1802
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1803
+ },
1804
+ {
1805
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_no_speech_detection",
1806
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1807
+ },
1808
+ {
1809
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_prompt_ids",
1810
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1811
+ },
1812
+ {
1813
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_single_batch",
1814
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1815
+ },
1816
+ {
1817
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_single_batch_beam",
1818
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1819
+ },
1820
+ {
1821
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_single_batch_prev_cond",
1822
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1823
+ },
1824
+ {
1825
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_shortform_multi_batch_hard_prev_cond",
1826
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1827
+ },
1828
+ {
1829
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_shortform_single_batch_prev_cond",
1830
+ "trace": "(line 172) ImportError: To support decoding audio data, please install 'torchcodec'."
1831
+ }
1832
+ ]
1833
+ },
1834
+ "job_link": {
1835
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301330636",
1836
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712966867/job/47301329883"
1837
+ }
1838
+ }
1839
+ }
sample_nvidia.json ADDED
@@ -0,0 +1,1475 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "models_auto": {
3
+ "failed": {
4
+ "PyTorch": {
5
+ "unclassified": 0,
6
+ "single": 0,
7
+ "multi": 0
8
+ },
9
+ "TensorFlow": {
10
+ "unclassified": 0,
11
+ "single": 0,
12
+ "multi": 0
13
+ },
14
+ "Flax": {
15
+ "unclassified": 0,
16
+ "single": 0,
17
+ "multi": 0
18
+ },
19
+ "Tokenizers": {
20
+ "unclassified": 0,
21
+ "single": 0,
22
+ "multi": 0
23
+ },
24
+ "Pipelines": {
25
+ "unclassified": 0,
26
+ "single": 0,
27
+ "multi": 0
28
+ },
29
+ "Trainer": {
30
+ "unclassified": 0,
31
+ "single": 0,
32
+ "multi": 0
33
+ },
34
+ "ONNX": {
35
+ "unclassified": 0,
36
+ "single": 0,
37
+ "multi": 0
38
+ },
39
+ "Auto": {
40
+ "unclassified": 0,
41
+ "single": 0,
42
+ "multi": 0
43
+ },
44
+ "Quantization": {
45
+ "unclassified": 0,
46
+ "single": 0,
47
+ "multi": 0
48
+ },
49
+ "Unclassified": {
50
+ "unclassified": 0,
51
+ "single": 0,
52
+ "multi": 0
53
+ }
54
+ },
55
+ "errors": 0,
56
+ "success": 226,
57
+ "skipped": 10,
58
+ "time_spent": "3.79, 5.93, ",
59
+ "failures": {},
60
+ "job_link": {
61
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215208",
62
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215147"
63
+ }
64
+ },
65
+ "models_bert": {
66
+ "failed": {
67
+ "PyTorch": {
68
+ "unclassified": 0,
69
+ "single": 0,
70
+ "multi": 0
71
+ },
72
+ "TensorFlow": {
73
+ "unclassified": 0,
74
+ "single": 0,
75
+ "multi": 0
76
+ },
77
+ "Flax": {
78
+ "unclassified": 0,
79
+ "single": 0,
80
+ "multi": 0
81
+ },
82
+ "Tokenizers": {
83
+ "unclassified": 0,
84
+ "single": 0,
85
+ "multi": 0
86
+ },
87
+ "Pipelines": {
88
+ "unclassified": 0,
89
+ "single": 0,
90
+ "multi": 0
91
+ },
92
+ "Trainer": {
93
+ "unclassified": 0,
94
+ "single": 0,
95
+ "multi": 0
96
+ },
97
+ "ONNX": {
98
+ "unclassified": 0,
99
+ "single": 0,
100
+ "multi": 0
101
+ },
102
+ "Auto": {
103
+ "unclassified": 0,
104
+ "single": 0,
105
+ "multi": 0
106
+ },
107
+ "Quantization": {
108
+ "unclassified": 0,
109
+ "single": 0,
110
+ "multi": 0
111
+ },
112
+ "Unclassified": {
113
+ "unclassified": 0,
114
+ "single": 0,
115
+ "multi": 0
116
+ }
117
+ },
118
+ "errors": 0,
119
+ "success": 527,
120
+ "skipped": 211,
121
+ "time_spent": "0:01:47, 0:01:50, ",
122
+ "failures": {},
123
+ "job_link": {
124
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215196",
125
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215175"
126
+ }
127
+ },
128
+ "models_clip": {
129
+ "failed": {
130
+ "PyTorch": {
131
+ "unclassified": 0,
132
+ "single": 0,
133
+ "multi": 0
134
+ },
135
+ "TensorFlow": {
136
+ "unclassified": 0,
137
+ "single": 0,
138
+ "multi": 0
139
+ },
140
+ "Flax": {
141
+ "unclassified": 0,
142
+ "single": 0,
143
+ "multi": 0
144
+ },
145
+ "Tokenizers": {
146
+ "unclassified": 0,
147
+ "single": 0,
148
+ "multi": 0
149
+ },
150
+ "Pipelines": {
151
+ "unclassified": 0,
152
+ "single": 0,
153
+ "multi": 0
154
+ },
155
+ "Trainer": {
156
+ "unclassified": 0,
157
+ "single": 0,
158
+ "multi": 0
159
+ },
160
+ "ONNX": {
161
+ "unclassified": 0,
162
+ "single": 0,
163
+ "multi": 0
164
+ },
165
+ "Auto": {
166
+ "unclassified": 0,
167
+ "single": 0,
168
+ "multi": 0
169
+ },
170
+ "Quantization": {
171
+ "unclassified": 0,
172
+ "single": 0,
173
+ "multi": 0
174
+ },
175
+ "Unclassified": {
176
+ "unclassified": 0,
177
+ "single": 0,
178
+ "multi": 0
179
+ }
180
+ },
181
+ "errors": 0,
182
+ "success": 660,
183
+ "skipped": 934,
184
+ "time_spent": "0:02:15, 0:02:11, ",
185
+ "failures": {},
186
+ "job_link": {
187
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215674",
188
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215699"
189
+ }
190
+ },
191
+ "models_detr": {
192
+ "failed": {
193
+ "PyTorch": {
194
+ "unclassified": 0,
195
+ "single": 0,
196
+ "multi": 0
197
+ },
198
+ "TensorFlow": {
199
+ "unclassified": 0,
200
+ "single": 0,
201
+ "multi": 0
202
+ },
203
+ "Flax": {
204
+ "unclassified": 0,
205
+ "single": 0,
206
+ "multi": 0
207
+ },
208
+ "Tokenizers": {
209
+ "unclassified": 0,
210
+ "single": 0,
211
+ "multi": 0
212
+ },
213
+ "Pipelines": {
214
+ "unclassified": 0,
215
+ "single": 0,
216
+ "multi": 0
217
+ },
218
+ "Trainer": {
219
+ "unclassified": 0,
220
+ "single": 0,
221
+ "multi": 0
222
+ },
223
+ "ONNX": {
224
+ "unclassified": 0,
225
+ "single": 0,
226
+ "multi": 0
227
+ },
228
+ "Auto": {
229
+ "unclassified": 0,
230
+ "single": 0,
231
+ "multi": 0
232
+ },
233
+ "Quantization": {
234
+ "unclassified": 0,
235
+ "single": 0,
236
+ "multi": 0
237
+ },
238
+ "Unclassified": {
239
+ "unclassified": 0,
240
+ "single": 0,
241
+ "multi": 0
242
+ }
243
+ },
244
+ "errors": 0,
245
+ "success": 177,
246
+ "skipped": 271,
247
+ "time_spent": "0:01:07, 0:01:11, ",
248
+ "failures": {},
249
+ "job_link": {
250
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216030",
251
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216008"
252
+ }
253
+ },
254
+ "models_gemma3": {
255
+ "failed": {
256
+ "PyTorch": {
257
+ "unclassified": 0,
258
+ "single": 0,
259
+ "multi": 1
260
+ },
261
+ "TensorFlow": {
262
+ "unclassified": 0,
263
+ "single": 0,
264
+ "multi": 0
265
+ },
266
+ "Flax": {
267
+ "unclassified": 0,
268
+ "single": 0,
269
+ "multi": 0
270
+ },
271
+ "Tokenizers": {
272
+ "unclassified": 0,
273
+ "single": 0,
274
+ "multi": 0
275
+ },
276
+ "Pipelines": {
277
+ "unclassified": 0,
278
+ "single": 0,
279
+ "multi": 0
280
+ },
281
+ "Trainer": {
282
+ "unclassified": 0,
283
+ "single": 0,
284
+ "multi": 0
285
+ },
286
+ "ONNX": {
287
+ "unclassified": 0,
288
+ "single": 0,
289
+ "multi": 0
290
+ },
291
+ "Auto": {
292
+ "unclassified": 0,
293
+ "single": 0,
294
+ "multi": 0
295
+ },
296
+ "Quantization": {
297
+ "unclassified": 0,
298
+ "single": 0,
299
+ "multi": 0
300
+ },
301
+ "Unclassified": {
302
+ "unclassified": 0,
303
+ "single": 0,
304
+ "multi": 0
305
+ }
306
+ },
307
+ "errors": 0,
308
+ "success": 507,
309
+ "skipped": 320,
310
+ "time_spent": "0:09:30, 0:09:28, ",
311
+ "failures": {
312
+ "multi": [
313
+ {
314
+ "line": "tests/models/gemma3/test_modeling_gemma3.py::Gemma3Vision2TextModelTest::test_model_parallelism",
315
+ "trace": "(line 925) RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:1 and cuda:0!"
316
+ }
317
+ ]
318
+ },
319
+ "job_link": {
320
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216642",
321
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216593"
322
+ }
323
+ },
324
+ "models_gemma3n": {
325
+ "failed": {
326
+ "PyTorch": {
327
+ "unclassified": 0,
328
+ "single": 1,
329
+ "multi": 0
330
+ },
331
+ "TensorFlow": {
332
+ "unclassified": 0,
333
+ "single": 0,
334
+ "multi": 0
335
+ },
336
+ "Flax": {
337
+ "unclassified": 0,
338
+ "single": 0,
339
+ "multi": 0
340
+ },
341
+ "Tokenizers": {
342
+ "unclassified": 0,
343
+ "single": 0,
344
+ "multi": 0
345
+ },
346
+ "Pipelines": {
347
+ "unclassified": 0,
348
+ "single": 0,
349
+ "multi": 0
350
+ },
351
+ "Trainer": {
352
+ "unclassified": 0,
353
+ "single": 0,
354
+ "multi": 0
355
+ },
356
+ "ONNX": {
357
+ "unclassified": 0,
358
+ "single": 0,
359
+ "multi": 0
360
+ },
361
+ "Auto": {
362
+ "unclassified": 0,
363
+ "single": 0,
364
+ "multi": 0
365
+ },
366
+ "Quantization": {
367
+ "unclassified": 0,
368
+ "single": 0,
369
+ "multi": 0
370
+ },
371
+ "Unclassified": {
372
+ "unclassified": 0,
373
+ "single": 0,
374
+ "multi": 0
375
+ }
376
+ },
377
+ "errors": 0,
378
+ "success": 288,
379
+ "skipped": 703,
380
+ "time_spent": "0:02:15, 0:02:15, ",
381
+ "failures": {
382
+ "single": [
383
+ {
384
+ "line": "tests/models/gemma3n/test_modeling_gemma3n.py::Gemma3nTextModelTest::test_sdpa_padding_matches_padding_free_with_position_ids",
385
+ "trace": "(line 4243) AssertionError: Tensor-likes are not close!"
386
+ }
387
+ ]
388
+ },
389
+ "job_link": {
390
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216605",
391
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216660"
392
+ }
393
+ },
394
+ "models_got_ocr2": {
395
+ "failed": {
396
+ "PyTorch": {
397
+ "unclassified": 0,
398
+ "single": 0,
399
+ "multi": 0
400
+ },
401
+ "TensorFlow": {
402
+ "unclassified": 0,
403
+ "single": 0,
404
+ "multi": 0
405
+ },
406
+ "Flax": {
407
+ "unclassified": 0,
408
+ "single": 0,
409
+ "multi": 0
410
+ },
411
+ "Tokenizers": {
412
+ "unclassified": 0,
413
+ "single": 0,
414
+ "multi": 0
415
+ },
416
+ "Pipelines": {
417
+ "unclassified": 0,
418
+ "single": 0,
419
+ "multi": 0
420
+ },
421
+ "Trainer": {
422
+ "unclassified": 0,
423
+ "single": 0,
424
+ "multi": 0
425
+ },
426
+ "ONNX": {
427
+ "unclassified": 0,
428
+ "single": 0,
429
+ "multi": 0
430
+ },
431
+ "Auto": {
432
+ "unclassified": 0,
433
+ "single": 0,
434
+ "multi": 0
435
+ },
436
+ "Quantization": {
437
+ "unclassified": 0,
438
+ "single": 0,
439
+ "multi": 0
440
+ },
441
+ "Unclassified": {
442
+ "unclassified": 0,
443
+ "single": 0,
444
+ "multi": 0
445
+ }
446
+ },
447
+ "errors": 0,
448
+ "success": 257,
449
+ "skipped": 333,
450
+ "time_spent": "0:01:49, 0:01:49, ",
451
+ "failures": {},
452
+ "job_link": {
453
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216911",
454
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216742"
455
+ }
456
+ },
457
+ "models_gpt2": {
458
+ "failed": {
459
+ "PyTorch": {
460
+ "unclassified": 0,
461
+ "single": 0,
462
+ "multi": 0
463
+ },
464
+ "TensorFlow": {
465
+ "unclassified": 0,
466
+ "single": 0,
467
+ "multi": 0
468
+ },
469
+ "Flax": {
470
+ "unclassified": 0,
471
+ "single": 0,
472
+ "multi": 0
473
+ },
474
+ "Tokenizers": {
475
+ "unclassified": 0,
476
+ "single": 0,
477
+ "multi": 0
478
+ },
479
+ "Pipelines": {
480
+ "unclassified": 0,
481
+ "single": 0,
482
+ "multi": 0
483
+ },
484
+ "Trainer": {
485
+ "unclassified": 0,
486
+ "single": 0,
487
+ "multi": 0
488
+ },
489
+ "ONNX": {
490
+ "unclassified": 0,
491
+ "single": 0,
492
+ "multi": 0
493
+ },
494
+ "Auto": {
495
+ "unclassified": 0,
496
+ "single": 0,
497
+ "multi": 0
498
+ },
499
+ "Quantization": {
500
+ "unclassified": 0,
501
+ "single": 0,
502
+ "multi": 0
503
+ },
504
+ "Unclassified": {
505
+ "unclassified": 0,
506
+ "single": 0,
507
+ "multi": 0
508
+ }
509
+ },
510
+ "errors": 0,
511
+ "success": 487,
512
+ "skipped": 229,
513
+ "time_spent": "0:02:11, 0:02:01, ",
514
+ "failures": {},
515
+ "job_link": {
516
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216717",
517
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216759"
518
+ }
519
+ },
520
+ "models_internvl": {
521
+ "failed": {
522
+ "PyTorch": {
523
+ "unclassified": 0,
524
+ "single": 1,
525
+ "multi": 1
526
+ },
527
+ "TensorFlow": {
528
+ "unclassified": 0,
529
+ "single": 0,
530
+ "multi": 0
531
+ },
532
+ "Flax": {
533
+ "unclassified": 0,
534
+ "single": 0,
535
+ "multi": 0
536
+ },
537
+ "Tokenizers": {
538
+ "unclassified": 0,
539
+ "single": 0,
540
+ "multi": 0
541
+ },
542
+ "Pipelines": {
543
+ "unclassified": 0,
544
+ "single": 0,
545
+ "multi": 0
546
+ },
547
+ "Trainer": {
548
+ "unclassified": 0,
549
+ "single": 0,
550
+ "multi": 0
551
+ },
552
+ "ONNX": {
553
+ "unclassified": 0,
554
+ "single": 0,
555
+ "multi": 0
556
+ },
557
+ "Auto": {
558
+ "unclassified": 0,
559
+ "single": 0,
560
+ "multi": 0
561
+ },
562
+ "Quantization": {
563
+ "unclassified": 0,
564
+ "single": 0,
565
+ "multi": 0
566
+ },
567
+ "Unclassified": {
568
+ "unclassified": 0,
569
+ "single": 0,
570
+ "multi": 0
571
+ }
572
+ },
573
+ "errors": 0,
574
+ "success": 355,
575
+ "skipped": 241,
576
+ "time_spent": "0:04:33, 0:04:31, ",
577
+ "failures": {
578
+ "multi": [
579
+ {
580
+ "line": "tests/models/internvl/test_modeling_internvl.py::InternVLModelTest::test_flex_attention_with_grads",
581
+ "trace": "(line 439) torch._inductor.exc.InductorError: RuntimeError: No valid triton configs. OutOfResources: out of resource: shared memory, Required: 106496, Hardware limit: 101376. Reducing block sizes or `num_stages` may help."
582
+ }
583
+ ],
584
+ "single": [
585
+ {
586
+ "line": "tests/models/internvl/test_modeling_internvl.py::InternVLModelTest::test_flex_attention_with_grads",
587
+ "trace": "(line 439) torch._inductor.exc.InductorError: RuntimeError: No valid triton configs. OutOfResources: out of resource: shared memory, Required: 106496, Hardware limit: 101376. Reducing block sizes or `num_stages` may help."
588
+ }
589
+ ]
590
+ },
591
+ "job_link": {
592
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301217017",
593
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301217056"
594
+ }
595
+ },
596
+ "models_llama": {
597
+ "failed": {
598
+ "PyTorch": {
599
+ "unclassified": 0,
600
+ "single": 0,
601
+ "multi": 0
602
+ },
603
+ "TensorFlow": {
604
+ "unclassified": 0,
605
+ "single": 0,
606
+ "multi": 0
607
+ },
608
+ "Flax": {
609
+ "unclassified": 0,
610
+ "single": 0,
611
+ "multi": 0
612
+ },
613
+ "Tokenizers": {
614
+ "unclassified": 0,
615
+ "single": 0,
616
+ "multi": 0
617
+ },
618
+ "Pipelines": {
619
+ "unclassified": 0,
620
+ "single": 0,
621
+ "multi": 0
622
+ },
623
+ "Trainer": {
624
+ "unclassified": 0,
625
+ "single": 0,
626
+ "multi": 0
627
+ },
628
+ "ONNX": {
629
+ "unclassified": 0,
630
+ "single": 0,
631
+ "multi": 0
632
+ },
633
+ "Auto": {
634
+ "unclassified": 0,
635
+ "single": 0,
636
+ "multi": 0
637
+ },
638
+ "Quantization": {
639
+ "unclassified": 0,
640
+ "single": 0,
641
+ "multi": 0
642
+ },
643
+ "Unclassified": {
644
+ "unclassified": 0,
645
+ "single": 0,
646
+ "multi": 0
647
+ }
648
+ },
649
+ "errors": 0,
650
+ "success": 481,
651
+ "skipped": 253,
652
+ "time_spent": "0:03:43, 0:03:37, ",
653
+ "failures": {},
654
+ "job_link": {
655
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301217239",
656
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301217242"
657
+ }
658
+ },
659
+ "models_llava": {
660
+ "failed": {
661
+ "PyTorch": {
662
+ "unclassified": 0,
663
+ "single": 0,
664
+ "multi": 0
665
+ },
666
+ "TensorFlow": {
667
+ "unclassified": 0,
668
+ "single": 0,
669
+ "multi": 0
670
+ },
671
+ "Flax": {
672
+ "unclassified": 0,
673
+ "single": 0,
674
+ "multi": 0
675
+ },
676
+ "Tokenizers": {
677
+ "unclassified": 0,
678
+ "single": 0,
679
+ "multi": 0
680
+ },
681
+ "Pipelines": {
682
+ "unclassified": 0,
683
+ "single": 0,
684
+ "multi": 0
685
+ },
686
+ "Trainer": {
687
+ "unclassified": 0,
688
+ "single": 0,
689
+ "multi": 0
690
+ },
691
+ "ONNX": {
692
+ "unclassified": 0,
693
+ "single": 0,
694
+ "multi": 0
695
+ },
696
+ "Auto": {
697
+ "unclassified": 0,
698
+ "single": 0,
699
+ "multi": 0
700
+ },
701
+ "Quantization": {
702
+ "unclassified": 0,
703
+ "single": 0,
704
+ "multi": 0
705
+ },
706
+ "Unclassified": {
707
+ "unclassified": 0,
708
+ "single": 0,
709
+ "multi": 0
710
+ }
711
+ },
712
+ "errors": 0,
713
+ "success": 349,
714
+ "skipped": 159,
715
+ "time_spent": "0:08:59, 0:09:11, ",
716
+ "failures": {},
717
+ "job_link": {
718
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301217250",
719
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301217263"
720
+ }
721
+ },
722
+ "models_mistral3": {
723
+ "failed": {
724
+ "PyTorch": {
725
+ "unclassified": 0,
726
+ "single": 0,
727
+ "multi": 0
728
+ },
729
+ "TensorFlow": {
730
+ "unclassified": 0,
731
+ "single": 0,
732
+ "multi": 0
733
+ },
734
+ "Flax": {
735
+ "unclassified": 0,
736
+ "single": 0,
737
+ "multi": 0
738
+ },
739
+ "Tokenizers": {
740
+ "unclassified": 0,
741
+ "single": 0,
742
+ "multi": 0
743
+ },
744
+ "Pipelines": {
745
+ "unclassified": 0,
746
+ "single": 0,
747
+ "multi": 0
748
+ },
749
+ "Trainer": {
750
+ "unclassified": 0,
751
+ "single": 0,
752
+ "multi": 0
753
+ },
754
+ "ONNX": {
755
+ "unclassified": 0,
756
+ "single": 0,
757
+ "multi": 0
758
+ },
759
+ "Auto": {
760
+ "unclassified": 0,
761
+ "single": 0,
762
+ "multi": 0
763
+ },
764
+ "Quantization": {
765
+ "unclassified": 0,
766
+ "single": 0,
767
+ "multi": 0
768
+ },
769
+ "Unclassified": {
770
+ "unclassified": 0,
771
+ "single": 0,
772
+ "multi": 0
773
+ }
774
+ },
775
+ "errors": 0,
776
+ "success": 283,
777
+ "skipped": 267,
778
+ "time_spent": "0:09:53, 0:09:40, ",
779
+ "failures": {},
780
+ "job_link": {
781
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215108",
782
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215124"
783
+ }
784
+ },
785
+ "models_modernbert": {
786
+ "failed": {
787
+ "PyTorch": {
788
+ "unclassified": 0,
789
+ "single": 0,
790
+ "multi": 0
791
+ },
792
+ "TensorFlow": {
793
+ "unclassified": 0,
794
+ "single": 0,
795
+ "multi": 0
796
+ },
797
+ "Flax": {
798
+ "unclassified": 0,
799
+ "single": 0,
800
+ "multi": 0
801
+ },
802
+ "Tokenizers": {
803
+ "unclassified": 0,
804
+ "single": 0,
805
+ "multi": 0
806
+ },
807
+ "Pipelines": {
808
+ "unclassified": 0,
809
+ "single": 0,
810
+ "multi": 0
811
+ },
812
+ "Trainer": {
813
+ "unclassified": 0,
814
+ "single": 0,
815
+ "multi": 0
816
+ },
817
+ "ONNX": {
818
+ "unclassified": 0,
819
+ "single": 0,
820
+ "multi": 0
821
+ },
822
+ "Auto": {
823
+ "unclassified": 0,
824
+ "single": 0,
825
+ "multi": 0
826
+ },
827
+ "Quantization": {
828
+ "unclassified": 0,
829
+ "single": 0,
830
+ "multi": 0
831
+ },
832
+ "Unclassified": {
833
+ "unclassified": 0,
834
+ "single": 0,
835
+ "multi": 0
836
+ }
837
+ },
838
+ "errors": 0,
839
+ "success": 174,
840
+ "skipped": 218,
841
+ "time_spent": "0:01:27, 0:01:24, ",
842
+ "failures": {},
843
+ "job_link": {
844
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215158",
845
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215123"
846
+ }
847
+ },
848
+ "models_qwen2": {
849
+ "failed": {
850
+ "PyTorch": {
851
+ "unclassified": 0,
852
+ "single": 0,
853
+ "multi": 0
854
+ },
855
+ "TensorFlow": {
856
+ "unclassified": 0,
857
+ "single": 0,
858
+ "multi": 0
859
+ },
860
+ "Flax": {
861
+ "unclassified": 0,
862
+ "single": 0,
863
+ "multi": 0
864
+ },
865
+ "Tokenizers": {
866
+ "unclassified": 0,
867
+ "single": 0,
868
+ "multi": 0
869
+ },
870
+ "Pipelines": {
871
+ "unclassified": 0,
872
+ "single": 0,
873
+ "multi": 0
874
+ },
875
+ "Trainer": {
876
+ "unclassified": 0,
877
+ "single": 0,
878
+ "multi": 0
879
+ },
880
+ "ONNX": {
881
+ "unclassified": 0,
882
+ "single": 0,
883
+ "multi": 0
884
+ },
885
+ "Auto": {
886
+ "unclassified": 0,
887
+ "single": 0,
888
+ "multi": 0
889
+ },
890
+ "Quantization": {
891
+ "unclassified": 0,
892
+ "single": 0,
893
+ "multi": 0
894
+ },
895
+ "Unclassified": {
896
+ "unclassified": 0,
897
+ "single": 0,
898
+ "multi": 0
899
+ }
900
+ },
901
+ "errors": 0,
902
+ "success": 443,
903
+ "skipped": 251,
904
+ "time_spent": "0:02:16, 0:02:16, ",
905
+ "failures": {},
906
+ "job_link": {
907
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215909",
908
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215891"
909
+ }
910
+ },
911
+ "models_qwen2_5_omni": {
912
+ "failed": {
913
+ "PyTorch": {
914
+ "unclassified": 0,
915
+ "single": 0,
916
+ "multi": 1
917
+ },
918
+ "TensorFlow": {
919
+ "unclassified": 0,
920
+ "single": 0,
921
+ "multi": 0
922
+ },
923
+ "Flax": {
924
+ "unclassified": 0,
925
+ "single": 0,
926
+ "multi": 0
927
+ },
928
+ "Tokenizers": {
929
+ "unclassified": 0,
930
+ "single": 0,
931
+ "multi": 0
932
+ },
933
+ "Pipelines": {
934
+ "unclassified": 0,
935
+ "single": 0,
936
+ "multi": 0
937
+ },
938
+ "Trainer": {
939
+ "unclassified": 0,
940
+ "single": 0,
941
+ "multi": 0
942
+ },
943
+ "ONNX": {
944
+ "unclassified": 0,
945
+ "single": 0,
946
+ "multi": 0
947
+ },
948
+ "Auto": {
949
+ "unclassified": 0,
950
+ "single": 0,
951
+ "multi": 0
952
+ },
953
+ "Quantization": {
954
+ "unclassified": 0,
955
+ "single": 0,
956
+ "multi": 0
957
+ },
958
+ "Unclassified": {
959
+ "unclassified": 0,
960
+ "single": 0,
961
+ "multi": 0
962
+ }
963
+ },
964
+ "errors": 0,
965
+ "success": 278,
966
+ "skipped": 159,
967
+ "time_spent": "0:02:55, 0:03:00, ",
968
+ "failures": {
969
+ "multi": [
970
+ {
971
+ "line": "tests/models/qwen2_5_omni/test_modeling_qwen2_5_omni.py::Qwen2_5OmniThinkerForConditionalGenerationModelTest::test_model_parallelism",
972
+ "trace": "(line 675) AssertionError: Items in the second set but not the first:"
973
+ }
974
+ ]
975
+ },
976
+ "job_link": {
977
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215907",
978
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215896"
979
+ }
980
+ },
981
+ "models_qwen2_5_vl": {
982
+ "failed": {
983
+ "PyTorch": {
984
+ "unclassified": 0,
985
+ "single": 1,
986
+ "multi": 1
987
+ },
988
+ "TensorFlow": {
989
+ "unclassified": 0,
990
+ "single": 0,
991
+ "multi": 0
992
+ },
993
+ "Flax": {
994
+ "unclassified": 0,
995
+ "single": 0,
996
+ "multi": 0
997
+ },
998
+ "Tokenizers": {
999
+ "unclassified": 0,
1000
+ "single": 0,
1001
+ "multi": 0
1002
+ },
1003
+ "Pipelines": {
1004
+ "unclassified": 0,
1005
+ "single": 0,
1006
+ "multi": 0
1007
+ },
1008
+ "Trainer": {
1009
+ "unclassified": 0,
1010
+ "single": 0,
1011
+ "multi": 0
1012
+ },
1013
+ "ONNX": {
1014
+ "unclassified": 0,
1015
+ "single": 0,
1016
+ "multi": 0
1017
+ },
1018
+ "Auto": {
1019
+ "unclassified": 0,
1020
+ "single": 0,
1021
+ "multi": 0
1022
+ },
1023
+ "Quantization": {
1024
+ "unclassified": 0,
1025
+ "single": 0,
1026
+ "multi": 0
1027
+ },
1028
+ "Unclassified": {
1029
+ "unclassified": 0,
1030
+ "single": 0,
1031
+ "multi": 0
1032
+ }
1033
+ },
1034
+ "errors": 0,
1035
+ "success": 309,
1036
+ "skipped": 141,
1037
+ "time_spent": "0:03:13, 0:03:14, ",
1038
+ "failures": {
1039
+ "multi": [
1040
+ {
1041
+ "line": "tests/models/qwen2_5_vl/test_modeling_qwen2_5_vl.py::Qwen2_5_VLIntegrationTest::test_small_model_integration_test_batch_different_resolutions",
1042
+ "trace": "(line 675) AssertionError: Lists differ: ['sys[314 chars]ion\\n addCriterion\\n\\n addCriterion\\n\\n addCri[75 chars]n\\n'] != ['sys[314 chars]ion\\nThe dog in the picture appears to be a La[81 chars] is']"
1043
+ }
1044
+ ],
1045
+ "single": [
1046
+ {
1047
+ "line": "tests/models/qwen2_5_vl/test_modeling_qwen2_5_vl.py::Qwen2_5_VLIntegrationTest::test_small_model_integration_test_batch_different_resolutions",
1048
+ "trace": "(line 675) AssertionError: Lists differ: ['sys[314 chars]ion\\n addCriterion\\n\\n addCriterion\\n\\n addCri[75 chars]n\\n'] != ['sys[314 chars]ion\\nThe dog in the picture appears to be a La[81 chars] is']"
1049
+ }
1050
+ ]
1051
+ },
1052
+ "job_link": {
1053
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215945",
1054
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301215911"
1055
+ }
1056
+ },
1057
+ "models_smolvlm": {
1058
+ "failed": {
1059
+ "PyTorch": {
1060
+ "unclassified": 0,
1061
+ "single": 0,
1062
+ "multi": 0
1063
+ },
1064
+ "TensorFlow": {
1065
+ "unclassified": 0,
1066
+ "single": 0,
1067
+ "multi": 0
1068
+ },
1069
+ "Flax": {
1070
+ "unclassified": 0,
1071
+ "single": 0,
1072
+ "multi": 0
1073
+ },
1074
+ "Tokenizers": {
1075
+ "unclassified": 0,
1076
+ "single": 0,
1077
+ "multi": 0
1078
+ },
1079
+ "Pipelines": {
1080
+ "unclassified": 0,
1081
+ "single": 0,
1082
+ "multi": 0
1083
+ },
1084
+ "Trainer": {
1085
+ "unclassified": 0,
1086
+ "single": 0,
1087
+ "multi": 0
1088
+ },
1089
+ "ONNX": {
1090
+ "unclassified": 0,
1091
+ "single": 0,
1092
+ "multi": 0
1093
+ },
1094
+ "Auto": {
1095
+ "unclassified": 0,
1096
+ "single": 0,
1097
+ "multi": 0
1098
+ },
1099
+ "Quantization": {
1100
+ "unclassified": 0,
1101
+ "single": 0,
1102
+ "multi": 0
1103
+ },
1104
+ "Unclassified": {
1105
+ "unclassified": 0,
1106
+ "single": 0,
1107
+ "multi": 0
1108
+ }
1109
+ },
1110
+ "errors": 0,
1111
+ "success": 497,
1112
+ "skipped": 269,
1113
+ "time_spent": "0:01:33, 0:01:36, ",
1114
+ "failures": {},
1115
+ "job_link": {
1116
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216282",
1117
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216321"
1118
+ }
1119
+ },
1120
+ "models_t5": {
1121
+ "failed": {
1122
+ "PyTorch": {
1123
+ "unclassified": 0,
1124
+ "single": 1,
1125
+ "multi": 2
1126
+ },
1127
+ "TensorFlow": {
1128
+ "unclassified": 0,
1129
+ "single": 0,
1130
+ "multi": 0
1131
+ },
1132
+ "Flax": {
1133
+ "unclassified": 0,
1134
+ "single": 0,
1135
+ "multi": 0
1136
+ },
1137
+ "Tokenizers": {
1138
+ "unclassified": 0,
1139
+ "single": 0,
1140
+ "multi": 0
1141
+ },
1142
+ "Pipelines": {
1143
+ "unclassified": 0,
1144
+ "single": 0,
1145
+ "multi": 0
1146
+ },
1147
+ "Trainer": {
1148
+ "unclassified": 0,
1149
+ "single": 0,
1150
+ "multi": 0
1151
+ },
1152
+ "ONNX": {
1153
+ "unclassified": 0,
1154
+ "single": 0,
1155
+ "multi": 0
1156
+ },
1157
+ "Auto": {
1158
+ "unclassified": 0,
1159
+ "single": 0,
1160
+ "multi": 0
1161
+ },
1162
+ "Quantization": {
1163
+ "unclassified": 0,
1164
+ "single": 0,
1165
+ "multi": 0
1166
+ },
1167
+ "Unclassified": {
1168
+ "unclassified": 0,
1169
+ "single": 0,
1170
+ "multi": 0
1171
+ }
1172
+ },
1173
+ "errors": 0,
1174
+ "success": 592,
1175
+ "skipped": 535,
1176
+ "time_spent": "0:03:13, 0:02:52, ",
1177
+ "failures": {
1178
+ "multi": [
1179
+ {
1180
+ "line": "tests/models/t5/test_modeling_t5.py::T5ModelTest::test_multi_gpu_data_parallel_forward",
1181
+ "trace": "(line 131) TypeError: EncoderDecoderCache.__init__() missing 1 required positional argument: 'cross_attention_cache'"
1182
+ },
1183
+ {
1184
+ "line": "tests/models/t5/test_modeling_t5.py::T5ModelIntegrationTests::test_export_t5_summarization",
1185
+ "trace": "(line 687) AttributeError: 'dict' object has no attribute 'batch_size'"
1186
+ }
1187
+ ],
1188
+ "single": [
1189
+ {
1190
+ "line": "tests/models/t5/test_modeling_t5.py::T5ModelIntegrationTests::test_export_t5_summarization",
1191
+ "trace": "(line 687) AttributeError: 'dict' object has no attribute 'batch_size'"
1192
+ }
1193
+ ]
1194
+ },
1195
+ "job_link": {
1196
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216565",
1197
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216464"
1198
+ }
1199
+ },
1200
+ "models_vit": {
1201
+ "failed": {
1202
+ "PyTorch": {
1203
+ "unclassified": 0,
1204
+ "single": 0,
1205
+ "multi": 0
1206
+ },
1207
+ "TensorFlow": {
1208
+ "unclassified": 0,
1209
+ "single": 0,
1210
+ "multi": 0
1211
+ },
1212
+ "Flax": {
1213
+ "unclassified": 0,
1214
+ "single": 0,
1215
+ "multi": 0
1216
+ },
1217
+ "Tokenizers": {
1218
+ "unclassified": 0,
1219
+ "single": 0,
1220
+ "multi": 0
1221
+ },
1222
+ "Pipelines": {
1223
+ "unclassified": 0,
1224
+ "single": 0,
1225
+ "multi": 0
1226
+ },
1227
+ "Trainer": {
1228
+ "unclassified": 0,
1229
+ "single": 0,
1230
+ "multi": 0
1231
+ },
1232
+ "ONNX": {
1233
+ "unclassified": 0,
1234
+ "single": 0,
1235
+ "multi": 0
1236
+ },
1237
+ "Auto": {
1238
+ "unclassified": 0,
1239
+ "single": 0,
1240
+ "multi": 0
1241
+ },
1242
+ "Quantization": {
1243
+ "unclassified": 0,
1244
+ "single": 0,
1245
+ "multi": 0
1246
+ },
1247
+ "Unclassified": {
1248
+ "unclassified": 0,
1249
+ "single": 0,
1250
+ "multi": 0
1251
+ }
1252
+ },
1253
+ "errors": 0,
1254
+ "success": 217,
1255
+ "skipped": 199,
1256
+ "time_spent": "2.03, 1.28, ",
1257
+ "failures": {},
1258
+ "job_link": {
1259
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216869",
1260
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216833"
1261
+ }
1262
+ },
1263
+ "models_wav2vec2": {
1264
+ "failed": {
1265
+ "PyTorch": {
1266
+ "unclassified": 0,
1267
+ "single": 4,
1268
+ "multi": 4
1269
+ },
1270
+ "TensorFlow": {
1271
+ "unclassified": 0,
1272
+ "single": 0,
1273
+ "multi": 0
1274
+ },
1275
+ "Flax": {
1276
+ "unclassified": 0,
1277
+ "single": 0,
1278
+ "multi": 0
1279
+ },
1280
+ "Tokenizers": {
1281
+ "unclassified": 0,
1282
+ "single": 0,
1283
+ "multi": 0
1284
+ },
1285
+ "Pipelines": {
1286
+ "unclassified": 0,
1287
+ "single": 0,
1288
+ "multi": 0
1289
+ },
1290
+ "Trainer": {
1291
+ "unclassified": 0,
1292
+ "single": 0,
1293
+ "multi": 0
1294
+ },
1295
+ "ONNX": {
1296
+ "unclassified": 0,
1297
+ "single": 0,
1298
+ "multi": 0
1299
+ },
1300
+ "Auto": {
1301
+ "unclassified": 0,
1302
+ "single": 0,
1303
+ "multi": 0
1304
+ },
1305
+ "Quantization": {
1306
+ "unclassified": 0,
1307
+ "single": 0,
1308
+ "multi": 0
1309
+ },
1310
+ "Unclassified": {
1311
+ "unclassified": 0,
1312
+ "single": 0,
1313
+ "multi": 0
1314
+ }
1315
+ },
1316
+ "errors": 0,
1317
+ "success": 672,
1318
+ "skipped": 438,
1319
+ "time_spent": "0:03:37, 0:03:36, ",
1320
+ "failures": {
1321
+ "multi": [
1322
+ {
1323
+ "line": "tests/models/wav2vec2/test_modeling_wav2vec2.py::Wav2Vec2ModelIntegrationTest::test_inference_mms_1b_all",
1324
+ "trace": "(line 989) RuntimeError: Dataset scripts are no longer supported, but found common_voice_11_0.py"
1325
+ },
1326
+ {
1327
+ "line": "tests/models/wav2vec2/test_modeling_wav2vec2.py::Wav2Vec2ModelIntegrationTest::test_wav2vec2_with_lm",
1328
+ "trace": "(line 989) RuntimeError: Dataset scripts are no longer supported, but found common_voice_11_0.py"
1329
+ },
1330
+ {
1331
+ "line": "tests/models/wav2vec2/test_modeling_wav2vec2.py::Wav2Vec2ModelIntegrationTest::test_wav2vec2_with_lm_invalid_pool",
1332
+ "trace": "(line 675) AssertionError: Traceback (most recent call last):"
1333
+ },
1334
+ {
1335
+ "line": "tests/models/wav2vec2/test_modeling_wav2vec2.py::Wav2Vec2ModelIntegrationTest::test_wav2vec2_with_lm_pool",
1336
+ "trace": "(line 989) RuntimeError: Dataset scripts are no longer supported, but found common_voice_11_0.py"
1337
+ }
1338
+ ],
1339
+ "single": [
1340
+ {
1341
+ "line": "tests/models/wav2vec2/test_modeling_wav2vec2.py::Wav2Vec2ModelIntegrationTest::test_inference_mms_1b_all",
1342
+ "trace": "(line 989) RuntimeError: Dataset scripts are no longer supported, but found common_voice_11_0.py"
1343
+ },
1344
+ {
1345
+ "line": "tests/models/wav2vec2/test_modeling_wav2vec2.py::Wav2Vec2ModelIntegrationTest::test_wav2vec2_with_lm",
1346
+ "trace": "(line 989) RuntimeError: Dataset scripts are no longer supported, but found common_voice_11_0.py"
1347
+ },
1348
+ {
1349
+ "line": "tests/models/wav2vec2/test_modeling_wav2vec2.py::Wav2Vec2ModelIntegrationTest::test_wav2vec2_with_lm_invalid_pool",
1350
+ "trace": "(line 675) AssertionError: Traceback (most recent call last):"
1351
+ },
1352
+ {
1353
+ "line": "tests/models/wav2vec2/test_modeling_wav2vec2.py::Wav2Vec2ModelIntegrationTest::test_wav2vec2_with_lm_pool",
1354
+ "trace": "(line 989) RuntimeError: Dataset scripts are no longer supported, but found common_voice_11_0.py"
1355
+ }
1356
+ ]
1357
+ },
1358
+ "job_link": {
1359
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216956",
1360
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216929"
1361
+ }
1362
+ },
1363
+ "models_whisper": {
1364
+ "failed": {
1365
+ "PyTorch": {
1366
+ "unclassified": 0,
1367
+ "single": 5,
1368
+ "multi": 6
1369
+ },
1370
+ "TensorFlow": {
1371
+ "unclassified": 0,
1372
+ "single": 0,
1373
+ "multi": 0
1374
+ },
1375
+ "Flax": {
1376
+ "unclassified": 0,
1377
+ "single": 0,
1378
+ "multi": 0
1379
+ },
1380
+ "Tokenizers": {
1381
+ "unclassified": 0,
1382
+ "single": 0,
1383
+ "multi": 0
1384
+ },
1385
+ "Pipelines": {
1386
+ "unclassified": 0,
1387
+ "single": 0,
1388
+ "multi": 0
1389
+ },
1390
+ "Trainer": {
1391
+ "unclassified": 0,
1392
+ "single": 0,
1393
+ "multi": 0
1394
+ },
1395
+ "ONNX": {
1396
+ "unclassified": 0,
1397
+ "single": 0,
1398
+ "multi": 0
1399
+ },
1400
+ "Auto": {
1401
+ "unclassified": 0,
1402
+ "single": 0,
1403
+ "multi": 0
1404
+ },
1405
+ "Quantization": {
1406
+ "unclassified": 0,
1407
+ "single": 0,
1408
+ "multi": 0
1409
+ },
1410
+ "Unclassified": {
1411
+ "unclassified": 0,
1412
+ "single": 0,
1413
+ "multi": 0
1414
+ }
1415
+ },
1416
+ "errors": 0,
1417
+ "success": 1014,
1418
+ "skipped": 475,
1419
+ "time_spent": "0:11:09, 0:11:47, ",
1420
+ "failures": {
1421
+ "single": [
1422
+ {
1423
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_batched_generation_multilingual",
1424
+ "trace": "(line 756) RuntimeError: The frame has 0 channels, expected 1. If you are hitting this, it may be because you are using a buggy FFmpeg version. FFmpeg4 is known to fail here in some valid scenarios. Try to upgrade FFmpeg?"
1425
+ },
1426
+ {
1427
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_small_longform_timestamps_generation",
1428
+ "trace": "(line 756) RuntimeError: The frame has 0 channels, expected 1. If you are hitting this, it may be because you are using a buggy FFmpeg version. FFmpeg4 is known to fail here in some valid scenarios. Try to upgrade FFmpeg?"
1429
+ },
1430
+ {
1431
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_longform_timestamps_generation",
1432
+ "trace": "(line 756) RuntimeError: The frame has 0 channels, expected 1. If you are hitting this, it may be because you are using a buggy FFmpeg version. FFmpeg4 is known to fail here in some valid scenarios. Try to upgrade FFmpeg?"
1433
+ },
1434
+ {
1435
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_multi_batch_hard",
1436
+ "trace": "(line 675) AssertionError: Lists differ: [\" Fo[272 chars]ting of classics, Sicilian, nade door variatio[8147 chars]le!'] != [\" Fo[272 chars]ting a classic Sicilian, nade door variation o[8150 chars]le!']"
1437
+ },
1438
+ {
1439
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_shortform_single_batch_prev_cond",
1440
+ "trace": "(line 675) AssertionError: Lists differ: [\" Fo[268 chars]ating, so soft, it would make JD power and her[196 chars]ke.\"] != [\" Fo[268 chars]ating so soft, it would make JD power and her [195 chars]ke.\"]"
1441
+ }
1442
+ ],
1443
+ "multi": [
1444
+ {
1445
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelTest::test_multi_gpu_data_parallel_forward",
1446
+ "trace": "(line 131) TypeError: EncoderDecoderCache.__init__() missing 1 required positional argument: 'cross_attention_cache'"
1447
+ },
1448
+ {
1449
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_large_batched_generation_multilingual",
1450
+ "trace": "(line 756) RuntimeError: The frame has 0 channels, expected 1. If you are hitting this, it may be because you are using a buggy FFmpeg version. FFmpeg4 is known to fail here in some valid scenarios. Try to upgrade FFmpeg?"
1451
+ },
1452
+ {
1453
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_small_longform_timestamps_generation",
1454
+ "trace": "(line 756) RuntimeError: The frame has 0 channels, expected 1. If you are hitting this, it may be because you are using a buggy FFmpeg version. FFmpeg4 is known to fail here in some valid scenarios. Try to upgrade FFmpeg?"
1455
+ },
1456
+ {
1457
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_tiny_longform_timestamps_generation",
1458
+ "trace": "(line 756) RuntimeError: The frame has 0 channels, expected 1. If you are hitting this, it may be because you are using a buggy FFmpeg version. FFmpeg4 is known to fail here in some valid scenarios. Try to upgrade FFmpeg?"
1459
+ },
1460
+ {
1461
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_longform_multi_batch_hard",
1462
+ "trace": "(line 675) AssertionError: Lists differ: [\" Fo[272 chars]ting of classics, Sicilian, nade door variatio[8147 chars]le!'] != [\" Fo[272 chars]ting a classic Sicilian, nade door variation o[8150 chars]le!']"
1463
+ },
1464
+ {
1465
+ "line": "tests/models/whisper/test_modeling_whisper.py::WhisperModelIntegrationTests::test_whisper_shortform_single_batch_prev_cond",
1466
+ "trace": "(line 675) AssertionError: Lists differ: [\" Fo[268 chars]ating, so soft, it would make JD power and her[196 chars]ke.\"] != [\" Fo[268 chars]ating so soft, it would make JD power and her [195 chars]ke.\"]"
1467
+ }
1468
+ ]
1469
+ },
1470
+ "job_link": {
1471
+ "single": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301216943",
1472
+ "multi": "https://github.com/huggingface/transformers/actions/runs/16712955100/job/47301217012"
1473
+ }
1474
+ }
1475
+ }
styles.css ADDED
@@ -0,0 +1,669 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Global dark theme with configurable bottom margin */
2
+ :root {
3
+ --main-content-bottom-margin: 10px; /* Configurable bottom margin for main content */
4
+ }
5
+
6
+ .gradio-container {
7
+ background-color: #000000 !important;
8
+ color: white !important;
9
+ height: 100vh !important;
10
+ max-height: 100vh !important;
11
+ overflow: hidden !important;
12
+ }
13
+
14
+ /* Remove borders from all components */
15
+ .gr-box, .gr-form, .gr-panel {
16
+ border: none !important;
17
+ background-color: #000000 !important;
18
+ }
19
+
20
+ /* Simplified sidebar styling */
21
+ .sidebar {
22
+ background: linear-gradient(145deg, #111111, #1a1a1a) !important;
23
+ border: none !important;
24
+ padding: 15px !important;
25
+ margin: 0 !important;
26
+ height: 100vh !important;
27
+ position: fixed !important;
28
+ left: 0 !important;
29
+ top: 0 !important;
30
+ width: 300px !important;
31
+ box-sizing: border-box !important;
32
+ overflow-y: auto !important;
33
+ overflow-x: hidden !important;
34
+ }
35
+
36
+ /* Target the actual Gradio column containing sidebar */
37
+ div[data-testid="column"]:has(.sidebar) {
38
+ height: 100vh !important;
39
+ overflow-y: auto !important;
40
+ overflow-x: hidden !important;
41
+ }
42
+
43
+ /* Individual sidebar elements */
44
+ .sidebar-title {
45
+ margin-bottom: 10px !important;
46
+ }
47
+
48
+ .sidebar-description {
49
+ margin-bottom: 15px !important;
50
+ }
51
+
52
+ /* Summary button styling - distinct from model buttons */
53
+ .summary-button {
54
+ background: linear-gradient(135deg, #4a4a4a, #3e3e3e) !important;
55
+ color: white !important;
56
+ border: 2px solid #555555 !important;
57
+ margin: 0 0 15px 0 !important;
58
+ border-radius: 5px !important;
59
+ padding: 12px 10px !important;
60
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important;
61
+ position: relative !important;
62
+ overflow: hidden !important;
63
+ box-shadow:
64
+ 0 4px 15px rgba(0, 0, 0, 0.3),
65
+ inset 0 1px 0 rgba(255, 255, 255, 0.2) !important;
66
+ font-weight: 600 !important;
67
+ font-size: 14px !important;
68
+ text-transform: uppercase !important;
69
+ letter-spacing: 0.3px !important;
70
+ font-family: monospace !important;
71
+ height: 60px !important;
72
+ display: flex !important;
73
+ flex-direction: column !important;
74
+ justify-content: center !important;
75
+ align-items: center !important;
76
+ line-height: 1.2 !important;
77
+ width: 100% !important;
78
+ max-width: 100% !important;
79
+ min-width: 0 !important;
80
+ box-sizing: border-box !important;
81
+ }
82
+
83
+ .model-header {
84
+ margin-bottom: 10px !important;
85
+ background: linear-gradient(135deg, #2a2a2a, #1e1e1e) !important;
86
+ color: white !important;
87
+ border: 1px solid #333 !important;
88
+ border-radius: 5px !important;
89
+ font-weight: 600 !important;
90
+ font-size: 14px !important;
91
+ font-family: monospace !important;
92
+ text-align: left !important;
93
+ width: 100% !important;
94
+ }
95
+
96
+ .model-header:hover {
97
+ background: linear-gradient(135deg, #3a3a3a, #2e2e2e) !important;
98
+ }
99
+
100
+ .sidebar-links {
101
+ margin-top: 15px !important;
102
+ }
103
+
104
+ /* Hide scrollbar for model container */
105
+ .model-container::-webkit-scrollbar {
106
+ display: none !important;
107
+ }
108
+
109
+ /* Ensure all sidebar content fits within width */
110
+ .sidebar * {
111
+ max-width: 100% !important;
112
+ word-wrap: break-word !important;
113
+ overflow-wrap: break-word !important;
114
+ }
115
+
116
+ /* Specific control for markdown content */
117
+ .sidebar .markdown,
118
+ .sidebar h1,
119
+ .sidebar h2,
120
+ .sidebar h3,
121
+ .sidebar p {
122
+ max-width: 100% !important;
123
+ word-wrap: break-word !important;
124
+ overflow: hidden !important;
125
+ }
126
+
127
+ /* Sidebar scrollbar styling */
128
+ .sidebar::-webkit-scrollbar {
129
+ width: 8px !important;
130
+ background: #111111 !important;
131
+ }
132
+
133
+ .sidebar::-webkit-scrollbar-track {
134
+ background: #111111 !important;
135
+ }
136
+
137
+ .sidebar::-webkit-scrollbar-thumb {
138
+ background-color: #333333 !important;
139
+ border-radius: 4px !important;
140
+ }
141
+
142
+ .sidebar::-webkit-scrollbar-thumb:hover {
143
+ background-color: #555555 !important;
144
+ }
145
+
146
+ /* Force button containers to single column in model list */
147
+ .model-list .gr-button,
148
+ .model-list button {
149
+ display: block !important;
150
+ width: 100% !important;
151
+ max-width: 100% !important;
152
+ margin: 4px 0 !important;
153
+ flex: none !important;
154
+ }
155
+
156
+ /* Simple unfolding menu with invisible scrollbar */
157
+ .model-list-visible {
158
+ max-height: 200px !important;
159
+ overflow-y: auto !important;
160
+ transition: max-height 0.3s ease !important;
161
+ scrollbar-width: none !important;
162
+ -ms-overflow-style: none !important;
163
+ }
164
+
165
+ .model-list-visible::-webkit-scrollbar {
166
+ width: 0px !important;
167
+ background: transparent !important;
168
+ }
169
+
170
+ .model-list-hidden {
171
+ max-height: 0 !important;
172
+ overflow: hidden !important;
173
+ transition: max-height 0.3s ease !important;
174
+ }
175
+
176
+
177
+ /* Model button styling */
178
+ .model-button {
179
+ background: linear-gradient(135deg, #2a2a2a, #1e1e1e) !important;
180
+ color: white !important;
181
+ margin: 3px 0 !important;
182
+ padding: 8px 12px !important;
183
+ font-weight: 600 !important;
184
+ font-size: 14px !important;
185
+ text-transform: uppercase !important;
186
+ letter-spacing: 0.3px !important;
187
+ font-family: monospace !important;
188
+ width: 100% !important;
189
+ max-width: 100% !important;
190
+ white-space: nowrap !important;
191
+ text-overflow: ellipsis !important;
192
+ display: block !important;
193
+ cursor: pointer !important;
194
+ transition: all 0.3s ease !important;
195
+ border: 1px solid #333 !important;
196
+ border-radius: 5px !important;
197
+ }
198
+
199
+ .model-button:hover {
200
+ background: linear-gradient(135deg, #3a3a3a, #2e2e2e) !important;
201
+ border-color: #74b9ff !important;
202
+ color: #74b9ff !important;
203
+ transform: translateY(-1px) !important;
204
+ box-shadow: 0 2px 8px rgba(116, 185, 255, 0.2) !important;
205
+ }
206
+
207
+ /* Model buttons with failures - fuzzy red border with inner glow */
208
+ .model-button-failed {
209
+ border: 1px solid #712626 !important;
210
+ box-shadow: inset 0 0 8px rgba(204, 68, 68, 0.4) !important;
211
+ }
212
+
213
+ .model-button-failed:hover {
214
+ border-color: #712626 !important;
215
+ box-shadow: 0 0 12px rgba(255, 107, 107, 0.5) !important;
216
+ }
217
+
218
+ /*
219
+ .model-button:active {
220
+ background: linear-gradient(135deg, #2a2a2a, #1e1e1e) !important;
221
+ color: #5a9bd4 !important;
222
+ }
223
+ */
224
+
225
+ /* Model stats badge */
226
+ .model-stats {
227
+ display: flex !important;
228
+ justify-content: space-between !important;
229
+ align-items: center !important;
230
+ margin-top: 8px !important;
231
+ font-size: 12px !important;
232
+ opacity: 0.8 !important;
233
+ }
234
+
235
+ .stats-badge {
236
+ background: rgba(116, 185, 255, 0.2) !important;
237
+ padding: 4px 8px !important;
238
+ border-radius: 10px !important;
239
+ font-weight: 500 !important;
240
+ font-size: 11px !important;
241
+ color: #74b9ff !important;
242
+ }
243
+
244
+ .success-indicator {
245
+ width: 8px !important;
246
+ height: 8px !important;
247
+ border-radius: 50% !important;
248
+ display: inline-block !important;
249
+ margin-right: 6px !important;
250
+ }
251
+
252
+ .success-high { background-color: #4CAF50 !important; }
253
+ .success-medium { background-color: #FF9800 !important; }
254
+ .success-low { background-color: #F44336 !important; }
255
+
256
+ /* Refresh button styling */
257
+ .refresh-button {
258
+ background: linear-gradient(135deg, #2d5aa0, #1e3f73) !important;
259
+ color: white !important;
260
+ border: 1px solid #3a6bc7 !important;
261
+ margin: 0 0 10px 0 !important;
262
+ border-radius: 5px !important;
263
+ padding: 6px 8px !important;
264
+ transition: all 0.3s ease !important;
265
+ font-weight: 500 !important;
266
+ font-size: 11px !important;
267
+ text-transform: lowercase !important;
268
+ letter-spacing: 0.1px !important;
269
+ font-family: monospace !important;
270
+ width: 100% !important;
271
+ max-width: 100% !important;
272
+ min-width: 0 !important;
273
+ box-sizing: border-box !important;
274
+ white-space: nowrap !important;
275
+ overflow: hidden !important;
276
+ text-overflow: ellipsis !important;
277
+ }
278
+
279
+ .refresh-button:hover {
280
+ background: linear-gradient(135deg, #3a6bc7, #2d5aa0) !important;
281
+ border-color: #4a7bd9 !important;
282
+ }
283
+
284
+ /* Summary button styling - distinct from model buttons */
285
+ .summary-button {
286
+ background: linear-gradient(135deg, #4a4a4a, #3e3e3e) !important;
287
+ color: white !important;
288
+ border: 2px solid #555555 !important;
289
+ margin: 0 0 15px 0 !important;
290
+ border-radius: 5px !important;
291
+ padding: 12px 10px !important;
292
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important;
293
+ position: relative !important;
294
+ overflow: hidden !important;
295
+ box-shadow:
296
+ 0 4px 15px rgba(0, 0, 0, 0.3),
297
+ inset 0 1px 0 rgba(255, 255, 255, 0.2) !important;
298
+ font-weight: 600 !important;
299
+ font-size: 14px !important;
300
+ text-transform: uppercase !important;
301
+ letter-spacing: 0.3px !important;
302
+ font-family: monospace !important;
303
+ height: 60px !important;
304
+ display: flex !important;
305
+ flex-direction: column !important;
306
+ justify-content: center !important;
307
+ align-items: center !important;
308
+ line-height: 1.2 !important;
309
+ width: 100% !important;
310
+ max-width: 100% !important;
311
+ min-width: 0 !important;
312
+ box-sizing: border-box !important;
313
+ }
314
+
315
+ /* Simplified Gradio layout control */
316
+ .sidebar .gr-column,
317
+ .sidebar .gradio-column {
318
+ width: 100% !important;
319
+ }
320
+
321
+ /* Simplified Gradio targeting */
322
+ div[data-testid="column"]:has(.sidebar) {
323
+ width: 300px !important;
324
+ min-width: 300px !important;
325
+ }
326
+
327
+ /* Button container with fixed height - DISABLED */
328
+ /*
329
+ .button-container {
330
+ height: 50vh !important;
331
+ max-height: 50vh !important;
332
+ overflow-y: auto !important;
333
+ overflow-x: hidden !important;
334
+ scrollbar-width: thin !important;
335
+ scrollbar-color: #333333 #111111 !important;
336
+ width: 100% !important;
337
+ max-width: 100% !important;
338
+ box-sizing: border-box !important;
339
+ padding: 5px 0 !important;
340
+ margin-top: 10px !important;
341
+ }
342
+ */
343
+
344
+ /* Removed simple scroll CSS - was hiding buttons */
345
+
346
+ .summary-button:hover {
347
+ background: linear-gradient(135deg, #5a5a5a, #4e4e4e) !important;
348
+ color: #74b9ff !important;
349
+ border-color: #666666 !important;
350
+ }
351
+
352
+ .summary-button:active {
353
+ background: linear-gradient(135deg, #4a4a4a, #3e3e3e) !important;
354
+ color: #5a9bd4 !important;
355
+ }
356
+
357
+ /* Regular button styling for non-model buttons */
358
+ .gr-button:not(.model-button):not(.summary-button) {
359
+ background-color: #222222 !important;
360
+ color: white !important;
361
+ border: 1px solid #444444 !important;
362
+ margin: 5px 0 !important;
363
+ border-radius: 8px !important;
364
+ transition: all 0.3s ease !important;
365
+ }
366
+
367
+ .gr-button:not(.model-button):not(.summary-button):hover {
368
+ background-color: #333333 !important;
369
+ border-color: #666666 !important;
370
+ }
371
+
372
+ /* Plot container with smooth transitions and controlled scrolling */
373
+ .plot-container {
374
+ background-color: #000000 !important;
375
+ border: none !important;
376
+ transition: opacity 0.6s ease-in-out !important;
377
+ flex: 1 1 auto !important;
378
+ min-height: 0 !important;
379
+ overflow-y: auto !important;
380
+ scrollbar-width: thin !important;
381
+ scrollbar-color: #333333 #000000 !important;
382
+ }
383
+
384
+ /* Custom scrollbar for plot container */
385
+ .plot-container::-webkit-scrollbar {
386
+ width: 8px !important;
387
+ background: #000000 !important;
388
+ }
389
+
390
+ .plot-container::-webkit-scrollbar-track {
391
+ background: #000000 !important;
392
+ }
393
+
394
+ .plot-container::-webkit-scrollbar-thumb {
395
+ background-color: #333333 !important;
396
+ border-radius: 4px !important;
397
+ }
398
+
399
+ .plot-container::-webkit-scrollbar-thumb:hover {
400
+ background-color: #555555 !important;
401
+ }
402
+
403
+ /* Gradio plot component styling */
404
+ .gr-plot {
405
+ background-color: #000000 !important;
406
+ transition: opacity 0.6s ease-in-out !important;
407
+ }
408
+
409
+ .gr-plot .gradio-plot {
410
+ background-color: #000000 !important;
411
+ transition: opacity 0.6s ease-in-out !important;
412
+ }
413
+
414
+ .gr-plot img {
415
+ transition: opacity 0.6s ease-in-out !important;
416
+ }
417
+
418
+ /* Target the plot wrapper */
419
+ div[data-testid="plot"] {
420
+ background-color: #000000 !important;
421
+ }
422
+
423
+ /* Target all possible plot containers */
424
+ .plot-container img,
425
+ .gr-plot img,
426
+ .gradio-plot img {
427
+ background-color: #000000 !important;
428
+ }
429
+
430
+ /* Ensure plot area background */
431
+ .gr-plot > div,
432
+ .plot-container > div {
433
+ background-color: #000000 !important;
434
+ }
435
+
436
+ /* Prevent white flash during plot updates */
437
+ .plot-container::before {
438
+ content: "";
439
+ position: absolute;
440
+ top: 0;
441
+ left: 0;
442
+ right: 0;
443
+ bottom: 0;
444
+ background-color: #000000;
445
+ z-index: -1;
446
+ }
447
+
448
+ /* Force all plot elements to have black background */
449
+ .plot-container *,
450
+ .gr-plot *,
451
+ div[data-testid="plot"] * {
452
+ background-color: #000000 !important;
453
+ }
454
+
455
+ /* Override any white backgrounds in matplotlib */
456
+ .plot-container canvas,
457
+ .gr-plot canvas {
458
+ background-color: #000000 !important;
459
+ }
460
+
461
+ /* Text elements */
462
+ h1, h2, h3, p, .markdown {
463
+ color: white !important;
464
+ }
465
+
466
+ /* Sidebar header enhancement */
467
+ .sidebar h1 {
468
+ background: linear-gradient(45deg, #74b9ff, #a29bfe) !important;
469
+ -webkit-background-clip: text !important;
470
+ -webkit-text-fill-color: transparent !important;
471
+ background-clip: text !important;
472
+ text-align: center !important;
473
+ margin-bottom: 15px !important;
474
+ font-size: 28px !important;
475
+ font-weight: 700 !important;
476
+ font-family: monospace !important;
477
+ }
478
+
479
+ /* Sidebar description text */
480
+ .sidebar p {
481
+ text-align: center !important;
482
+ margin-bottom: 20px !important;
483
+ line-height: 1.5 !important;
484
+ font-size: 14px !important;
485
+ font-family: monospace !important;
486
+ }
487
+
488
+ /* CI Links styling */
489
+ .sidebar a {
490
+ color: #74b9ff !important;
491
+ text-decoration: none !important;
492
+ font-weight: 500 !important;
493
+ font-family: monospace !important;
494
+ transition: color 0.3s ease !important;
495
+ }
496
+
497
+ .sidebar a:hover {
498
+ color: #a29bfe !important;
499
+ text-decoration: underline !important;
500
+ }
501
+
502
+ .sidebar strong {
503
+ color: #74b9ff !important;
504
+ font-weight: 600 !important;
505
+ font-family: monospace !important;
506
+ }
507
+
508
+ .sidebar em {
509
+ color: #a29bfe !important;
510
+ font-style: normal !important;
511
+ opacity: 0.9 !important;
512
+ font-family: monospace !important;
513
+ }
514
+
515
+ /* Remove all borders globally */
516
+ * {
517
+ border-color: transparent !important;
518
+ }
519
+
520
+ /* Main content area */
521
+ .main-content {
522
+ background-color: #000000 !important;
523
+ padding: 0px 20px var(--main-content-bottom-margin, 10px) 20px !important;
524
+ margin-left: 300px !important;
525
+ height: 100vh !important;
526
+ overflow-y: auto !important;
527
+ box-sizing: border-box !important;
528
+ display: flex !important;
529
+ flex-direction: column !important;
530
+ }
531
+
532
+ /* Custom scrollbar for main content */
533
+ .main-content {
534
+ scrollbar-width: thin !important;
535
+ scrollbar-color: #333333 #000000 !important;
536
+ }
537
+
538
+ .main-content::-webkit-scrollbar {
539
+ width: 8px !important;
540
+ background: #000000 !important;
541
+ }
542
+
543
+ .main-content::-webkit-scrollbar-track {
544
+ background: #000000 !important;
545
+ }
546
+
547
+ .main-content::-webkit-scrollbar-thumb {
548
+ background-color: #333333 !important;
549
+ border-radius: 4px !important;
550
+ }
551
+
552
+ .main-content::-webkit-scrollbar-thumb:hover {
553
+ background-color: #555555 !important;
554
+ }
555
+
556
+ /* Failed tests display - seamless appearance with constrained height */
557
+ .failed-tests textarea {
558
+ background-color: #000000 !important;
559
+ color: #FFFFFF !important;
560
+ font-family: monospace !important;
561
+ font-size: 14px !important;
562
+ border: none !important;
563
+ padding: 10px !important;
564
+ outline: none !important;
565
+ line-height: 1.4 !important;
566
+ height: 180px !important;
567
+ max-height: 180px !important;
568
+ min-height: 180px !important;
569
+ overflow-y: auto !important;
570
+ resize: none !important;
571
+ scrollbar-width: thin !important;
572
+ scrollbar-color: #333333 #000000 !important;
573
+ scroll-behavior: auto !important;
574
+ transition: opacity 0.5s ease-in-out !important;
575
+ scroll-padding-top: 0 !important;
576
+ }
577
+
578
+ /* WebKit scrollbar styling for failed tests */
579
+ .failed-tests textarea::-webkit-scrollbar {
580
+ width: 8px !important;
581
+ }
582
+
583
+ .failed-tests textarea::-webkit-scrollbar-track {
584
+ background: #000000 !important;
585
+ }
586
+
587
+ .failed-tests textarea::-webkit-scrollbar-thumb {
588
+ background-color: #333333 !important;
589
+ border-radius: 4px !important;
590
+ }
591
+
592
+ .failed-tests textarea::-webkit-scrollbar-thumb:hover {
593
+ background-color: #555555 !important;
594
+ }
595
+
596
+ /* Prevent white flash in text boxes during updates */
597
+ .failed-tests::before {
598
+ content: "";
599
+ position: absolute;
600
+ top: 0;
601
+ left: 0;
602
+ right: 0;
603
+ bottom: 0;
604
+ background-color: #000000;
605
+ z-index: -1;
606
+ }
607
+
608
+ .failed-tests {
609
+ background-color: #000000 !important;
610
+ height: 200px !important;
611
+ max-height: 200px !important;
612
+ min-height: 200px !important;
613
+ position: relative;
614
+ transition: opacity 0.5s ease-in-out !important;
615
+ flex-shrink: 0 !important;
616
+ }
617
+
618
+ .failed-tests .gr-textbox {
619
+ background-color: #000000 !important;
620
+ border: none !important;
621
+ height: 180px !important;
622
+ max-height: 180px !important;
623
+ min-height: 180px !important;
624
+ transition: opacity 0.5s ease-in-out !important;
625
+ }
626
+
627
+ /* Force all textbox elements to have black background */
628
+ .failed-tests *,
629
+ .failed-tests .gr-textbox *,
630
+ .failed-tests textarea * {
631
+ background-color: #000000 !important;
632
+ }
633
+
634
+ /* Summary display styling */
635
+ .summary-display textarea {
636
+ background-color: #000000 !important;
637
+ color: #FFFFFF !important;
638
+ font-family: monospace !important;
639
+ font-size: 24px !important;
640
+ border: none !important;
641
+ padding: 20px !important;
642
+ outline: none !important;
643
+ line-height: 2 !important;
644
+ text-align: right !important;
645
+ resize: none !important;
646
+ }
647
+
648
+ .summary-display {
649
+ background-color: #000000 !important;
650
+ }
651
+
652
+ /* Detail view layout */
653
+ .detail-view {
654
+ display: flex !important;
655
+ flex-direction: column !important;
656
+ height: 100% !important;
657
+ min-height: 0 !important;
658
+ }
659
+
660
+ /* JavaScript to reset scroll position */
661
+ .scroll-reset {
662
+ animation: resetScroll 0.1s ease;
663
+ }
664
+
665
+ @keyframes resetScroll {
666
+ 0% { scroll-behavior: auto; }
667
+ 100% { scroll-behavior: auto; }
668
+ }
669
+
summary_page.py ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import matplotlib.pyplot as plt
2
+ import pandas as pd
3
+ from data import extract_model_data
4
+
5
+ # Layout parameters
6
+ COLUMNS = 3
7
+
8
+ # Derived constants
9
+ COLUMN_WIDTH = 100 / COLUMNS # Each column takes 25% of width
10
+ BAR_WIDTH = COLUMN_WIDTH * 0.8 # 80% of column width for bars
11
+ BAR_MARGIN = COLUMN_WIDTH * 0.1 # 10% margin on each side
12
+
13
+ # Figure dimensions
14
+ FIGURE_WIDTH = 22 # Wider to accommodate columns and legend
15
+ MAX_HEIGHT = 14 # Maximum height in inches
16
+ MIN_HEIGHT_PER_ROW = 2.8
17
+ FIGURE_PADDING = 1
18
+
19
+ # Bar styling
20
+ BAR_HEIGHT_RATIO = 0.22 # Bar height as ratio of vertical spacing
21
+ VERTICAL_SPACING_RATIO = 0.2 # Base vertical position ratio
22
+ AMD_BAR_OFFSET = 0.25 # AMD bar offset ratio
23
+ NVIDIA_BAR_OFFSET = 0.54 # NVIDIA bar offset ratio
24
+
25
+ # Colors
26
+ COLORS = {
27
+ 'passed': '#4CAF50',
28
+ 'failed': '#E53E3E',
29
+ 'skipped': '#FFD54F',
30
+ 'error': '#8B0000',
31
+ 'empty': "#5B5B5B"
32
+ }
33
+
34
+ # Font styling
35
+ MODEL_NAME_FONT_SIZE = 16
36
+ LABEL_FONT_SIZE = 14
37
+ LABEL_OFFSET = 1 # Distance of label from bar
38
+ FAILURE_RATE_FONT_SIZE = 28
39
+
40
+
41
+ def calculate_overall_failure_rates(df: pd.DataFrame, available_models: list[str]) -> tuple[float, float]:
42
+ """Calculate overall failure rates for AMD and NVIDIA across all models."""
43
+ if df.empty or not available_models:
44
+ return 0.0, 0.0
45
+
46
+ total_amd_tests = 0
47
+ total_amd_failures = 0
48
+ total_nvidia_tests = 0
49
+ total_nvidia_failures = 0
50
+
51
+ for model_name in available_models:
52
+ if model_name not in df.index:
53
+ continue
54
+
55
+ row = df.loc[model_name]
56
+ amd_stats, nvidia_stats = extract_model_data(row)[:2]
57
+
58
+ # AMD totals
59
+ amd_total = amd_stats['passed'] + amd_stats['failed'] + amd_stats['error']
60
+ if amd_total > 0:
61
+ total_amd_tests += amd_total
62
+ total_amd_failures += amd_stats['failed'] + amd_stats['error']
63
+
64
+ # NVIDIA totals
65
+ nvidia_total = nvidia_stats['passed'] + nvidia_stats['failed'] + nvidia_stats['error']
66
+ if nvidia_total > 0:
67
+ total_nvidia_tests += nvidia_total
68
+ total_nvidia_failures += nvidia_stats['failed'] + nvidia_stats['error']
69
+
70
+ amd_failure_rate = (total_amd_failures / total_amd_tests * 100) if total_amd_tests > 0 else 0.0
71
+ nvidia_failure_rate = (total_nvidia_failures / total_nvidia_tests * 100) if total_nvidia_tests > 0 else 0.0
72
+
73
+ return amd_failure_rate, nvidia_failure_rate
74
+
75
+
76
+ def draw_text_and_bar(
77
+ label: str,
78
+ stats: dict[str, int],
79
+ y_bar: float,
80
+ column_left_position: float,
81
+ bar_height: float,
82
+ ax: plt.Axes,
83
+ ) -> None:
84
+ """Draw a horizontal bar chart for given stats and its label on the left."""
85
+ # Text
86
+ label_x = column_left_position - LABEL_OFFSET
87
+ failures_present = any(stats[category] > 0 for category in ['failed', 'error'])
88
+ if failures_present:
89
+ props = dict(boxstyle='round', facecolor=COLORS['failed'], alpha=0.35)
90
+ else:
91
+ props = dict(alpha=0)
92
+ ax.text(
93
+ label_x, y_bar, label, ha='right', va='center', color='#CCCCCC', fontsize=LABEL_FONT_SIZE,
94
+ fontfamily='monospace', fontweight='normal', bbox=props
95
+ )
96
+ # Bar
97
+ total = sum(stats.values())
98
+ if total > 0:
99
+ left = column_left_position
100
+ for category in ['passed', 'failed', 'skipped', 'error']:
101
+ if stats[category] > 0:
102
+ width = stats[category] / total * BAR_WIDTH
103
+ ax.barh(y_bar, width, left=left, height=bar_height, color=COLORS[category], alpha=0.9)
104
+ left += width
105
+ else:
106
+ ax.barh(y_bar, BAR_WIDTH, left=column_left_position, height=bar_height, color=COLORS['empty'], alpha=0.9)
107
+
108
+ def create_summary_page(df: pd.DataFrame, available_models: list[str]) -> plt.Figure:
109
+ """Create a summary page with model names and both AMD/NVIDIA test stats bars."""
110
+ if df.empty:
111
+ fig, ax = plt.subplots(figsize=(16, 8), facecolor='#000000')
112
+ ax.set_facecolor('#000000')
113
+ ax.text(0.5, 0.5, 'No data available',
114
+ horizontalalignment='center', verticalalignment='center',
115
+ transform=ax.transAxes, fontsize=20, color='#888888',
116
+ fontfamily='monospace', weight='normal')
117
+ ax.axis('off')
118
+ return fig
119
+
120
+ # Calculate overall failure rates
121
+ amd_failure_rate, nvidia_failure_rate = calculate_overall_failure_rates(df, available_models)
122
+
123
+ # Calculate dimensions for N-column layout
124
+ model_count = len(available_models)
125
+ rows = (model_count + COLUMNS - 1) // COLUMNS # Ceiling division
126
+
127
+ # Figure dimensions - wider for columns, height based on rows
128
+ height_per_row = min(MIN_HEIGHT_PER_ROW, MAX_HEIGHT / max(rows, 1))
129
+ figure_height = min(MAX_HEIGHT, rows * height_per_row + FIGURE_PADDING)
130
+
131
+ fig, ax = plt.subplots(figsize=(FIGURE_WIDTH, figure_height), facecolor='#000000')
132
+ ax.set_facecolor('#000000')
133
+
134
+ # Add overall failure rates at the top as a proper title
135
+ failure_text = f"Overall Failure Rates: AMD {amd_failure_rate:.1f}% | NVIDIA {nvidia_failure_rate:.1f}%"
136
+ ax.text(50, -1.25, failure_text, ha='center', va='top',
137
+ color='#FFFFFF', fontsize=FAILURE_RATE_FONT_SIZE,
138
+ fontfamily='monospace', fontweight='bold')
139
+
140
+ visible_model_count = 0
141
+ max_y = 0
142
+
143
+ for i, model_name in enumerate(available_models):
144
+ if model_name not in df.index:
145
+ continue
146
+
147
+ row = df.loc[model_name]
148
+
149
+ # Extract and process model data
150
+ amd_stats, nvidia_stats = extract_model_data(row)[:2]
151
+
152
+ # Calculate position in 4-column grid
153
+ col = visible_model_count % COLUMNS
154
+ row = visible_model_count // COLUMNS
155
+
156
+ # Calculate horizontal position for this column
157
+ col_left = col * COLUMN_WIDTH + BAR_MARGIN
158
+ col_center = col * COLUMN_WIDTH + COLUMN_WIDTH / 2
159
+
160
+ # Calculate vertical position for this row - start from top
161
+ vertical_spacing = height_per_row
162
+ y_base = (VERTICAL_SPACING_RATIO + row) * vertical_spacing
163
+ y_model_name = y_base # Model name above AMD bar
164
+ y_amd_bar = y_base + vertical_spacing * AMD_BAR_OFFSET # AMD bar
165
+ y_nvidia_bar = y_base + vertical_spacing * NVIDIA_BAR_OFFSET # NVIDIA bar
166
+ max_y = max(max_y, y_nvidia_bar + vertical_spacing * 0.3)
167
+
168
+ # Model name centered above the bars in this column
169
+ ax.text(col_center, y_model_name, model_name.lower(),
170
+ ha='center', va='center', color='#FFFFFF',
171
+ fontsize=MODEL_NAME_FONT_SIZE, fontfamily='monospace', fontweight='bold')
172
+
173
+ # AMD label and bar in this column
174
+ bar_height = min(0.4, vertical_spacing * BAR_HEIGHT_RATIO)
175
+ # Draw AMD bar
176
+ draw_text_and_bar("amd", amd_stats, y_amd_bar, col_left, bar_height, ax)
177
+ # Draw NVIDIA bar
178
+ draw_text_and_bar("nvidia", nvidia_stats, y_nvidia_bar, col_left, bar_height, ax)
179
+
180
+ # Increment counter for next visible model
181
+ visible_model_count += 1
182
+
183
+
184
+ # Add legend horizontally in bottom right corner
185
+ patch_height = 0.3
186
+ patch_width = 3
187
+
188
+ legend_start_x = 68.7
189
+ legend_y = max_y + 1
190
+ legend_spacing = 10
191
+ legend_font_size = 15
192
+
193
+ # Add failure rate explanation text on the left
194
+ # explanation_text = "Failure rate = failed / (passed + failed)"
195
+ # ax.text(0, legend_y, explanation_text,
196
+ # ha='left', va='bottom', color='#CCCCCC',
197
+ # fontsize=legend_font_size, fontfamily='monospace', style='italic')
198
+
199
+ # Legend entries
200
+ legend_items = [
201
+ ('passed', 'Passed'),
202
+ ('failed', 'Failed'),
203
+ ('skipped', 'Skipped'),
204
+ ]
205
+
206
+ for i, (status, label) in enumerate(legend_items):
207
+ x_pos = legend_start_x + i * legend_spacing
208
+ # Small colored square
209
+ ax.add_patch(plt.Rectangle((x_pos - 0.6, legend_y), patch_width, -patch_height,
210
+ facecolor=COLORS[status], alpha=0.9))
211
+ # Status label
212
+ ax.text(x_pos + patch_width, legend_y, label,
213
+ ha='left', va='bottom', color='#CCCCCC',
214
+ fontsize=legend_font_size, fontfamily='monospace')
215
+
216
+ # Style the axes to be completely invisible and span full width
217
+ ax.set_xlim(-5, 105) # Slightly wider to accommodate labels
218
+ ax.set_ylim(0, max_y + 1) # Add some padding at the top for title
219
+ ax.set_xlabel('')
220
+ ax.set_ylabel('')
221
+ ax.spines['bottom'].set_visible(False)
222
+ ax.spines['left'].set_visible(False)
223
+ ax.spines['top'].set_visible(False)
224
+ ax.spines['right'].set_visible(False)
225
+ ax.set_xticks([])
226
+ ax.set_yticks([])
227
+ ax.yaxis.set_inverted(True)
228
+
229
+ # Remove all margins to make figure stick to top
230
+ plt.tight_layout()
231
+ return fig
utils.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import sys
3
+ from datetime import datetime
4
+
5
+
6
+ class TimestampFormatter(logging.Formatter):
7
+ """Custom formatter that matches the existing timestamp format used in print statements."""
8
+
9
+ def format(self, record):
10
+ # Create timestamp in the same format as existing print statements
11
+ timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
12
+
13
+ # Format the message with timestamp prefix
14
+ if record.levelno == logging.WARNING:
15
+ return f"WARNING: {record.getMessage()}"
16
+ elif record.levelno == logging.ERROR:
17
+ return f"Error {record.getMessage()}"
18
+ else:
19
+ return f"[{timestamp}] {record.getMessage()}"
20
+
21
+
22
+ def setup_logger(name="tcid", level=logging.INFO):
23
+ """Set up logger with custom timestamp formatting to match existing print format."""
24
+ logger = logging.getLogger(name)
25
+
26
+ # Avoid adding multiple handlers if logger already exists
27
+ if logger.handlers:
28
+ return logger
29
+
30
+ logger.setLevel(level)
31
+
32
+ # Create console handler
33
+ handler = logging.StreamHandler(sys.stdout)
34
+ handler.setLevel(level)
35
+
36
+ # Set custom formatter
37
+ formatter = TimestampFormatter()
38
+ handler.setFormatter(formatter)
39
+
40
+ logger.addHandler(handler)
41
+
42
+ return logger
43
+
44
+
45
+ # Create default logger instance
46
+ logger = setup_logger()
47
+
48
+
49
+
50
+ def generate_underlined_line(text: str) -> str:
51
+ return text + "\n" + "─" * len(text)