Magzimilian commited on
Commit
45c0521
·
1 Parent(s): 9560ed1

Add deploy-benchmark model families (8 models, lat/ips/mem metrics)

Browse files
app.js CHANGED
@@ -30,7 +30,9 @@ function parseCSV(text) {
30
  headers.forEach((h, i) => {
31
  const raw = (vals[i] || "").trim();
32
  if (raw === "") {
33
- row[h] = numericCols.has(h) ? null : "";
 
 
34
  } else if (numericCols.has(h)) {
35
  const upper = raw.toUpperCase();
36
  row[h] = upper === "OOM" ? null : upper === "N/A" ? "N/A" : parseFloat(raw);
@@ -245,7 +247,11 @@ function parseModelSize(s) {
245
  }
246
 
247
  function isOOMRow(row) {
248
- return config.metrics.every(m => row[m.column] === null);
 
 
 
 
249
  }
250
 
251
  function getActiveRows() {
@@ -288,7 +294,8 @@ function modelCellHtml(model) {
288
 
289
  function metricCellHtml(val, isBest, extraClass) {
290
  const cls = extraClass ? ` class="${extraClass}"` : ' class="metric-cell"';
291
- if (val === null || val === undefined) return `<td${cls}><span class="oom">OOM</span></td>`;
 
292
  const display = typeof val === "number" ? val.toFixed(2) : (val || "—");
293
  const content = isBest ? `<strong style="color: white; opacity: 0.7">${display}</strong>` : display;
294
  return `<td${cls}>${content}</td>`;
@@ -514,7 +521,7 @@ function buildChart(filtered) {
514
 
515
  // Only show metric buttons for metrics that have non-zero data
516
  const chartVisibleMetrics = config.metrics.filter(m =>
517
- gRows.some(r => r[m.column] !== null && r[m.column] !== 0 && r[m.column] !== "N/A")
518
  );
519
  if (chartVisibleMetrics.length > 1) {
520
  const metricEl = metricGroup.querySelector(".btn-group");
@@ -668,7 +675,7 @@ function buildTables(filtered, chartsShown) {
668
 
669
  // Hide metric columns where every value in the filtered data is zero, null, or N/A
670
  const visibleMetrics = config.metrics.filter(m =>
671
- filtered.some(r => r[m.column] !== null && r[m.column] !== 0 && r[m.column] !== "N/A")
672
  );
673
 
674
  // Build column list: Model + visible display cols + metrics
@@ -872,11 +879,13 @@ async function buildAccuracyTable() {
872
  const card = document.createElement("div");
873
  card.className = "table-card";
874
 
875
- // Find best value per column (higher is better for accuracy)
 
 
876
  const best = {};
877
  metricCols.forEach(col => {
878
  const vals = rows.map(r => parseFloat(r[col])).filter(v => !isNaN(v));
879
- if (vals.length) best[col] = Math.max(...vals);
880
  });
881
 
882
  // Build metric cells for a row
@@ -974,6 +983,15 @@ async function switchBaseFamily(baseFamilyKey) {
974
  assignModelColors();
975
  renderSidebar();
976
  updateDependentFilters(true);
 
 
 
 
 
 
 
 
 
977
  render();
978
  }
979
 
 
30
  headers.forEach((h, i) => {
31
  const raw = (vals[i] || "").trim();
32
  if (raw === "") {
33
+ // Empty numeric cell = not measured (renders as a dash);
34
+ // only an explicit OOM value maps to null.
35
+ row[h] = numericCols.has(h) ? undefined : "";
36
  } else if (numericCols.has(h)) {
37
  const upper = raw.toUpperCase();
38
  row[h] = upper === "OOM" ? null : upper === "N/A" ? "N/A" : parseFloat(raw);
 
247
  }
248
 
249
  function isOOMRow(row) {
250
+ // Only consider metric columns present in this row's CSV — families use
251
+ // disjoint metric sets (LLM tps/... vs deploy lat/ips/mem), and absent
252
+ // columns (undefined) must not affect OOM detection.
253
+ const present = config.metrics.filter(m => row[m.column] !== undefined);
254
+ return present.length > 0 && present.every(m => row[m.column] === null);
255
  }
256
 
257
  function getActiveRows() {
 
294
 
295
  function metricCellHtml(val, isBest, extraClass) {
296
  const cls = extraClass ? ` class="${extraClass}"` : ' class="metric-cell"';
297
+ if (val === undefined || val === "") return `<td${cls}>\u2014</td>`;
298
+ if (val === null) return `<td${cls}><span class="oom">OOM</span></td>`;
299
  const display = typeof val === "number" ? val.toFixed(2) : (val || "—");
300
  const content = isBest ? `<strong style="color: white; opacity: 0.7">${display}</strong>` : display;
301
  return `<td${cls}>${content}</td>`;
 
521
 
522
  // Only show metric buttons for metrics that have non-zero data
523
  const chartVisibleMetrics = config.metrics.filter(m =>
524
+ gRows.some(r => r[m.column] !== undefined && r[m.column] !== null && r[m.column] !== 0 && r[m.column] !== "N/A")
525
  );
526
  if (chartVisibleMetrics.length > 1) {
527
  const metricEl = metricGroup.querySelector(".btn-group");
 
675
 
676
  // Hide metric columns where every value in the filtered data is zero, null, or N/A
677
  const visibleMetrics = config.metrics.filter(m =>
678
+ filtered.some(r => r[m.column] !== undefined && r[m.column] !== null && r[m.column] !== 0 && r[m.column] !== "N/A")
679
  );
680
 
681
  // Build column list: Model + visible display cols + metrics
 
879
  const card = document.createElement("div");
880
  card.className = "table-card";
881
 
882
+ // Find best value per column. Direction defaults to higher-is-better;
883
+ // families can set accuracy_higher_is_better: false (e.g. WER).
884
+ const higherIsBetter = familyCfg.accuracy_higher_is_better !== false;
885
  const best = {};
886
  metricCols.forEach(col => {
887
  const vals = rows.map(r => parseFloat(r[col])).filter(v => !isNaN(v));
888
+ if (vals.length) best[col] = higherIsBetter ? Math.max(...vals) : Math.min(...vals);
889
  });
890
 
891
  // Build metric cells for a row
 
983
  assignModelColors();
984
  renderSidebar();
985
  updateDependentFilters(true);
986
+ // Fall back to a metric that has data in this family (e.g. LLM tps vs CV ips)
987
+ const hasData = (col) => DATA.some(r =>
988
+ r[col] !== undefined && r[col] !== null && r[col] !== 0 && r[col] !== "N/A");
989
+ if (!hasData(filters.metric)) {
990
+ const familyDefault = config.model_families?.[activeFamilyKey()]?.chart?.default_metric;
991
+ filters.metric = (familyDefault && hasData(familyDefault))
992
+ ? familyDefault
993
+ : (config.metrics.find(m => hasData(m.column))?.column || filters.metric);
994
+ }
995
  render();
996
  }
997
 
config.json CHANGED
@@ -9,7 +9,15 @@
9
  "Llama-3.2-1B": "Llama-3.2-1B-Instruct",
10
  "Llama-3.2-3B": "Llama-3.2-3B-Instruct",
11
  "Gemma-3-1B": "gemma-3-1b-it",
12
- "Gemma-3-270M": "gemma-3-270m-it"
 
 
 
 
 
 
 
 
13
  },
14
  "filters": [
15
  {
@@ -29,7 +37,8 @@
29
  "orin_nano_super": "NVIDIA Jetson Orin Nano Super",
30
  "agx_orin": "NVIDIA Jetson AGX Orin",
31
  "agx_thor": "NVIDIA Jetson AGX Thor",
32
- "rtx_3500_ada": "NVIDIA RTX 3500 Ada"
 
33
  }
34
  }
35
  ],
@@ -61,6 +70,27 @@
61
  "short": "E2E(s) ↓",
62
  "higher_is_better": false,
63
  "description": "End-to-end latency in seconds (lower is better). Total time from request submission to completion of the full generated response. This reflects real user-perceived latency."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  }
65
  ],
66
  "display_columns": [
@@ -93,6 +123,16 @@
93
  "video"
94
  ]
95
  }
 
 
 
 
 
 
 
 
 
 
96
  }
97
  ],
98
  "chart": {
@@ -259,6 +299,123 @@
259
  "rtx_3500_ada": "Measurement setup: vLLM 0.10.2, FlashHead 0.1.7, batch_size=1, 32 input tokens, 128 output tokens generated, 10 warm-up runs, averaged over 100 runs."
260
  },
261
  "default_device": "agx_orin"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
262
  }
263
  },
264
  "accuracy_title": "Accuracy"
 
9
  "Llama-3.2-1B": "Llama-3.2-1B-Instruct",
10
  "Llama-3.2-3B": "Llama-3.2-3B-Instruct",
11
  "Gemma-3-1B": "gemma-3-1b-it",
12
+ "Gemma-3-270M": "gemma-3-270m-it",
13
+ "DINOv3-ViT-B16": "dinov3-vitb16-pretrain-lvd1689m",
14
+ "SAM3": "sam3",
15
+ "SAM-3D-Body": "sam-3d-body-dinov3",
16
+ "Parakeet-TDT-0.6B-v3": "parakeet-tdt-0.6b-v3",
17
+ "Chronos-2": "chronos-2",
18
+ "MobileViT-Small": "mobilevit-small",
19
+ "all-MiniLM-L6-v2": "all-MiniLM-L6-v2",
20
+ "paraphrase-multilingual-MiniLM-L12-v2": "paraphrase-multilingual-MiniLM-L12-v2"
21
  },
22
  "filters": [
23
  {
 
37
  "orin_nano_super": "NVIDIA Jetson Orin Nano Super",
38
  "agx_orin": "NVIDIA Jetson AGX Orin",
39
  "agx_thor": "NVIDIA Jetson AGX Thor",
40
+ "rtx_3500_ada": "NVIDIA RTX 3500 Ada",
41
+ "l4": "NVIDIA L4 GPU"
42
  }
43
  }
44
  ],
 
70
  "short": "E2E(s) ↓",
71
  "higher_is_better": false,
72
  "description": "End-to-end latency in seconds (lower is better). Total time from request submission to completion of the full generated response. This reflects real user-perceived latency."
73
+ },
74
+ {
75
+ "column": "ips",
76
+ "label": "Inferences / sec",
77
+ "short": "IPS ↑",
78
+ "higher_is_better": true,
79
+ "description": "Inferences per second at the stated batch size (higher is better). GPU compute throughput of the TensorRT engine."
80
+ },
81
+ {
82
+ "column": "lat",
83
+ "label": "Mean Latency (ms)",
84
+ "short": "LAT(ms) ↓",
85
+ "higher_is_better": false,
86
+ "description": "Mean GPU compute latency per inference in milliseconds (lower is better). Host<->device transfers excluded."
87
+ },
88
+ {
89
+ "column": "mem",
90
+ "label": "Peak Memory (MB)",
91
+ "short": "MEM(MB) ↓",
92
+ "higher_is_better": false,
93
+ "description": "Peak device memory during inference in MB (lower is better)."
94
  }
95
  ],
96
  "display_columns": [
 
123
  "video"
124
  ]
125
  }
126
+ },
127
+ {
128
+ "column": "ctx",
129
+ "label": "CONTEXT",
130
+ "type": "number",
131
+ "visible_when": {
132
+ "type": [
133
+ "timeseries"
134
+ ]
135
+ }
136
  }
137
  ],
138
  "chart": {
 
299
  "rtx_3500_ada": "Measurement setup: vLLM 0.10.2, FlashHead 0.1.7, batch_size=1, 32 input tokens, 128 output tokens generated, 10 warm-up runs, averaged over 100 runs."
300
  },
301
  "default_device": "agx_orin"
302
+ },
303
+ "DINOv3-ViT-B16": {
304
+ "data_file": "data/DINOv3-ViT-B16.csv",
305
+ "accuracy_url": "https://huggingface.co/embedl/dinov3-quantized-tensorrt",
306
+ "chart": {
307
+ "default_metric": "ips",
308
+ "scenarios": []
309
+ },
310
+ "default_device": "agx_orin",
311
+ "experiment_setup": {
312
+ "l4": "Measurement setup: TensorRT 10.16 Python API mirroring the trtexec protocol (builder optimization level 5, 2 s warmup + 10 s timed, CUDA-event timing, no transfers); stock clocks (datacenter boost). Embedl INT8 vs FP16 baseline of the unmodified model.",
313
+ "agx_orin": "Measurement setup: trtexec, --builderOptimizationLevel=5, profile flags --useCudaGraph --useSpinWait --noDataTransfers --warmUp=2000 --duration=10; GPU compute time only; Jetson clocks locked (nvpmodel -m 0 + jetson_clocks). Embedl INT8 (--fp16 --int8, calibrated Q/DQ) vs FP16 baseline of the unmodified model."
314
+ },
315
+ "accuracy_file": "data/acc-DINOv3-ViT-B16.csv",
316
+ "accuracy_title": "imagenette k-NN top-1 (%)"
317
+ },
318
+ "SAM3": {
319
+ "data_file": "data/SAM3.csv",
320
+ "accuracy_url": "https://huggingface.co/embedl/sam3",
321
+ "chart": {
322
+ "default_metric": "ips",
323
+ "scenarios": []
324
+ },
325
+ "default_device": "agx_orin",
326
+ "experiment_setup": {
327
+ "agx_orin": "Values from the published model-card benchmark card: 'fp16-trt' baseline vs Embedl-optimized 'fp16-int8-trt', batch 1. Latency derived as 1000/FPS.",
328
+ "agx_thor": "Values from the published model-card benchmark card: 'bf16-torch' baseline vs Embedl-optimized 'fp8-fp16-trt', batch 1. Latency derived as 1000/FPS.",
329
+ "l4": "Values from the published model-card benchmark card: 'bf16-torch' baseline vs Embedl-optimized 'fp16-int8-trt', batch 1. Latency derived as 1000/FPS."
330
+ }
331
+ },
332
+ "SAM-3D-Body": {
333
+ "data_file": "data/SAM-3D-Body.csv",
334
+ "accuracy_url": "https://huggingface.co/embedl/sam-3d-body",
335
+ "chart": {
336
+ "default_metric": "ips",
337
+ "scenarios": []
338
+ },
339
+ "default_device": "l4",
340
+ "experiment_setup": {
341
+ "l4": "Values from the published model-card benchmark card: 'fp16-trt' baseline vs Embedl-optimized 'embedl int8', batch 1. Latency derived as 1000/FPS."
342
+ }
343
+ },
344
+ "Parakeet-TDT-0.6B-v3": {
345
+ "data_file": "data/Parakeet-TDT-0.6B-v3.csv",
346
+ "accuracy_url": "https://huggingface.co/embedl/parakeet-tdt-0.6b-v3-quantized-tensorrt",
347
+ "chart": {
348
+ "default_metric": "ips",
349
+ "scenarios": []
350
+ },
351
+ "accuracy_higher_is_better": false,
352
+ "default_device": "agx_orin",
353
+ "experiment_setup": {
354
+ "agx_orin": "Values from the published model-card benchmark card: 'trtexec --fp16' baseline vs Embedl-optimized 'embedl int8', batch 1. Latency derived as 1000/FPS."
355
+ },
356
+ "accuracy_file": "data/acc-Parakeet-TDT-0.6B-v3.csv",
357
+ "accuracy_title": "Open ASR Leaderboard WER (%)"
358
+ },
359
+ "Chronos-2": {
360
+ "data_file": "data/Chronos-2.csv",
361
+ "accuracy_url": "https://huggingface.co/embedl/chronos-2-quantized-trt",
362
+ "chart": {
363
+ "default_metric": "ips",
364
+ "scenarios": [
365
+ {
366
+ "label": "Context 512",
367
+ "match": {
368
+ "ctx": 512
369
+ }
370
+ },
371
+ {
372
+ "label": "Context 2048",
373
+ "match": {
374
+ "ctx": 2048
375
+ }
376
+ }
377
+ ]
378
+ },
379
+ "default_device": "agx_orin",
380
+ "experiment_setup": {
381
+ "agx_orin": "Values from the published model-card benchmark card: 'TensorRT FP16' baseline vs Embedl-optimized 'embedl int8', batch 1. Latency derived as 1000/FPS."
382
+ }
383
+ },
384
+ "MobileViT-Small": {
385
+ "data_file": "data/MobileViT-Small.csv",
386
+ "accuracy_url": "https://huggingface.co/embedl/mobilevit-small-quantized",
387
+ "chart": {
388
+ "default_metric": "ips",
389
+ "scenarios": []
390
+ },
391
+ "default_device": "agx_orin",
392
+ "experiment_setup": {
393
+ "agx_orin": "Values from the published model-card benchmark card: 'trtexec --fp16' baseline vs Embedl-optimized 'embedl int8', batch 1. Latency derived as 1000/FPS."
394
+ }
395
+ },
396
+ "all-MiniLM-L6-v2": {
397
+ "data_file": "data/all-MiniLM-L6-v2.csv",
398
+ "accuracy_url": "https://huggingface.co/embedl/all-MiniLM-L6-v2-quantized-trt",
399
+ "chart": {
400
+ "default_metric": "ips",
401
+ "scenarios": []
402
+ },
403
+ "default_device": "agx_orin",
404
+ "experiment_setup": {
405
+ "agx_orin": "Values from the published model-card benchmark card: 'trtexec --fp16' baseline vs Embedl-optimized 'embedl int8', batch 1. Latency derived as 1000/FPS."
406
+ }
407
+ },
408
+ "paraphrase-multilingual-MiniLM-L12-v2": {
409
+ "data_file": "data/paraphrase-multilingual-MiniLM-L12-v2.csv",
410
+ "accuracy_url": "https://huggingface.co/embedl/paraphrase-multilingual-MiniLM-L12-v2-quantized-trt",
411
+ "chart": {
412
+ "default_metric": "ips",
413
+ "scenarios": []
414
+ },
415
+ "default_device": "agx_orin",
416
+ "experiment_setup": {
417
+ "agx_orin": "Values from the published model-card benchmark card: 'trtexec --fp16' baseline vs Embedl-optimized 'embedl int8', batch 1. Latency derived as 1000/FPS."
418
+ }
419
  }
420
  },
421
  "accuracy_title": "Accuracy"
data/Chronos-2.csv ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ model_family,model,type,batch,device,res,ctx,lat,ips,mem
2
+ Chronos-2,amazon/chronos-2,timeseries,1,agx_orin,N/A,2048,4.48,223,
3
+ Chronos-2,embedl/chronos-2-quantized-trt,timeseries,1,agx_orin,N/A,2048,3.48,287,
4
+ Chronos-2,amazon/chronos-2,timeseries,1,agx_orin,N/A,512,2.98,336,
5
+ Chronos-2,embedl/chronos-2-quantized-trt,timeseries,1,agx_orin,N/A,512,2.43,411,
data/DINOv3-ViT-B16.csv ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ model_family,model,type,batch,device,res,ctx,lat,ips,mem
2
+ DINOv3-ViT-B16,facebook/dinov3-vitb16-pretrain-lvd1689m,image,1,agx_orin,224x224,,2.706,369.6,168
3
+ DINOv3-ViT-B16,embedl/dinov3-quantized-tensorrt,image,1,agx_orin,224x224,,2.246,445.3,91.1
4
+ DINOv3-ViT-B16,facebook/dinov3-vitb16-pretrain-lvd1689m,image,1,l4,224x224,,1.504,664.8,
5
+ DINOv3-ViT-B16,embedl/dinov3-quantized-tensorrt,image,1,l4,224x224,,1.127,887.7,
data/MobileViT-Small.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ model_family,model,type,batch,device,res,ctx,lat,ips,mem
2
+ MobileViT-Small,apple/mobilevit-small,image,1,agx_orin,256x256,,1.28,781,
3
+ MobileViT-Small,embedl/mobilevit-small-quantized,image,1,agx_orin,256x256,,1.09,917,
data/Parakeet-TDT-0.6B-v3.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ model_family,model,type,batch,device,res,ctx,lat,ips,mem
2
+ Parakeet-TDT-0.6B-v3,nvidia/parakeet-tdt-0.6b-v3,audio,1,agx_orin,N/A,,33.1,30.2,
3
+ Parakeet-TDT-0.6B-v3,embedl/parakeet-tdt-0.6b-v3-quantized-tensorrt,audio,1,agx_orin,N/A,,33.6,29.8,
data/SAM-3D-Body.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ model_family,model,type,batch,device,res,ctx,lat,ips,mem
2
+ SAM-3D-Body,facebook/sam-3d-body-dinov3,image,1,l4,512x512,,44.6,22.4,
3
+ SAM-3D-Body,embedl/sam-3d-body,image,1,l4,512x512,,28.3,35.3,
data/SAM3.csv ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ model_family,model,type,batch,device,res,ctx,lat,ips,mem
2
+ SAM3,facebook/sam3,image,1,agx_orin,924x924,,769,1.3,
3
+ SAM3,embedl/sam3,image,1,agx_orin,924x924,,455,2.2,
4
+ SAM3,facebook/sam3,image,1,agx_thor,924x924,,137,7.3,
5
+ SAM3,embedl/sam3,image,1,agx_thor,924x924,,90.9,11,
6
+ SAM3,facebook/sam3,image,1,l4,924x924,,137,7.3,
7
+ SAM3,embedl/sam3,image,1,l4,924x924,,104,9.6,
data/acc-DINOv3-ViT-B16.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ Model,knn top1
2
+ facebook/dinov3-vitb16-pretrain-lvd1689m,99.75
3
+ embedl/dinov3-quantized-tensorrt,99.26
data/acc-Parakeet-TDT-0.6B-v3.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ Model,wer
2
+ nvidia/parakeet-tdt-0.6b-v3,6.65
3
+ embedl/parakeet-tdt-0.6b-v3-quantized-tensorrt,6.8
data/all-MiniLM-L6-v2.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ model_family,model,type,batch,device,res,ctx,lat,ips,mem
2
+ all-MiniLM-L6-v2,sentence-transformers/all-MiniLM-L6-v2,text,1,agx_orin,N/A,,0.409,2447,43
3
+ all-MiniLM-L6-v2,embedl/all-MiniLM-L6-v2-quantized-trt,text,1,agx_orin,N/A,,0.383,2611,36
data/paraphrase-multilingual-MiniLM-L12-v2.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ model_family,model,type,batch,device,res,ctx,lat,ips,mem
2
+ paraphrase-multilingual-MiniLM-L12-v2,sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2,text,1,agx_orin,N/A,,0.775,1290,224
3
+ paraphrase-multilingual-MiniLM-L12-v2,embedl/paraphrase-multilingual-MiniLM-L12-v2-quantized-trt,text,1,agx_orin,N/A,,0.73,1369,211