Was verursacht das Laden doppelter Modellkopien durch eine lokale KI-Laufzeitumgebung?

Eva Wong ist die Technische Redakteurin und und leidenschaftliche Tüftlerin bei ZimaSpace. Eine lebenslange Geek mit einer Leidenschaft für Homelabs und Open-Source-Software, sie spezialisiert sich darauf, komplexe technische Konzepte in zugängliche, praktische Anleitungenzu übersetzen. Eva ist der Meinung, dass Self-Hosting Spaß machen und nicht einschüchternd sein sollte. Durch ihre Tutorials befähigt sie die Community, Hardware-Setups zu entmystifizieren, vom Bau ihres ersten NAS bis hin zur Beherrschung von Docker-Containern.

Doppelte Modellkopien entstehen, wenn separate Prozesse, Replikate, Sitzungen oder Gerätekontexte eine geladene Gewichtszuweisung nicht gemeinsam nutzen können.

Ein Heimserver für KI kann nach dem Hinzufügen einer Weboberfläche, eines Hintergrund-Workers, eines Sprachdienstes, eines Dokumentenindexierers oder eines zweiten API-Endpunkts ungefähr doppelt so viel RAM oder VRAM anzeigen wie erwartet. Die Modelldatei auf der Festplatte kann weiterhin nur einmal vorhanden sein, während mehrere Laufzeitobjekte unabhängige Gewichte, konvertierte Tensoren, vorgepackte Kernel, Caches und Gerätekontexte vorhalten. Manche Duplikate entstehen unbeabsichtigt, andere sind bewusst erstellte Replikate für Parallelität, Isolation oder parallele Ausführung.

Eine Modelldatei kann mehrere unabhängige Laufzeitobjekte erzeugen

Das Laden über denselben Pfad bedeutet nicht, dass zwei Anwendungen auf dasselbe Modell im Speicher verweisen. Jede Laufzeitinstanz kann den Checkpoint analysieren und eigene Tensoren zuweisen.

Die Inferenzempfehlungen von Google Cloud unterscheiden Konfigurationen, die eine Modellkopie pro Prozess oder pro virtueller Maschine laden.

Steigt der Speicherverbrauch mit zunehmender Worker-Anzahl in Schritten von ungefähr einer Modellgröße, ist die Instanzreplikation die Hauptursache. Kleinere Zuwächse deuten eher auf Worker-spezifische Caches, Speicherzuweiser oder Ausführungskontexte hin.

Webserver und Job-Worker starten häufig separate Prozesse

Ein Frontend-Server, ein Warteschlangen-Consumer, ein Scheduler, ein Transkriptionsdienst und ein RAG-Worker können jeweils den Modelllader importieren, selbst wenn sie zu demselben Compose-Stack gehören.

Die Prozessisolierung gibt jedem Dienst einen eigenen Adressraum. CPU-Seiten können mithilfe von Betriebssystemmechanismen teilweise gemeinsam genutzt werden, aber gewöhnliche Framework-Objekte und GPU-Zuweisungen werden nicht automatisch zu einem gemeinsam genutzten Modelldienst.

Die Duplizierung folgt den Prozess-IDs und Dienstgrenzen. Gibt das Beenden eines Containers ungefähr eine Modellkopie frei, hat der Container Anfragen nicht lediglich an eine zentrale Laufzeit weitergeleitet.

Serving-Replikate sind absichtlich einzelne Kopien

Systeme mit automatischer Skalierung erhöhen den Durchsatz, indem sie weitere Replikate starten. Ein Replikat ist ein unabhängiger Worker, der Anfragen bedienen kann, wenn andere Worker ausgelastet sind.

Ray Serve definiert Replikate als einzelne Kopien, die in separaten Actor-Prozessen ausgeführt werden.

Ein Speicherwachstum, das mit Verkehrsspitzen oder Ereignissen der automatischen Skalierung einhergeht, ist beabsichtigte Replikation und kein Speicherleck. Die Ursache liegt im gewählten Parallelitätsmodell, selbst wenn das Herunterskalieren der zusätzlichen Replikate später Zeit benötigt.

-15% OFF

Mehrere Inferenzsitzungen können Initialisierer und vorgepackte Gewichte duplizieren

Eine Anwendung kann innerhalb eines Prozesses mehrere Sitzungen für verschiedene Threads, Endpunkte, Profile oder Ausführungsanbieter erstellen.

ONNX Runtime dokumentiert die gemeinsame Nutzung von Speicherzuweisern, Initialisierern und vorgepackten Gewichten über mehrere Sitzungen hinweg, da separate Sitzungen andernfalls zusätzlichen Speicherbedarf verursachen.

Besitzt ein Prozess mehrere Sitzungsobjekte und steigt der Speicherverbrauch bei der Initialisierung jeder Sitzung, befindet sich der doppelte Zustand innerhalb der Anwendung und nicht containerübergreifend.

Forking garantiert keine gemeinsam genutzten Accelerator-Gewichte

Ein übergeordneter Prozess kann ein Modell laden, bevor er Worker erstellt, und durch Copy-on-Write scheinbar CPU-Seiten gemeinsam nutzen. Die Initialisierung des Accelerators und veränderlicher Laufzeitstatus machen diese Annahme jedoch komplizierter.

Die Multiprocessing-Empfehlungen von PyTorch erklären, dass Tensoren Mechanismen für gemeinsam genutzten Speicher über Prozesse hinweg verwenden können, die gemeinsame Nutzung jedoch ein ausdrücklich dafür ausgelegtes, kompatibles Design erfordert.

Ein Worker, der das Modell auf die GPU verschiebt, Gewichte ändert, einen Cache aufbaut oder nach dem Start initialisiert, kann eine neue Kopie zuweisen, selbst wenn die ursprünglichen CPU-Seiten des Checkpoints gemeinsam genutzt wurden.

Separate CUDA-Kontexte fügen prozessspezifischen Gerätezustand hinzu

Zwei Prozesse, die eine GPU verwenden, arbeiten normalerweise über getrennte CUDA-Kontexte, sofern keine spezielle Architektur für die gemeinsame Nutzung eingesetzt wird.

NVIDIA weist darauf hin, dass mehrere CUDA-Anwendungsprozesse im Allgemeinen mehrere Kontexte mit zusätzlichem Speicherbedarf erstellen.

Der Kontext-Overhead ist für sich genommen kein zweites vollständiges Modell, kann aber zusammen mit duplizierten Gewichten, Kerneln, Arbeitsbereichen und Caches auftreten. Speicherzuwächse, die kleiner als die Checkpoint-Größe sind, können daher trotzdem durch Prozessduplizierung entstehen.

Zwei Laufzeitinstanzen auf einer GPU reservieren Speicher unabhängig voneinander

Ein Dashboard kann einen Modellserver starten, während ein Automatisierungsdienst einen zweiten startet, wobei beide auf denselben Checkpoint und dasselbe Gerät verweisen.

vLLM dokumentiert, dass die GPU-Speichernutzung ein Limit pro Instanz ist, und zeigt als Beispiel zwei Instanzen, die die Kapazität einer GPU aufteilen.

Wenn jeder Endpunkt seinen eigenen Listener, seine eigenen Protokolle, seinen eigenen Scheduler und seinen eigenen KV-Cache besitzt, sind die beiden Prozesse unabhängige Inferenz-Engines. Ein gemeinsam genutztes Modellverzeichnis verhindert doppelte Downloads, nicht jedoch doppelte Laufzeitzuweisungen.

Neuladevorgänge können einen alten Prozess neben dem neuen am Leben lassen

Hot-Reload-Mechanismen, Supervisoren, Rolling Updates, fehlgeschlagene Beendigungen und Neustarts durch Health-Checks können einen Ersatzprozess starten, bevor der alte Worker sein Modell freigibt.

Diese Ursache zeigt sich als vorübergehendes oder dauerhaftes Paar nahezu identischer Prozesse mit unterschiedlichen Startzeiten. Anfragen erreichen möglicherweise nur den neueren Prozess, während der ältere weiterhin RAM oder VRAM belegt.

Der Artikel von ZimaSpace darüber, warum man den KI-Laufzeitstatus von Modelldateien trennen sollte, beschreibt die Abgrenzung: Ein gemeinsamer Checkpoint-Cache kann viele Bereitstellungen versorgen, aber die Diensttopologie bestimmt weiterhin, wie viele geladene Kopien vorhanden sind.

FAQ

Bedeutet eine einzige Modelldatei auf der Festplatte, dass sich auch nur eine Kopie im RAM befindet?

Nein. Mehrere Prozesse oder Sitzungen können dieselbe Datei unabhängig voneinander lesen und eigene Tensoren, Caches und Ausführungszustände zuweisen.

Ist jede zusätzliche Kopie ein Speicherleck?

Nein. Replikate, Tensor-Parallel-Worker, Fallback-Laufzeiten und isolierte Dienste können absichtlich zusätzlichen Zustand zuweisen. Ein Leck wächst ohne ein entsprechendes aktives Laufzeitobjekt.

Können Container automatisch dasselbe GPU-Modell gemeinsam nutzen?

Nein. Container können auf dasselbe Gerät und dieselben Dateien zugreifen, benötigen aber einen gemeinsam genutzten Serving-Prozess oder ein ausdrücklich dafür ausgelegtes Design zur Kommunikation zwischen Prozessen, um eine geladene Modellzuweisung wiederzuverwenden.

Tech- & KI-Zentrum

Mehr zum Lesen

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.