${e(b.revision)} · ${e(b.backend)} ${s.active===b.id?'· STANDARD':''}
Commit ${e(b.commit)} · GPU-Ziele ${e(b.architectures.join(', ')||'CPU')} · Auto-Fit ${b.fit_supported?'unterstützt':'nicht unterstützt'}
diff --git a/PERFORMANCE.md b/PERFORMANCE.md index 7eeaa6f..39c2143 100644 --- a/PERFORMANCE.md +++ b/PERFORMANCE.md @@ -15,3 +15,19 @@ Deck-Varianten mit identischem Build, gespeichertem Medium-Profil (160000 Kontex Ursache: Die frühere Reserve max(1024 MiB, 5 Prozent) verhinderte volle GPU-Belegung knapp und reduzierte das Limit auf 65. Die Modellmetadaten enthalten 65 Blöcke einschließlich eines MTP-Blocks. Der geprüfte llama-model.cpp-Code legt bei begrenztem Offloading frühe Modellblöcke auf die CPU; die Ausgabeschicht liegt am Ende der GPU-Auswahl. Die erste Vermutung einer CPU-Ausgabeschicht war daher falsch. Mit max(512 MiB, 2,5 Prozent) besteht die Prognose einschließlich MTP-Kontext und alle Schichten passen. Das RAM-Limit und die übrigen Startparameter bleiben unverändert. Kurzer Einzelnutzer-Test, keine Aussage zur Stabilität bei maximal gefülltem Kontext oder paralleler Last. Alter Router: 2 Slots, Vision-Projektor, anderer Build; kein ansonsten identischer Vergleich. Ursachennachweis daher durch die kontrollierten Deck-Varianten. Nach Abschluss: alter Medium-Container gestoppt, Deck läuft mit bisherigem Zwei-Kern-Limit, Testmodell entladen. + +## Prefill-Detailprüfung am 28.09.2026 + +Direkt am nativen `/completion`: synthetischer tokenisierter Text, exakt 512/4096/16384 Eingabe-Tokens, 32 Ausgabe-Tokens, Temperature 0, Seed 1234, cache_prompt=false. Je eine Aufwärmrunde und zwei Messungen pro Länge; alle Messungen cache_n=0. Keine Nutzerinhalte. + +| Eingabe | Alter Router, 2 Slots | Deck, 1 Slot | Deck, 2 Slots mit Auto-Offload | +|---|---:|---:|---:| +| 512 | 1076,5 | 1004,6 | 1081,7 | +| 4096 | 1928,2 | 1892,6 | 1350,6 | +| 16384 | 1947,7 | 1928,4 | 1294,0 | + +Einheit: mittlere Prefill-Token/s. Deck 1 Slot vs. Alt: bei 4096 rund 1,8 %, bei 16384 rund 1 % weniger Durchsatz. Der große relative Unterschied der früheren 87-Token-Messung skaliert nicht mit der Eingabelänge. Durchschnittliche Zeitdifferenzen hier circa 34/40/84 ms. Ursache der kleinen Restdifferenz nicht isoliert bewiesen; Builds und Slotzahl unterscheiden sich weiterhin. + +Wichtiger Störfaktor im kontrollierten Slotversuch: Decks Speicherprognose mit 2 Slots wählte GPU-Layerlimit 65 statt 999. Damit ist diese Variante kein reiner Slotvergleich; zusätzliche CPU-Auslagerung erklärt einen konkreten anderen Ausführungspfad. Gespeichertes Benutzerprofil bleibt bei 1 Slot unverändert. Deck CPU-Budget 2, Threads 6; während erster Messungen und Beginn des zweiten Versuchs nr_throttled=0. CUDA-Architekturen 120;86, Release, GGML_NATIVE=OFF, Flash Attention ON. Aktive Binärdatei 0.5.0-dev, Commit c2a9e16 (registrierter Build b11229). + +Offizieller Versionsstand zur Abfrage: regulär v0.5.0 vom 23.09., Nightly b11236 vom 28.09. Die bisherige GUI akzeptierte keine v-Tags und fragte nur zehn jüngste Releases ab. Korrigiert: reguläres Latest explizit zuerst, v-Tags zulässig, Build_IS_DEV passend setzen. Keine neue llama.cpp-Version gebaut oder aktiviert. diff --git a/STUDIO.md b/STUDIO.md index 4b6c2fe..9410b08 100644 --- a/STUDIO.md +++ b/STUDIO.md @@ -191,3 +191,7 @@ Zusätzliche konservative Speicherplanung: Projektordateigröße plus 2 GiB Arbe Der LLM-Profileditor prüft das Hugging-Face-Repository der ausgewählten Modelldatei auf separate mmproj-GGUF-Dateien. Eigene Projektoren werden direkt angeboten; nur wenn dort keine gefunden werden, erscheint die externe Repository-Suche. Bei nicht erreichbaren Metadaten bleibt die Suche bis zur erneuten Prüfung geschlossen. Dies erkennt separate Dateien, nicht eingebettete Vision-Gewichte oder garantierte Architekturkompatibilität. Eine Modellfamilie oder ein vollständiger Hugging-Face-Repository-Link sucht unabhängig vom Textgenerierungs-Tag (`GET /api/v1/catalog/search?kind=chat&purpose=projector&q=…`). Nach Auswahl eines Repositorys zeigt der Editor nur mmproj-GGUF-Dateien mit Größe, Quelle und Lizenz. Herunterladen startet keinen Worker. Fortschritt steht unter Downloads. Danach „Bibliothek aktualisieren“, Projektor auswählen, Gerät wählen und Profil speichern. Vorhandene Profilwerte bleiben beim Suchen erhalten. Externe Projektoren müssen zur Modellarchitektur und Version passen; sie erweitern reine Textarchitekturen nicht um Vision. + +### Offizielle llama.cpp-Versionen + +Die Update-Abfrage zeigt das aktuelle reguläre Release (`releases/latest`) zuerst und ergänzt die jüngsten Nightlies. Reguläre Tags `vX.Y.Z`, Nightly-Tags `bNNNN` und vollständige Commit-IDs sind zulässig. Reguläre Releases werden mit `LLAMA_BUILD_IS_DEV=OFF`, Nightlies mit `ON` gebaut. Ein reguläres Release ist keine automatische Kompatibilitätszusage für Decks Fit-/MTP-Adapter; Standardwechsel bleiben explizit. Versionsschema: https://github.com/ggml-org/ggml/discussions/1579 diff --git a/runtime-ui.js b/runtime-ui.js index 9a498d1..e019833 100644 --- a/runtime-ui.js +++ b/runtime-ui.js @@ -1,7 +1,7 @@ const RuntimeUI=(()=>{ const e=v=>String(v??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); async function api(path='',data){const r=await fetch('/api/v1/runtime'+path,data?{method:'POST',headers:{'Content-Type':'application/json','X-Athena-Deck':'1'},body:JSON.stringify(data)}:{});const v=await r.json();if(!r.ok)throw Error(v.error||'Anfrage fehlgeschlagen');return v;} - function html(){return `
Offizielle Versionen getrennt bauen und prüfen. Ein Build lädt kein Modell und ändert keine produktiven Laufzeiten.
Als Standard auswählen startet keinen Prozess. Bestehende Router bleiben unverändert.
Kein pauschales Reservefeld: Die Laufzeit soll Modell, gewünschten Kontext, Slots und den aktuell freien Speicher gemeinsam berücksichtigen. Unterstützte Builds verwenden llama.cpp --fit on; der Kontext wird ausdrücklich vorgegeben. Keine absichtlichen OOM-Tests auf den produktiv genutzten GPUs.
Ein Build allein kann keine Modell-Layerzahl bestimmen. Die Berechnung verwendet llama-fit-params ohne Gewichtsallokation. Sie ist eine Prognose für das Textmodell und kein Lasttest. Vision-Projektor und MTP sind noch nicht eingerechnet. Ein Modellstart erfolgt nicht.
Offizielle Versionen getrennt bauen und prüfen. Ein Build lädt kein Modell und ändert keine produktiven Laufzeiten.
Das aktuelle reguläre Release steht zuerst. Nightlies enthalten neuere Änderungen, sind aber keine pauschale Empfehlung. Modell-, MTP- und Projektor-Kompatibilität vor einem Standardwechsel testen.
Als Standard auswählen startet keinen Prozess. Bestehende Router bleiben unverändert.
Kein pauschales Reservefeld: Die Laufzeit soll Modell, gewünschten Kontext, Slots und den aktuell freien Speicher gemeinsam berücksichtigen. Unterstützte Builds verwenden llama.cpp --fit on; der Kontext wird ausdrücklich vorgegeben. Keine absichtlichen OOM-Tests auf den produktiv genutzten GPUs.
Ein Build allein kann keine Modell-Layerzahl bestimmen. Die Berechnung verwendet llama-fit-params ohne Gewichtsallokation. Sie ist eine Prognose für das Textmodell und kein Lasttest. Vision-Projektor und MTP sind noch nicht eingerechnet. Ein Modellstart erfolgt nicht.
Commit ${e(b.commit)} · GPU-Ziele ${e(b.architectures.join(', ')||'CPU')} · Auto-Fit ${b.fit_supported?'unterstützt':'nicht unterstützt'}
Noch kein geprüfter Build vorhanden.
';root.querySelectorAll('[data-build]').forEach(b=>b.onclick=()=>action('/activate',{build_id:b.dataset.build}));if(s.job){const log=await api('/log');if(root.isConnected)root.querySelector('#rt-log').textContent=log.text;}if(running)setTimeout(()=>{if(root.isConnected)status();},3000);}catch(err){msg(err.message);}} @@ -10,7 +10,7 @@ const RuntimeUI=(()=>{ root.querySelector('#rt-check').onclick=prerequisites; root.querySelector('#rt-build').onsubmit=event=>{event.preventDefault();const d=Object.fromEntries(new FormData(event.target));d.jobs=Number(d.jobs);action('/build',d);}; root.querySelector('#rt-cancel').onclick=()=>action('/cancel',{});root.querySelector('#rt-rollback').onclick=()=>action('/rollback',{}); - root.querySelector('#rt-releases').onclick=async()=>{msg('Offizielle Releases werden abgefragt …');try{const v=await api('/releases');if(!root.isConnected)return;root.querySelector('#rt-releases-list').innerHTML=v.releases.map(r=>`${e(r.notes)}${e(r.notes)}