Vad får minnesanvändningen i en lokal modellserver att smyga upp mellan förfrågningar?

Eva Wong är Teknisk skribent och den boende fixaren på ZimaSpace. En livslång nörd med en passion för hemma-labb och öppen källkod, hon specialiserar sig på att översätta komplexa tekniska koncept till tillgängliga, praktiska guider. Eva tror att självhosting ska vara roligt, inte skrämmande. Genom sina handledningar ger hon gemenskapen verktyg att avmystifiera hårdvaruinstallationer, från att bygga sin första NAS till att bemästra Docker-containrar.

Minne för lokala modellservrar ökar vanligtvis gradvis eftersom cacheminnen och allokerare behåller återanvändbara block, även om obegränsade referenser eller läckor i native-kod kan orsaka verklig tillväxt.

Efter varje förfrågan till hemservern kan en instrumentpanel visa att RAM eller VRAM ökar utan att återgå till den ursprungliga baslinjen. Körtidsmiljön kan behålla KV-block, prefixposter, kärnor, grafer, arbetsytor och frigjorda tensorblock för återanvändning. Varierande promptlängder kan fragmentera pooler, medan loggar, sessioner, bildbuffertar eller tillägg behåller objekt på obestämd tid, så dessa mekanismer kräver olika bevis och gränser.

Cachande allokerare reserverar frigjorda block för återanvändning

GPU-ramverk undviker kostsamma enhetsallokeringar genom att behålla frigjorda block i en processägd pool. Applikationens tensorer kan vara borta medan drivrutinen fortfarande rapporterar den reserverade poolen som använd av modellservern. Denna skillnad förblir synlig under senare tester i hemmet.

En analys av allokeraren förklarar hur cachade GPU-minnesblock avrundar, delar upp, slår samman och cachar CUDA-block. Kännetecknet är att allokerat tensorminne minskar efter en förfrågan medan reserverat minne förblir högt och senare förfrågningar återanvänder det.

Denna platå är inte automatiskt en läcka. Den blir skadlig när poolen hindrar en annan tjänst från att allokera minne eller fortsätter att växa under upprepade förfrågningar med identisk form efter uppvärmningen. Mellanresultatet måste förbli inspekterbart innan automatisering följer.

Serveringscacheminnen och förfrågningsformer utökar den avsedda arbetsmängden

KV-cacheminnen växer med den aktiva kontexten, prefixcacheminnen behåller återanvändbara prompter, och kompilerade grafer eller kärnor täcker observerade batchformer. Nya kontextlängder, modaliteter och samtidighetsprofiler kan lägga till poster mellan förfrågningar. Den gränsen bör mätas separat under realistiska driftförhållanden.

Forskning om minnesfragmentering i LLM-system identifierar fragmentering mellan minnesutrymmen för aktiveringar och KV-cacheminnen vid LLM-servering. Observationen förklarar varför den totala kapaciteten kan öka även när ingen enskild aktiv förfrågan är stor. Den praktiska konsekvensen uppstår när flera källor konkurrerar om en begränsad kontext.

Registrera antalet cacheposter och formklasser. Tillväxt som upphör när arbetsbelastningens fördelning har stabiliserats är begränsad uppvärmning; tillväxt som är proportionell mot det totala antalet förfrågningar eller unika sessions-ID:n tyder på att borttagning saknas. Detta beroende bör förbli explicit i det slutliga gränssnittet.

Behållna CPU-objekt och native-buffertar orsakar verklig gradvis tillväxt

Förfrågningshistorik, strömningsköer, mätetiketter, tokeniserarutdata, uppladdade bilder, låsta värdbuffertar och allokeringar från tillägg kan förbli refererade efter slutförandet. GPU-ögonblicksbilder kan se stabila ut medan processens RSS fortsätter att öka. Resultatet måste därför kontrolleras mot de ursprungliga bevisen.

En praktisk undersökning av allokerat kontra reserverat minne skiljer mellan signaler för allokerat minne, reserverat minne och processminne. Denna skiktade bild förhindrar att ett kvarhållningsproblem på CPU-sidan feldiagnostiseras som beteende hos GPU-allokeraren. Denna skillnad förblir synlig under senare tester i hemmet.

Felgränsen är en engångsökning följd av en stabil högvattennivå. Kalla det en läcka först när kontrollerade, identiska förfrågningar ger fortsatt kvarhållen tillväxt efter att cachegränser, skräpinsamling och förväntade pooler har räknats med.

Skapa en kurva över minneskvarhållning per förfrågan

Spela upp hundratals identiska förfrågningar, följt av blandade längder och modaliteter, medan du registrerar allokerade och reserverade GPU-byte, KV- och prefixposter, grafcache, låst minne, processens RSS, objektantal, förfrågningssessioner, omstarter av arbetare och ögonblicksbilder av allokeraren.

Använd minnesreservation efter förfrågan för att skilja avsiktlig reservation efter förfrågan från annat beteende. Upprepa testet med varje valfritt cacheminne, tillägg, uppladdningsväg och mätetikett avstängt separat, medan modellen och samtidigheten hålls konstanta. Mellanresultatet måste förbli inspekterbart innan automatisering följer.

Acceptera begränsad uppvärmning som planar ut inom den angivna minnesbudgeten. Lägg till borttagning när cachemängden växer utan nytta, normalisera förfrågningsformer när fragmentering dominerar och isolera en verklig läcka först efter att stackspår för kvarhållna allokeringar pekar på en ägare.

Teknik- och AI-hubb

Mer att läsa

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.