Minette Kaunismäki commited on
Commit
925fd12
·
1 Parent(s): 465cf7a

small fixes based on review

Browse files
Files changed (2) hide show
  1. app.py +38 -28
  2. ui.py +29 -23
app.py CHANGED
@@ -581,14 +581,19 @@ button.theme-toggle[data-mode="light"] .theme-icon-moon { display: block !import
581
  .prose .ranking-table td {
582
  padding: 8px 10px !important;
583
  }
 
 
 
 
584
  .ranking-table .rank,
585
  .prose .ranking-table .rank,
586
  .ranking-table th.rank {
587
  position: sticky !important;
588
  left: 0 !important;
589
- width: 2.4rem;
590
- min-width: 2.4rem;
591
- box-shadow: 6px 0 8px -6px rgba(0, 0, 0, 0.45);
 
592
  }
593
  .ranking-table .model-cell,
594
  .prose .ranking-table .model-cell {
@@ -598,6 +603,7 @@ button.theme-toggle[data-mode="light"] .theme-icon-moon { display: block !import
598
  min-width: 140px;
599
  max-width: none;
600
  background: transparent !important;
 
601
  }
602
  .ranking-table th.model-cell,
603
  .prose .ranking-table th.model-cell {
@@ -608,6 +614,7 @@ button.theme-toggle[data-mode="light"] .theme-icon-moon { display: block !import
608
  min-width: 140px;
609
  max-width: none;
610
  background: var(--pruna-bg-header) !important;
 
611
  }
612
  .ranking-table tbody tr:hover .model-cell {
613
  background: var(--pruna-table-hover) !important;
@@ -1107,11 +1114,11 @@ button.theme-toggle[data-mode="light"] .theme-icon-moon { display: block !import
1107
  max-height: min(70vh, 720px);
1108
  overflow-x: auto;
1109
  overflow-y: auto;
1110
- -webkit-overflow-scrolling: touch;
1111
- overscroll-behavior-x: contain;
1112
  }
1113
  .ranking-table,
1114
  .prose .ranking-table {
 
1115
  width: 100%;
1116
  margin: 0 !important;
1117
  overflow: visible;
@@ -1187,10 +1194,14 @@ button.theme-toggle[data-mode="light"] .theme-icon-moon { display: block !import
1187
  .prose .ranking-table .rank {
1188
  position: sticky;
1189
  left: 0;
1190
- z-index: 1;
1191
  box-sizing: border-box;
1192
- width: 3.25rem;
1193
- min-width: 3.25rem;
 
 
 
 
1194
  color: var(--pruna-lavender) !important;
1195
  font-weight: 700 !important;
1196
  text-align: center;
@@ -1207,18 +1218,21 @@ button.theme-toggle[data-mode="light"] .theme-icon-moon { display: block !import
1207
  .ranking-table .model-cell,
1208
  .prose .ranking-table .model-cell {
1209
  position: sticky;
1210
- left: 3.25rem;
1211
- z-index: 1;
 
1212
  min-width: 180px;
1213
  max-width: 260px;
1214
  background: var(--pruna-table-sticky) !important;
 
1215
  }
1216
  .ranking-table th.model-cell,
1217
  .prose .ranking-table th.model-cell {
1218
  top: 0;
1219
- left: 3.25rem;
1220
  z-index: 5;
1221
  background: var(--pruna-bg-header) !important;
 
1222
  }
1223
  .ranking-table tbody tr:hover .rank,
1224
  .ranking-table tbody tr:hover .model-cell {
@@ -2307,8 +2321,7 @@ def load_video_editing_dataframe(path):
2307
  df = df.rename(
2308
  columns={
2309
  "display_name": "Model",
2310
- "elo": "Video Edit Elo",
2311
- "n_generations": "Generations",
2312
  "min_generation_s": "Min Generation Time (s)",
2313
  "median_generation_s": "Median Generation Time (s)",
2314
  "p20_generation_s": "P20 Generation Time (s)",
@@ -2317,23 +2330,22 @@ def load_video_editing_dataframe(path):
2317
  "model_execution_time_s_per_output_video_s": (
2318
  "Execution Time / Output Video Second (s)"
2319
  ),
2320
- "price": "Price / Video (USD)",
2321
  }
2322
  )
2323
- df = df.drop(columns=["wandb_run_ids"], errors="ignore")
2324
  df["Model"] = df["Model"].astype(str).str.strip()
2325
  df = _as_numeric(
2326
  df,
2327
  [
2328
- "Video Edit Elo",
2329
- "Generations",
2330
  "Min Generation Time (s)",
2331
  "Median Generation Time (s)",
2332
  "P20 Generation Time (s)",
2333
  "Time / Output Video Second (s)",
2334
  "Predict Time / Output Video Second (s)",
2335
  "Execution Time / Output Video Second (s)",
2336
- "Price / Video (USD)",
2337
  ],
2338
  )
2339
  end_to_end = df.get("Time / Output Video Second (s)")
@@ -2460,12 +2472,11 @@ video_display_columns = [
2460
  col
2461
  for col in [
2462
  "Model",
2463
- "Video Edit Elo",
2464
- "Generations",
2465
  "Median Generation Time (s)",
2466
  "Min Generation Time (s)",
2467
- "Time / Output Video Second (s)",
2468
- "Price / Video (USD)",
2469
  ]
2470
  if col in video_df.columns
2471
  ]
@@ -2490,7 +2501,6 @@ metrics = [
2490
  {"id": "arena_art", "column": "Arena Art Elo"},
2491
  {"id": "arena_portraits", "column": "Arena Portraits Elo"},
2492
  {"id": "arena_text", "column": "Arena Text Rendering Elo"},
2493
- {"id": "video_edit_elo", "column": "Video Edit Elo"},
2494
  ]
2495
 
2496
 
@@ -2531,20 +2541,20 @@ arena_metric_ids = _metric_ids_for(
2531
  "arena_text",
2532
  ],
2533
  )
2534
- video_metric_ids = _metric_ids_for(video_df, ["video_edit_elo"])
2535
 
2536
  datasets = [
2537
  {
2538
  "id": "video_editing",
2539
- "name": "Video Editing Dataset",
2540
  "modality": "video_to_video",
2541
  "data": video_df,
2542
  "columns": video_display_columns,
2543
  "metric_ids": video_metric_ids,
2544
  "note": (
2545
- "Elo from pairwise video-edit preference. Price is USD per output "
2546
- "video. Seconds for 1s of video is how long it takes to produce "
2547
- "one second of output video (end-to-end wall time)."
2548
  ),
2549
  "samples": None,
2550
  },
 
581
  .prose .ranking-table td {
582
  padding: 8px 10px !important;
583
  }
584
+ .ranking-table,
585
+ .prose .ranking-table {
586
+ --rank-col-width: 3.25rem;
587
+ }
588
  .ranking-table .rank,
589
  .prose .ranking-table .rank,
590
  .ranking-table th.rank {
591
  position: sticky !important;
592
  left: 0 !important;
593
+ width: var(--rank-col-width);
594
+ min-width: var(--rank-col-width);
595
+ max-width: var(--rank-col-width);
596
+ box-shadow: none;
597
  }
598
  .ranking-table .model-cell,
599
  .prose .ranking-table .model-cell {
 
603
  min-width: 140px;
604
  max-width: none;
605
  background: transparent !important;
606
+ box-shadow: none !important;
607
  }
608
  .ranking-table th.model-cell,
609
  .prose .ranking-table th.model-cell {
 
614
  min-width: 140px;
615
  max-width: none;
616
  background: var(--pruna-bg-header) !important;
617
+ box-shadow: 0 1px 0 var(--pruna-hairline) !important;
618
  }
619
  .ranking-table tbody tr:hover .model-cell {
620
  background: var(--pruna-table-hover) !important;
 
1114
  max-height: min(70vh, 720px);
1115
  overflow-x: auto;
1116
  overflow-y: auto;
1117
+ overscroll-behavior: none;
 
1118
  }
1119
  .ranking-table,
1120
  .prose .ranking-table {
1121
+ --rank-col-width: 4.25rem;
1122
  width: 100%;
1123
  margin: 0 !important;
1124
  overflow: visible;
 
1194
  .prose .ranking-table .rank {
1195
  position: sticky;
1196
  left: 0;
1197
+ z-index: 2;
1198
  box-sizing: border-box;
1199
+ width: var(--rank-col-width);
1200
+ min-width: var(--rank-col-width);
1201
+ max-width: var(--rank-col-width);
1202
+ padding-left: 0.5rem !important;
1203
+ padding-right: 0.5rem !important;
1204
+ overflow: hidden;
1205
  color: var(--pruna-lavender) !important;
1206
  font-weight: 700 !important;
1207
  text-align: center;
 
1218
  .ranking-table .model-cell,
1219
  .prose .ranking-table .model-cell {
1220
  position: sticky;
1221
+ left: var(--rank-col-width);
1222
+ z-index: 2;
1223
+ box-sizing: border-box;
1224
  min-width: 180px;
1225
  max-width: 260px;
1226
  background: var(--pruna-table-sticky) !important;
1227
+ box-shadow: 8px 0 10px -8px rgba(0, 0, 0, 0.35) !important;
1228
  }
1229
  .ranking-table th.model-cell,
1230
  .prose .ranking-table th.model-cell {
1231
  top: 0;
1232
+ left: var(--rank-col-width);
1233
  z-index: 5;
1234
  background: var(--pruna-bg-header) !important;
1235
+ box-shadow: 0 1px 0 var(--pruna-hairline), 8px 0 10px -8px rgba(0, 0, 0, 0.35) !important;
1236
  }
1237
  .ranking-table tbody tr:hover .rank,
1238
  .ranking-table tbody tr:hover .model-cell {
 
2321
  df = df.rename(
2322
  columns={
2323
  "display_name": "Model",
2324
+ "elo": "Datapoint Elo",
 
2325
  "min_generation_s": "Min Generation Time (s)",
2326
  "median_generation_s": "Median Generation Time (s)",
2327
  "p20_generation_s": "P20 Generation Time (s)",
 
2330
  "model_execution_time_s_per_output_video_s": (
2331
  "Execution Time / Output Video Second (s)"
2332
  ),
2333
+ "price": "Price / Second of Video (USD)",
2334
  }
2335
  )
2336
+ df = df.drop(columns=["wandb_run_ids", "n_generations"], errors="ignore")
2337
  df["Model"] = df["Model"].astype(str).str.strip()
2338
  df = _as_numeric(
2339
  df,
2340
  [
2341
+ "Datapoint Elo",
 
2342
  "Min Generation Time (s)",
2343
  "Median Generation Time (s)",
2344
  "P20 Generation Time (s)",
2345
  "Time / Output Video Second (s)",
2346
  "Predict Time / Output Video Second (s)",
2347
  "Execution Time / Output Video Second (s)",
2348
+ "Price / Second of Video (USD)",
2349
  ],
2350
  )
2351
  end_to_end = df.get("Time / Output Video Second (s)")
 
2472
  col
2473
  for col in [
2474
  "Model",
2475
+ "Datapoint Elo",
2476
+ "Time / Output Video Second (s)",
2477
  "Median Generation Time (s)",
2478
  "Min Generation Time (s)",
2479
+ "Price / Second of Video (USD)",
 
2480
  ]
2481
  if col in video_df.columns
2482
  ]
 
2501
  {"id": "arena_art", "column": "Arena Art Elo"},
2502
  {"id": "arena_portraits", "column": "Arena Portraits Elo"},
2503
  {"id": "arena_text", "column": "Arena Text Rendering Elo"},
 
2504
  ]
2505
 
2506
 
 
2541
  "arena_text",
2542
  ],
2543
  )
2544
+ video_metric_ids = _metric_ids_for(video_df, ["datapoint_elo"])
2545
 
2546
  datasets = [
2547
  {
2548
  "id": "video_editing",
2549
+ "name": "Pruna Internal Video-Edit Benchmark",
2550
  "modality": "video_to_video",
2551
  "data": video_df,
2552
  "columns": video_display_columns,
2553
  "metric_ids": video_metric_ids,
2554
  "note": (
2555
+ "Datapoint Elo from pairwise video-edit preference. Price is USD "
2556
+ "per second of output video. Generation time per second of video "
2557
+ "is end-to-end wall time to produce one second of output."
2558
  ),
2559
  "samples": None,
2560
  },
ui.py CHANGED
@@ -25,18 +25,18 @@ MAX_COMPARE_PROMPTS = 8
25
  MAX_PARETO_METRICS = 8
26
  _PARETO_SLOT_COUNT = 1 + MAX_PARETO_METRICS * 8
27
  _PARETO_PRICE_COLUMN = "Price / Image (USD)"
28
- _PARETO_VIDEO_PRICE_COLUMN = "Price / Video (USD)"
29
  _PARETO_PRICE_COLUMNS = (_PARETO_PRICE_COLUMN, _PARETO_VIDEO_PRICE_COLUMN)
30
  _PARETO_TIME_COLUMN = "Min Generation Time (s)"
31
  _PARETO_VIDEO_TIME_COLUMN = "Pareto Time / Output Video Second (s)"
32
  _PARETO_TIME_COLUMNS = (_PARETO_VIDEO_TIME_COLUMN, _PARETO_TIME_COLUMN)
33
  _PARETO_PRICE_TITLES = {
34
  _PARETO_PRICE_COLUMN: "Price per image (USD)",
35
- _PARETO_VIDEO_PRICE_COLUMN: "Price per video (USD)",
36
  }
37
  _PARETO_TIME_TITLES = {
38
  _PARETO_TIME_COLUMN: "Min generation time (s)",
39
- _PARETO_VIDEO_TIME_COLUMN: "Seconds needed for 1s of output video",
40
  }
41
  _PARETO_SCALE_CHOICES = [
42
  ("Log", "Logarithmic"),
@@ -105,9 +105,16 @@ prompt suites, so samples are not shown.
105
 
106
  ## Current datasets
107
 
108
- ### Video Editing Dataset
109
- Video-to-video edit Elo from pairwise preference, with price per output
110
- video and generation time. Samples are not shown yet.
 
 
 
 
 
 
 
111
 
112
  ### Qwen Image Dataset
113
  100 prompts from the 1,000-prompt Qwen Image Bench set, sampled for coverage
@@ -151,12 +158,14 @@ ABOUT_DETAILS_CONTENT = """
151
  - **Arena Elo**: Elo published by Arena AI on their own dataset, plus
152
  category Elos (branding, 3D, cartoon/anime, photorealistic, art, portraits,
153
  text rendering).
154
- - **Generation time**: median and minimum generation time in seconds, as
155
- reported in the evaluation table. This is not a p95, and we do not state
156
- warm vs cold or concurrent load. Not available for Arena AI.
157
- - **Price**: USD per image in the evaluation table. We do not state list
158
- price vs amount paid, or whether failed generations are included. Not
159
- available for Arena AI.
 
 
160
 
161
  Scores from different datasets or metrics are **not interchangeable**. A high
162
  OneIG alignment score is not the same quantity as a Datapoint Elo. Compare
@@ -456,12 +465,11 @@ _LEADERBOARD_IDENTITY_COLUMNS = [
456
  "Optimized",
457
  ]
458
  _LEADERBOARD_META_COLUMNS = [
 
459
  "Median Generation Time (s)",
460
  "Min Generation Time (s)",
461
- "Time / Output Video Second (s)",
462
  "Price / Image (USD)",
463
- "Price / Video (USD)",
464
- "Generations",
465
  "Evaluation Date (UTC)",
466
  "Date",
467
  ]
@@ -513,7 +521,7 @@ def _format_leaderboard_cell(column, value):
513
  if pd.isna(value) or value is None or value == "":
514
  return "-"
515
  label = str(column).lower()
516
- if label in {"rank", "generations"}:
517
  return str(int(value))
518
  if "price" in label:
519
  return _format_price(value)
@@ -688,11 +696,9 @@ def _display_label(column):
688
  "Arena Text Rendering Elo": "Text Rendering",
689
  "Median Generation Time (s)": "Median generation time",
690
  "Min Generation Time (s)": "Min generation time",
691
- "Time / Output Video Second (s)": "Seconds for 1s of video",
692
  "Price / Image (USD)": "Price per image",
693
- "Price / Video (USD)": "Price per video",
694
- "Video Edit Elo": "Elo",
695
- "Generations": "Generations",
696
  "Evaluation Date (UTC)": "Date",
697
  "Date": "Date",
698
  }
@@ -1035,7 +1041,7 @@ def _pareto_pair(
1035
  price_column = _pareto_price_column(data) or _PARETO_PRICE_COLUMN
1036
  price_title = _PARETO_PRICE_TITLES.get(price_column, "Price (USD)")
1037
  price_missing = (
1038
- "Price per video isn't available for this dataset."
1039
  if price_column == _PARETO_VIDEO_PRICE_COLUMN
1040
  else "Price per image isn't available for this dataset."
1041
  )
@@ -1052,12 +1058,12 @@ def _pareto_pair(
1052
  time_column = _pareto_time_column(data) or _PARETO_TIME_COLUMN
1053
  time_title = _PARETO_TIME_TITLES.get(time_column, "Generation time (s)")
1054
  time_missing = (
1055
- "Seconds needed for 1s of output video isn't available for this dataset."
1056
  if time_column == _PARETO_VIDEO_TIME_COLUMN
1057
  else "Min generation time isn't available for this dataset."
1058
  )
1059
  time_empty = (
1060
- "No models have both a score and seconds needed for 1s of output "
1061
  "video for this metric."
1062
  if time_column == _PARETO_VIDEO_TIME_COLUMN
1063
  else "No models have both a score and a min generation time for this metric."
 
25
  MAX_PARETO_METRICS = 8
26
  _PARETO_SLOT_COUNT = 1 + MAX_PARETO_METRICS * 8
27
  _PARETO_PRICE_COLUMN = "Price / Image (USD)"
28
+ _PARETO_VIDEO_PRICE_COLUMN = "Price / Second of Video (USD)"
29
  _PARETO_PRICE_COLUMNS = (_PARETO_PRICE_COLUMN, _PARETO_VIDEO_PRICE_COLUMN)
30
  _PARETO_TIME_COLUMN = "Min Generation Time (s)"
31
  _PARETO_VIDEO_TIME_COLUMN = "Pareto Time / Output Video Second (s)"
32
  _PARETO_TIME_COLUMNS = (_PARETO_VIDEO_TIME_COLUMN, _PARETO_TIME_COLUMN)
33
  _PARETO_PRICE_TITLES = {
34
  _PARETO_PRICE_COLUMN: "Price per image (USD)",
35
+ _PARETO_VIDEO_PRICE_COLUMN: "Price per second of video (USD)",
36
  }
37
  _PARETO_TIME_TITLES = {
38
  _PARETO_TIME_COLUMN: "Min generation time (s)",
39
+ _PARETO_VIDEO_TIME_COLUMN: "Generation time per second of video",
40
  }
41
  _PARETO_SCALE_CHOICES = [
42
  ("Log", "Logarithmic"),
 
105
 
106
  ## Current datasets
107
 
108
+ ### Pruna Internal Video-Edit Benchmark
109
+ Pruna's internal video-to-video editing benchmark, collected by our
110
+ research engineers. It combines prompts from public video-editing
111
+ benchmarks with use-case examples we gathered for advertisement,
112
+ e-commerce, real estate, concept art, and similar work. The suite also
113
+ covers camera-angle and movement changes, lighting, and text in video
114
+ (altering, adding, or removing it). Quality is Datapoint Elo from
115
+ pairwise preference. Price is USD per second of output video;
116
+ generation time is wall time per second of output video. Samples are
117
+ not shown yet.
118
 
119
  ### Qwen Image Dataset
120
  100 prompts from the 1,000-prompt Qwen Image Bench set, sampled for coverage
 
158
  - **Arena Elo**: Elo published by Arena AI on their own dataset, plus
159
  category Elos (branding, 3D, cartoon/anime, photorealistic, art, portraits,
160
  text rendering).
161
+ - **Generation time**: median and minimum generation time in seconds for
162
+ images, as reported in the evaluation table. For video, generation time
163
+ per second of output video is the more informative figure (end-to-end
164
+ wall time). This is not a p95, and we do not state warm vs cold or
165
+ concurrent load. Not available for Arena AI.
166
+ - **Price**: USD per image for text-to-image, or USD per second of output
167
+ video for video-to-video. We do not state list price vs amount paid, or
168
+ whether failed generations are included. Not available for Arena AI.
169
 
170
  Scores from different datasets or metrics are **not interchangeable**. A high
171
  OneIG alignment score is not the same quantity as a Datapoint Elo. Compare
 
465
  "Optimized",
466
  ]
467
  _LEADERBOARD_META_COLUMNS = [
468
+ "Time / Output Video Second (s)",
469
  "Median Generation Time (s)",
470
  "Min Generation Time (s)",
 
471
  "Price / Image (USD)",
472
+ "Price / Second of Video (USD)",
 
473
  "Evaluation Date (UTC)",
474
  "Date",
475
  ]
 
521
  if pd.isna(value) or value is None or value == "":
522
  return "-"
523
  label = str(column).lower()
524
+ if label == "rank":
525
  return str(int(value))
526
  if "price" in label:
527
  return _format_price(value)
 
696
  "Arena Text Rendering Elo": "Text Rendering",
697
  "Median Generation Time (s)": "Median generation time",
698
  "Min Generation Time (s)": "Min generation time",
699
+ "Time / Output Video Second (s)": "Generation time per second of video",
700
  "Price / Image (USD)": "Price per image",
701
+ "Price / Second of Video (USD)": "Price per second of video",
 
 
702
  "Evaluation Date (UTC)": "Date",
703
  "Date": "Date",
704
  }
 
1041
  price_column = _pareto_price_column(data) or _PARETO_PRICE_COLUMN
1042
  price_title = _PARETO_PRICE_TITLES.get(price_column, "Price (USD)")
1043
  price_missing = (
1044
+ "Price per second of video isn't available for this dataset."
1045
  if price_column == _PARETO_VIDEO_PRICE_COLUMN
1046
  else "Price per image isn't available for this dataset."
1047
  )
 
1058
  time_column = _pareto_time_column(data) or _PARETO_TIME_COLUMN
1059
  time_title = _PARETO_TIME_TITLES.get(time_column, "Generation time (s)")
1060
  time_missing = (
1061
+ "Generation time per second of video isn't available for this dataset."
1062
  if time_column == _PARETO_VIDEO_TIME_COLUMN
1063
  else "Min generation time isn't available for this dataset."
1064
  )
1065
  time_empty = (
1066
+ "No models have both a score and generation time per second of "
1067
  "video for this metric."
1068
  if time_column == _PARETO_VIDEO_TIME_COLUMN
1069
  else "No models have both a score and a min generation time for this metric."