35 lines
2.5 KiB
Python
35 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
"""Produce reproducible tables from completed cases, excluding loading pilots."""
|
|
import json,pathlib,statistics,sys
|
|
root=pathlib.Path(sys.argv[1]); cases={}
|
|
for p in sorted(root.glob('*/result.json')):
|
|
d=json.loads(p.read_text())
|
|
if not d.get('finished') or d['case'].get('load_only'):continue
|
|
samples=json.loads((p.parent/'gpu.json').read_text());peak={}
|
|
for s in samples:
|
|
for g in s.get('gpus',[]):peak[g['name']]=max(peak.get(g['name'],0),int(g['used']))
|
|
d['peak']=peak;cases[d['case']['label']]=d
|
|
print('## Direkter Vergleich bei 32.768 Tokens Kontext\n')
|
|
print('Ein Slot, nur RTX 5080, MTP3, Micro-Batch 512; gleiche Eingaben und Sampling. Mittelwerte der verfügbaren Wiederholungen.\n')
|
|
print('| Messung | Pure | ByteShape | Änderung |\n|---|---:|---:|---:|')
|
|
def values(model,key):
|
|
out=[]
|
|
for label in [model+'-single-32768',model+'-single-32768-repeat']:
|
|
if label not in cases:continue
|
|
d=cases[label]
|
|
if key=='pp':out.append(d['prefill'][0]['response']['timings']['prompt_per_second'])
|
|
elif key=='de':out.append(d['decode'][0]['timings']['predicted_per_second'])
|
|
elif key=='code':out.append(d['decode'][1]['timings']['predicted_per_second'])
|
|
return out
|
|
for name,key in [('Prefill, 4.196 Eingabetokens (tok/s)','pp'),('Deutsche Erklärung (tok/s)','de'),('Python-Code (tok/s)','code')]:
|
|
a,b=statistics.mean(values('pure',key)),statistics.mean(values('byteshape',key))
|
|
print(f'| {name} | {a:.1f} | {b:.1f} | {(b/a-1)*100:+.1f}% |')
|
|
print('\n## Vollständig getestete Konfigurationen\n')
|
|
print('Kontext ist Eingabe plus Ausgabe. Die Geschwindigkeit in dieser Tabelle gehört jeweils zur angegebenen tatsächlichen Eingabelänge; Zeilen unterschiedlicher Länge sind kein isolierter Quantisierungsvergleich. VRAM enthält auch residente Dienste (TTS auf der 3060).\n')
|
|
print('| Fall | Kontext | Eingabe | Prefill tok/s | Ausgabe tok/s | 5080 MiB | 3060 MiB | Recall |\n|---|---:|---:|---:|---:|---:|---:|---|')
|
|
for label,d in cases.items():
|
|
if not d.get('prefill'):continue
|
|
p=d['prefill'][-1]['response'];t=p['timings'];r=p.get('recall',{})
|
|
print(f'| {label} | {d["case"]["ctx"]} | {t["prompt_n"]} | {t["prompt_per_second"]:.1f} | {t["predicted_per_second"]:.1f} | {d["peak"].get("NVIDIA GeForce RTX 5080",0)} | {d["peak"].get("NVIDIA GeForce RTX 3060",0)} | {sum(r.values())}/{len(r)} |')
|
|
print('\nDie Kontextpiloten ohne lange Eingabe sind hier bewusst nicht als validierte Konfigurationen aufgeführt. Einzelne synthetische Recall-Aufgaben belegen keine allgemeine Langkontext-Intelligenz.')
|