senn-techsenn-tech
← Alle Referenzen02 · LLM

Enterprise-KI-Stack im Eigenbetrieb

Referenzkunde: Eigenbetrieb: die firmeneigene KI-Infrastruktur des Studios

Kundendaten in Texten und Bildern sind neutralisiert.

4Server, drei davon mit GPU
1Modellfamilie für alle Chat-Lanes
262.144Token Kontext auf der Haupt-Lane
5Wochen Umbau bis zum heutigen Stand
Die Flotte heute

Vier Hosts, drei Rollen

Kopfknoten
virtuelle Maschine
Orchestrierung
6 vCPU EPYC 7F52 · 47 GB RAM · keine GPU (R9700 am 01.09. ausgebaut, ROCm am 07.09. entfernt)
Trägt: LibreChat, LiteLLM, Auto-Router, Belegerkennung, dsh, rund 15 MCP-Beidienste
Hauptserver
physischer Server
GPU-Host
16 Kerne EPYC 8024P · 31 GB RAM · 4× RTX 5090 = 130 GB VRAM
Trägt: flashnext-hybrid, die Lanes thinking / nothink / dsh / vision / CNC
Ausweichserver
physischer Server
GPU-Host
64 Kerne EPYC 7502 · 125 GB RAM · 1× RTX 5090 = 32,6 GB VRAM
Trägt: Qwen3.8-27B-AWQ-INT4, nur als automatischer Ausweichweg
Helfer
virtuelle Maschine
GPU-Host
8 vCPU EPYC 7F52 · 23 GB RAM · 1× RTX 4060 Ti = 16,4 GB VRAM (Durchreichung)
Trägt: embed, rerank, Docling, dots.mocr; 15,4 von 16,4 GB belegt bei fast null Last
Woher wir kommen, wo wir stehen

Fünf Wochen, Host für Host

Die Daten geben die Reihenfolge vor; das ist ein Änderungsprotokoll, kein Countdown. Jeder Eintrag ist eine Entscheidung, die tatsächlich getroffen und gemessen wurde, kein Plan.

Hauptserver
bis 2026-08-19
Qwen3.5-122B-A10B, per Zeitschaltung gewechselt

Ein einziges großes MoE-Modell, das ein Cron-Job morgens und abends austauschte. Der Umschalter überlebte das Modell, für das er geschrieben war, und versuchte noch Wochen später, es wiederzubeleben.

zeitgesteuert122B, eine Lane zur Zeit
Ausweichserver
bis 2026-08-18
Las die Bildspur der Belegerkennung direkt

Mehrere Modelle nacheinander (Qwen3-VL, dann ein dichtes Qwen3.8-27B) lasen Rechnungen und Lieferscheine als Bild, bevor die Pipeline alles über das Gateway schickte.

Kopfknoten
bis 2026-08-31
AMD R9700 mit vision-moe

Qwen3.6-35B-A3B, eine wirklich andere Architektur (MoE statt dicht), als vierte unabhängige Stimme in der Belegpipeline. Vom 28.08. bis 01.09. lief hier kurz auch der Briefing-Bot.

Helfer
2026-08-17
Docling zieht auf diese Karte

Deterministisches Markdown- und Tabellenparsing für die Ankerspur der Belegpipeline.

Helfer
2026-08-18 → heute
dots.mocr als vierte StimmeHEUTE

Ein deterministischer Transkribierer neben den beiden Sprachmodell-Spuren: Ein Sprachmodell kann eine Ziffer erfinden, ein Transkribierer nicht. Seither tragen Einbettung, Neu-Sortierung, Docling und mocr diese Karte, 15,4 von 16,4 GB belegt bei fast null Last.

stabil seit 18.08.
Hauptserver
2026-08-19
Qwen3.8-27B-FP8 (vLLM 0.27.1, TP=4)

Das dichte 27B löst das 122B-MoE ab. Erstmals zeigen alle sieben Altnamen (vision, text, gemma, gemma-4, qwen3.8-27b, thinking, nothink) auf ein einziges Modell.

9,03× bei 262.144~172 tok/s Sättigung
Ausweichserver
2026-08-20
Ganz dem Briefing-Bot gewidmet

Qwen3.8-27B-AWQ-INT4 mit turboquant-KV. Eine ganze Karte für einen Telegram-Bot, bewusst getrennt vom LibreChat-Verkehr.

1,64× bei 262.144 im ungünstigsten Fall
Ausweichserver
2026-08-28
Der Bot zieht aus, auf die AMD-Karte im Kopfknoten

Freigeräumt für ein anderes Projekt. Erste Station auf der Tour des Bots über drei Hosts in drei Wochen.

Ausweichserver
2026-08-29
Zum manuellen Ersatz für den Hauptserver umgewidmet

Ein Sicherheitsnetz, damit thinking und nothink nicht dunkel wurden, während der Hauptserver mit Flash-Next-Tests belegt war.

Hauptserver
2026-08-31
Qwen3.8-27B-Cold-Fusion-GAIN-V1.1

Community-Feintuning, dynamische FP8-Quantisierung. Gleicher Wert wie die FP8-Basis in der 21er-Testbatterie (18 von 21), besseres Tool-Calling und Sehen, knappere Ausgabe.

gleiche Testbatteriebesseres Tool-Calling
Hauptserver
2026-08-29 → 09-03
Flash-Next auf llama.cpp getestet: bündelt nicht

Eine neue Architektur, über alle vier Karten per llama.cpp getestet. Allein hervorragend, bei gleichzeitigen Anfragen brach der Durchsatz ein (siehe Zahlen unten). Der Chatverkehr lief für die Dauer des Tests über den Ausweichserver.

96,8 → 50,7 tok/s bei 8 parallel
Ausweichserver
2026-09-01
Der Bot kommt zurück

Seine AMD-Karte im Kopfknoten wurde ausgebaut. Der Bot läuft wieder hier, auf llama.cpp mit Cold-Fusion-GAIN IQ4_XS und nativem MTP-Kopf.

Kopfknoten
2026-09-01
R9700 ausgebaut

Die Durchreichung wurde für ein anderes Projekt gebraucht. In diesem Moment verschwand still die vierte unabhängige Stimme der Belegpipeline.

Belegpipeline fällt auf 3 unabhängige Spuren
Ausweichserver
2026-09-02
Der Bot bekommt Augen

Das GGUF lief die ganze Zeit ohne Bildmodul. Jede Bildanfrage scheiterte still. Eine fehlende Datei, gefunden und behoben.

blind seit 29.08.behoben 02.09.
Ausweichserver
2026-09-03
Produktion geht endgültig, der Bot wird stillgelegtHEUTE

Die Chat-Lanes ziehen dauerhaft zurück auf den Hauptserver. Der Bot selbst ist geparkt, seine Cron- und Agentenjobs liefen am selben Tag auf dsh um. Die Aufgabe dieser Karte heute: still warten und thinking/nothink auffangen, wenn der Hauptserver Fehler liefert oder zu lange braucht.

nur automatischer Ausweichweg65.536 Kontextgrenze
Hauptserver
2026-09-06
Flash-Next-Hybrid auf vLLM, Community-Patch für FP8-KV

Dieselbe neue Modellfamilie, jetzt auf vLLM, wo gleichzeitige Anfragen wirklich gebündelt werden. Ein FP8-Patch am KV-Zwischenspeicher hat die Gleichzeitigkeit bei gleicher Kontextlänge fast verdoppelt.

5,94× bei 192.000vorher 3,20× BF16
Hauptserver
2026-09-07
Kontext auf das native Maximum des ModellsHEUTE

262.144 Token, dieselbe Grenze wie beim Modell vom 19.08., diesmal bei der neuen Familie und wirklich an ihrem Maximum.

4,39× bei 262.144flashnext-hybrid, FP8-KV, 8 Slots
Kopfknoten
2026-09-07
Der ganze AMD/ROCm-Stapel entferntHEUTE

93 ROCm/HIP/HSA-Pakete, 9 amdgpu/libdrm-Pakete, 22 GB frei. Dieser Host trägt heute LibreChat, LiteLLM, den Auto-Router, die Belegerkennung, dsh und rund 15 MCP-Beidienste, aber keine einzige GPU-Last.

Platte 87 % → 78 %nur Kopf, keine Rechenlast
01

Ausgangslage

Eigene KI-Modelle auf eigener Hardware zu betreiben heißt, jede Entscheidung selbst zu treffen, die eine gemietete API einem abnimmt: welches Modell, welcher Kontext, welche Karte, welcher Ausweichweg. Dafür bleiben die Daten im Haus, und niemand sonst entscheidet, wann ein Modell abgeschaltet oder ausgetauscht wird.

Diese Referenz kommt aus dem Eigenbetrieb: die Flotte, die LibreChat, die eigenen Agenten und die interne Dokumentenverarbeitung täglich trägt. Stößt hier eine Karte an ihre Grenze, wissen wir es zuerst und nicht ein Kunde, der gerade wartet.

Abb. 01Die Flotte heute: ein Kopfknoten ohne GPU, ein Hauptserver mit vier Karten, ein Ausweichserver, ein Helfer.
Vier Hosts der KI-Flotte mit Rollen und Grafikkarten

Abb. 01Die Flotte heute: ein Kopfknoten ohne GPU, ein Hauptserver mit vier Karten, ein Ausweichserver, ein Helfer.

02

Das Schwierige daran

Am Anfang stand ein einziges großes Modell, das ein Cron-Job morgens und abends austauschte. Das hielt so lange, bis der Zeitplan das Modell überlebte: Der Umschalter versuchte noch Wochen später, ein längst abgelöstes Modell wiederzubeleben, weil ihn niemand davon in Kenntnis gesetzt hatte.

Eine zweite Karte las Dokumente für die Rechnungsverarbeitung, mit einer eigenen, unabhängigen Modellarchitektur, damit zwei Leser nicht auf derselben Grundlage sitzen und sich gemeinsam irren. Diese Karte war Spezialhardware, die zum Rest der Flotte nicht kompatibel war, und musste für ein anderes Projekt weichen.

Ein dritter Dienst, ein Telegram-Bot für die tägliche Kurzmeldung, zog binnen drei Wochen über drei verschiedene Karten, immer dorthin, wo gerade Kapazität frei war. Auf der letzten lief er fünf Tage lang blind, weil eine einzelne Datei (der Bildmodul für das Sehen) beim Umzug schlicht vergessen wurde. Kein Fehler, keine Warnung, nur eine Antwort, die nie zum Bild passte.

03

Lösung

Die Flotte trägt heute eine einzige Modellfamilie über alle Chat-Lanes hinweg (Denken an, Denken aus, Agenten-Betrieb, Dokumentensicht) von einem Server mit vier Grafikkarten, statt sieben verschiedener Modellnamen für sieben verschiedene Zwecke.

Fällt der Hauptserver aus oder braucht er zu lange, springt automatisch eine zweite Karte mit derselben Modellfamilie ein: kleinerer Kontext, andere Quantisierung, aber ohne dass ein Nutzer etwas davon merkt.

Die kleinen, ständig gebrauchten Dienste (Einbettung für die Suche, Neu-Sortierung der Treffer, Texterkennung) sitzen zusammen auf einer einzigen kleinen Karte statt verstreut über die Flotte.

vLLMLiteLLMQwen3.8llama.cppDoclingRTX 5090
Abb. 02PDF zu ERP: vier Spuren je Beleg, zwei davon auf demselben Sprachmodell.
Belegpipeline mit vier Spuren und gemeinsamem Sprachmodell

Abb. 02PDF zu ERP: vier Spuren je Beleg, zwei davon auf demselben Sprachmodell.

04

Wie es gebaut ist

Ein Gateway ist der einzige Ansprechpartner für jeden Aufrufer: LibreChat, die Agenten, die interne Automatisierung, sogar die CNC-Anlage in der Fertigung. Welche Karte tatsächlich antwortet, ist dahinter verborgen, und genau das macht den Ausweichserver möglich, ohne dass ein Client umgestellt werden müsste.

Der Weg zur heutigen Kontextgröße von 262.144 Token war kein gerader. Ein neues Modell brauchte zunächst einen niedrigeren, ehrlicheren Wert, weil der alte Höchstwert für die neue Architektur nicht mehr galt, ein Fehler, der sonst erst beim ersten abgeschnittenen Gespräch aufgefallen wäre. Ein Patch am Zwischenspeicher der Karten hob die gleichzeitige Kapazität von 3,2 auf 5,9 volle Gespräche an, bevor der Kontext wieder auf sein echtes Maximum stieg.

Eine andere Software für dasselbe neue Modell lieferte im Alleinbetrieb hervorragende Werte und brach bei acht gleichzeitigen Anfragen auf weniger als die Hälfte des Einzeldurchsatzes ein. Die jetzige Lösung sättigt stattdessen bei über 30 gleichzeitigen Gesprächen, statt bei acht zusammenzubrechen. Das allein hat über die Wahl der Serversoftware entschieden.

Bei der Dokumentenverarbeitung stimmen vier unabhängige Leseversuche über jedes Feld ab: zwei Sprachmodelle, zwei deterministische Texterkennungen. Nachdem die Spezialkarte wegfiel, teilen sich zwei dieser vier Stimmen denselben Server. Das ist offen dokumentiert und wird nicht schöngeredet: Es sind heute drei unabhängige Meinungen und nicht vier.

LibreChat29 AgentendshCNC-AnlageGatewayleitet weiterHauptserver4 Grafikkarten · ein ModellAusweichservergleiche ModellfamilieHelferEinbettung · Texterkennungbei Störung
Ein Anrufer sieht nur das Gateway. Welche Karte gerade antwortet, ist ihr eigenes Geheimnis.
Nachschlagen

Jede Lane, was dahintersteht, wofür sie da ist

LaneServerStatusZweck
thinkingmain:8000primärHaupt-Chat-Lane, Denken an. LibreChat und alle 29 Agenten.
nothinkmain:8000primärDasselbe Modell, Denken aus: sauberes JSON, werkzeuglastige Abläufe.
dshmain:8000primärGleicher Server wie thinking, eigene Zeile im Kostenlog für Agentenjobs.
visionmain:8000primärAlias für Aufrufer, die noch „vision“ verlangen. Ein eigenes Bildmodell gibt es nicht mehr.
thinking-cncmain:8000primärCNC-Runner mit 30 Minuten Timeout; die üblichen 600 s hatten lange Jobs bei 601 s abgebrochen.
cnc-nothinkmain:8000primärDerselbe Runner, Denken aus, wenn Überlegen die CNC-Aufgabe entgleisen lässt.
text(Alias)→ nothinkverstecktAltname, durchgereicht.
auto(Alias)→ thinkingverstecktAltname, durchgereicht.
thinking-fallback / nothink-fallbackstandby:8080AusweichAutomatischer Wechsel, wenn der Hauptserver Fehler liefert oder zu lange braucht. Kleinerer Kontext, INT4 statt FP8: Weiterbetrieb, keine Gleichwertigkeit.
embedhelper:8010primärRAG und Vektorsuche.
rerankhelper:8011primärNeu-Sortierung der RAG-Treffer.
mocrhelper:8123primärDeterministische Texterkennung, zugleich vierte Stimme der Belegpipeline.
hermesstandby:8080geparktDer Briefing-Bot, stillgelegt am 03.09.2026, Jobs auf dsh umgezogen.
securitystandby:8081definiert, ausEnthemmtes Red-Team-Modell, auskommentiert und nicht live.
PDF zu ERP

Vier Spuren stimmen über jeden Beleg ab

Die Belegerkennung liest Rechnungen und Lieferscheine für den ERP- und TMS-Import. Jede Spur extrahiert für sich, ein Abgleich wählt je Feld den Konsenswert.

BelegBildspurliest die Seite als BildTextspurliest das Docling-MarkdownAnkerspurDocling, ohne KImocr-Spurdots.mocr, ohne KIein SprachmodellHauptserver, liest zweimalAbgleichKonsens je Feld, dann ERPDer gemeinsame Kasten ist der Befund, keine Verzierung: Bild- und Textspur waren einmal zwei getrennte Modelle.
!

3 unabhängige Meinungen statt 4. Bild- und Textspur laufen seit dem Gateway-Wechsel am 19.08.2026 auf denselben Server (nothink auf dem Hauptserver): Ein Sprachmodell liest zweimal, dazu zwei wirklich getrennte deterministische Parser (Docling, dots.mocr).

Keine schnelle Lösung: Der frühere eigene Bildserver (die AMD R9700 mit vision-moe) wurde am 01.09. ausgebaut, sein Softwarestapel am 07.09. entfernt. Echte Vierfach-Unabhängigkeit heißt einen neuen Server aufsetzen und nicht einen Schalter umlegen.

Vergleiche

Die zwei Entscheidungen, die die Zahlen getroffen haben

Gleichzeitigkeit auf der Haupt-Lane (Hauptserver)

Größe des KV-Zwischenspeichers als Vielfaches der Volltext-Anfragen, die er gleichzeitig hält

0×2×4×6×8×10×9.03×08-1927B-FP83.20×09-03Flash-Next BF165.94×09-06+ FP8-KV-Patch4.39×09-07nativer Kontext · heute

Gestrichelt ist der Wechsel der Modellfamilie, kein Tuning-Schritt; dort darf die Gleichzeitigkeit zurückfallen. Die beiden durchgezogenen Abschnitte sind dieselbe Familie: Der FP8-KV-Patch hat die Gleichzeitigkeit fast verdoppelt, das echte 262k-Maximum hat einen Teil davon wieder gekostet.

Warum die Haupt-Lane auf vLLM gelandet ist

Dasselbe Flash-Next-Modell, zwei Serverprogramme, Token pro Sekunde

050100150200 tok/sllama.cpp, allein96.8llama.cpp, ×8 (gesamt)50.7vLLM, 32–64 gleichzeitig172

llama.cpp war allein schneller und gebündelt langsamer als es selbst: Acht gleichzeitige Ströme ergaben zusammen weniger Durchsatz als einer. vLLM sättigt, statt einzubrechen, und genau deshalb läuft der Hauptserver damit.

05

Im Betrieb

Ein Wächter-Skript startet gestoppte Dienste automatisch neu, praktisch, bis er ein Modell falsch identifiziert und ein längst abgelöstes wiederbelebt. Die Regel dazu ist inzwischen so einfach wie hart: Ein Dienst gilt nur dann als 'sollte laufen', wenn seine eigene Neustart-Richtlinie das auch sagt.

Der automatische Ausweichweg wird nicht nur konfiguriert, vielmehr regelmäßig scharf geprüft: Der Hauptserver wird kurz lahmgelegt, und es zählt nur, ob der zweite tatsächlich übernimmt und nicht, ob die Konfiguration plausibel aussieht.

Abb. 03Die zwei Messungen, die die Serverwahl entschieden haben.
Zwei Messkurven: Gleichzeitigkeit und Durchsatz

Abb. 03Die zwei Messungen, die die Serverwahl entschieden haben.

06

Ergebnis

Alle Chat-Lanes laufen heute über eine Modellfamilie mit automatischer Ausfallsicherung, bei 262.144 Token nativer Kontextgrenze: gemessen und nicht behauptet.

Der frühere Kopfknoten der Flotte trägt heute keine einzige Grafikkarte mehr; sein komplettes Spezialtreiber-Softwarepaket wurde entfernt, 22 GB Speicherplatz frei.

07

Was wir daraus gelernt haben

Bei einem eigenen AI-Stack ist die Hardware die kleinere Aufgabe. Fast jede Störung in den fünf Wochen Umbau war kein Ausfall einer Karte, vielmehr ein Umbau, bei dem etwas liegenblieb. Gewartet wird deshalb nach einer kurzen Prüfliste und nicht nach Erfahrung.

Wir messen jetzt regelmäßig nach, welches Modell hinter welchem Namen tatsächlich läuft. Systematisch gemacht haben wir das erst für diesen Bericht, und das Ergebnis passte nicht zur Konfiguration. Seither gehört die Messung zur Wartung und nicht mehr zum Bericht.

Vier Karten reichen für unseren Alltag. Die Begrenzung ist nicht die Rechenleistung, vielmehr die Wartungszeit, die neben dem Betrieb übrig bleibt. Wer einen eigenen AI-Stack plant, sollte diese Stunden zuerst rechnen, sie entscheiden, ob die Anlage in zwei Jahren noch aktuell ist.

Ähnliches Problem?

Erzähl uns, was du vorhast, ein kurzes Gespräch klärt, ob sich das rechnet.