diff --git a/dashboard/dashboard.py b/dashboard/dashboard.py index e4fb98c..5ec61b9 100644 --- a/dashboard/dashboard.py +++ b/dashboard/dashboard.py @@ -140,11 +140,15 @@ body { background: #0b0f17; color: #bcc3cd; font-family: -apple-system, BlinkMac var MODELS=[ {id:'qwen3.6-35B-A3B',label:'Qwen MoE',gpu:'MoE - Strix Halo',color:'#a78bfa',short:'MoE',domId:'gpu-moe',perf:'35B MoE'}, {id:'qwen3.6-27B-code',label:'Qwen Code',gpu:'Dense - RTX 3090',color:'#f59e0b',short:'Dense',domId:'gpu-dense',perf:'27B Dense'}, - {id:'gemma-4-12b',label:'Gemma 4 12B',gpu:'VLM - RTX 5070',color:'#22c55e',short:'VLM',domId:'gpu-light',perf:'12B VLM'} + {id:'gemma-4-12b',label:'Gemma 4 12B',gpu:'VLM - RTX 5070',color:'#22c55e',short:'VLM',domId:'gpu-light',perf:'12B VLM'}, + {id:'qwen3.5-9b-vlm',label:'Qwen VLM (retired)',gpu:'RTX 5070 (legacy)',color:'#64748b',short:'OLD',domId:'gpu-light',perf:'9B VLM'} ]; // Auto-derived lookups — DO NOT EDIT below var MC={},ML={},GL={},ids={},lb={},mlab={},mcol={}; MODELS.forEach(function(m){MC[m.id]=m.color;ML[m.id]=m.label;GL[m.id]=m.gpu;ids[m.id]=m.domId;lb[m.id]=m.short;mlab[m.id]=m.perf;mcol[m.id]=m.color;}); +// Safe lookup helpers — fall back to raw model ID if not in MODELS +function modelLabel(id){return mlab[id]||id||'Unknown';} +function modelColor(id){return mcol[id]||'#64748b';} function $(id){return document.getElementById(id);} function render(data){ @@ -228,8 +232,8 @@ var models=d.models||[],reasons=d.reasons||[],agents=d.agents||[],sum=d.summary| if(!models.length){$('perf-latency').innerHTML='
Accumulating data...
';return;} var maxLat=Math.max(...models.map(function(m){return m.latency.p99||0}),1); var latHTML=models.map(function(m){ -var l=m.latency||{},p50=l.p50||0,p95=l.p95||0,p99=l.p99||0,c=mcol[m.model]||'#38bdf8'; -return'
'+mlab[m.model]+''+m.count+' reqs
'+ +var l=m.latency||{},p50=l.p50||0,p95=l.p95||0,p99=l.p99||0,c=modelColor(m.model); +return'
'+modelLabel(m.model)+''+m.count+' reqs
'+ '
p50
'+p99+'ms
'+ '
p50: '+p50+'msp95: '+p95+'msp99: '+p99+'ms
'; }).join(''); @@ -237,12 +241,12 @@ $('perf-latency').innerHTML=latHTML; // Throughput comparison var maxTps=Math.max(...models.map(function(m){return m.throughput.avg_tokens_per_sec||0}),1); var tpsHTML=models.map(function(m){ -var t=m.throughput||{},avg=t.avg_tokens_per_sec||0,p50=t.p50||0,c=mcol[m.model]||'#38bdf8'; +var t=m.throughput||{},avg=t.avg_tokens_per_sec||0,p50=t.p50||0,c=modelColor(m.model); var isAllStreaming = avg===0 && p50===0; if(isAllStreaming){ -return'
'+mlab[m.model]+'streaming only
t/s available for non-streaming requests only
'; +return'
'+modelLabel(m.model)+'streaming only
t/s available for non-streaming requests only
'; } -return'
'+mlab[m.model]+''+avg+' tok/s
'+ +return'
'+modelLabel(m.model)+''+avg+' tok/s
'+ '
avg
'+avg+' tok/s
'+ '
p50
'+p50+' tok/s
'; }).join(''); @@ -283,9 +287,9 @@ var toX=function(t){return Math.log10(Math.max(t,1))/Math.log10(Math.max(maxX,10 var toY=function(t){return (t/maxY)*100;}; var dots=''; pts.forEach(function(p){ -var x=toX(p.prompt_tokens),y=toY(p.inference_ms),c=mcol[p.model]||'#38bdf8'; +var x=toX(p.prompt_tokens),y=toY(p.inference_ms),c=modelColor(p.model); var r=p.stream?1.5:2.5,o=p.stream?0.4:0.8; -dots+=''+mlab[p.model]+' | '+p.prompt_tokens+' tok | '+p.inference_ms+'ms | '+p.agent+''; +dots+=''+modelLabel(p.model)+' | '+p.prompt_tokens+' tok | '+p.inference_ms+'ms | '+p.agent+''; }); // Grid lines var grid=''; @@ -301,7 +305,7 @@ yVals.forEach(function(v){if(v<=maxY)yTicks+='Prompt Tokens (log scale)Inference Time'; // Legend var models=[];pts.forEach(function(p){if(models.indexOf(p.model)===-1)models.push(p.model);}); -lg.innerHTML=models.map(function(m){return''+mlab[m]+'';}).join(''); +lg.innerHTML=models.map(function(m){return''+modelLabel(m)+'';}).join(''); } poll();setInterval(poll,10000);loadTS();loadPerf();setInterval(loadPerf,15000);loadScatter();setInterval(loadScatter,30000);