Warum reserviert eine lokale KI-Laufzeitumgebung nach einer Anfrage Speicher?

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.

Eine lokale KI-Laufzeitumgebung reserviert nach einer Anfrage Speicher, damit zukünftige Tensoren Geräteblöcke wiederverwenden können, ohne wiederholt Kosten für Allokation und Synchronisierung zu verursachen.

Das sichtbare Ergebnis kann wie ein Speicherleck wirken: Die GPU-Auslastung fällt auf null, die Antwort ist vollständig, aber der Prozess belegt weiterhin den größten Teil des Beschleunigerspeichers. Ein Teil dieses Speicherbedarfs kann auf aktive Modellgewichte oder den KV-Zustand entfallen, während ein anderer Teil zu einem Caching-Allocator, Ausführungskontext, Graph-Capture, Bibliotheks-Workspace oder einer Keep-Alive-Richtlinie des Modells gehört. Die folgenden Abschnitte unterscheiden aktive Allokationen von wiederverwendbaren Reservierungen und zeigen, wann persistenter Speicher normal, verschwenderisch oder ein Hinweis auf ein echtes Leck ist.

Geräteallokation ist teuer genug, um zwischengespeichert zu werden

Während einer Anfrage erstellte Tensoren werden wiederholt angelegt und freigegeben. Jeden Block an den Treiber zurückzugeben, kann Synchronisierung verursachen und dazu führen, dass die Speicheranordnung für die nächste Anfrage erneut aufgebaut werden muss.

Der CUDA-Allocator von PyTorch trennt zwischengespeicherte Allocator-Blöcke von Tensoren, die weiterhin aktiv allokiert sind.

Das Behalten freier Blöcke innerhalb des Prozesses verbessert die Latenz bei wiederholten Anfragen. Ein anderer KI-Dienst kann diese Bytes jedoch erst nutzen, wenn der Allocator sie an den Treiber freigibt.

Allokierter, reservierter und auf dem Gerät freier Speicher sind unterschiedliche Messwerte

Allokierter Speicher gehört zu noch aktiven Tensoren. Reservierter Speicher wird vom Laufzeit-Allocator verwaltet und kann sowohl aktive Allokationen als auch derzeit ungenutzte, wiederverwendbare Blöcke umfassen.

Eine Laufzeitumgebung kann daher auch nach der Zerstörung temporärer Tensoren eine Lücke beim reservierten Speicher anzeigen.

Gerätewerkzeuge wie nvidia-smi melden den für den Treiber sichtbaren Speicherbedarf des Prozesses, nicht, welche Blöcke innerhalb des Frameworks logisch frei sind.

Modell- und Laufzeitstatus können absichtlich aktiv gehalten werden

Der Prozess kann Modellgewichte, Tokenizer-Status, Kernel, Ausführungsgraphen und Beschleunigerkontexte bereithalten, weil ihre Entladung die nächste Anfrage in einen Kaltstart verwandeln würde.

Die Erklärung von ZimaSpace zu im Speicher gehaltenen Modellen zeigt, warum ein warmer Dienst Speicher verbraucht, selbst wenn gerade kein Benutzer Tokens generiert.

Dies ist ein bewusster Kompromiss zwischen Kapazität und Latenz. Aus Sicht der Rechenleistung ist der Speicher ungenutzt, als bereithaltender Status jedoch weiterhin wertvoll.

-15% OFF

Fragmentierung kann reservierte Blöcke nur schlecht wiederverwendbar machen

Ein Pool kann insgesamt genügend ungenutzte Bytes enthalten, während deren Blockgrößen nicht zur nächsten Anfrage passen. Unterschiedliche Prompts, Bildgrößen, Batches und Modellwechsel können ein fragmentiertes Reservierungsmuster erzeugen.

GMLake untersucht die durch unregelmäßige Allokationsgrößen verursachte Fragmentierung von Allocators.

In diesem Fall ist der zurückgehaltene Speicher weder aktiv nützlich noch für andere Prozesse verfügbar. Ein Neustart des Prozesses kann vorübergehend wieder für eine sauberere Anordnung sorgen.

Messen Sie, ob sich der Speicherbedarf stabilisiert oder wächst

Führen Sie wiederholt dieselbe feste Anfrage aus und protokollieren Sie nach jedem Abschluss den allokierten und reservierten Speicher sowie KV-Cache, Modellgewichte und auf dem Gerät freien Speicher.

Ein stabiler Höchstwert deutet auf normales Caching oder ein Keep-Alive-Verhalten hin. Ein Speicherbedarf, der mit jeder identischen Anfrage wächst und alte Blöcke nie wiederverwendet, deutet auf ein Leck, einen unbegrenzten Cache, eine beibehaltene Sitzung oder eine veränderte Arbeitslast hin.

Testen Sie Steuerungen zur Cache-Freigabe erst, nachdem Sie bestätigt haben, welchen Status sie entfernen. Das Leeren ungenutzter Allocator-Blöcke entlädt keine aktiven Modellgewichte, und das Entladen des Modells kann die Antwortzeit verschlechtern.

Legen Sie für einen Heimserver mit mehreren Diensten pro Laufzeitumgebung ein Speicherbudget und eine Richtlinie für Leerlaufzeiten fest, damit die Reservierung eines Dienstes nicht unbemerkt den Start eines anderen verhindert.

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.