Minnesavbildning av modellfiler: Hur delade sidor minskar duplicerad RAM-användning

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.

Minnessmappade modellfiler kan minska dubbel användning av RAM eftersom processer refererar till samma rena filbackade sidor via operativsystemets sidcache.

Att läsa in två lokala modellprocesser kräver inte alltid två kompletta kopior av viktfilen i det fysiska minnet. Med minnesmappning får varje process virtuella adresser som är kopplade till filförskjutningar, och sidor läses in vid behov. Operativsystemet kan tillgodose identiska rena sidor från en enda cachad fysisk kopia, samtidigt som varje process privata körtidstillstånd hålls åtskilda.

Minnesmappning kopplar virtuella adresser till filförskjutningar

En mappad fil visas i processens adressutrymme utan att programmet behöver läsa in hela filen i en separat heapbuffert. Åtkomst till en saknad sida utlöser ett sidfel; kärnan läser in eller hittar motsvarande filbackade sida och uppdaterar processens sidtabell.

Linux-handboken för minnesmappning dokumenterar mappningarna MAP_SHARED och MAP_PRIVATE samt sambandet mellan mappade uppdateringar och det underliggande objektet. Skrivskyddade modellvikter förblir vanligtvis rena filbackade data, vilket gör dem möjliga att återanvända via sidcachen. Denna åtskillnad är fortfarande viktig under realistiska förhållanden i hemmet.

Sidväxling vid behov kan förkorta uppstarten och begränsa mängden resident minne när bara en del av modellen används. Den kan också flytta kostnaden till den första åtkomsten, så fel på kalla sidor och lagringsfördröjning kan uppstå under inferens i stället för under en uttrycklig inläsningsfas.

Sidcachen kan betjäna flera processer samtidigt

Två processer kan mappa samma modell-inode och filförskjutningar till olika virtuella adressutrymmen. När båda läser samma rena sida kan kärnan mappa samma cachade fysiska sida till båda sidtabellerna. De virtuella mappningarna är separata, men de underliggande residenta data kan delas.

Linux-dokumentationen för data om sidmappning förklarar hur användarutrymmet kan granska sidmappningar och information om sidramar, med förbehåll för åtkomstbegränsningar. Dessa gränssnitt hjälper till att visa om till synes separata virtuella regioner hänvisar till delade fysiska sidor. Mellanläget bör förbli synligt vid senare felsökning och granskning.

Därför kan en summering av RSS per process överskatta den totala fysiska minnesanvändningen: en delad sida visas som resident i varje process. Proportionell mängd minne (PSS) fördelar delade sidor mellan mappningarna och är vanligtvis mer användbart när man uppskattar det sammanlagda minnesavtrycket från modellprocesserna.

Privata tillstånd och smutsiga sidor multipliceras fortfarande

KV-cacher, aktiveringar, allokerarens minnesarenor, tokeniseringsbuffertar och begärandetillstånd skapas per arbetare eller per session. Skrivning via en privat mappning utlöser copy-on-write och skapar en anonym sida som inte längre kan dela den rena filbackade kopian. Olika filversioner förhindrar också återanvändning.

Linux-handboken för smaps klassificerar privata, delade, rena, smutsiga och smaps-handboken för varje mappning. Dessa kategorier förklarar varför två arbetare som delar vikter ändå kan visa en betydande ytterligare minnesanvändning när samtidigheten och kontextlängden ökar.

Gränsen är att mappning minskar dubbla rena vikter, inte den totala inferensminnesanvändningen. Nätverksmonterade modellfiler kan också ge instabil sidfelsfördröjning, och komprimerade eller transformerade inläsare kan allokera en andra uppackad representation som omintetgör den förväntade delningen.

Jämför en arbetare med två mappade arbetare

Börja med en kall cache, starta en modellprocess, kör en fast prompt och registrera uppstartstid, sidfel, RSS, PSS och privat smutsigt minne. Starta en andra identisk arbetare och upprepa utan att ändra modellfilen eller flaggorna för inläsaren.

Sätt resultatet i relation till komprimeringsavvägningarna i komprimeringsavvägningarna: mindre filer underlättar lagring, medan nyttan av mappning beror på den minnesrepresentation som faktiskt används. Granska varje modellmappning i smaps i stället för att förlita dig på totalsiffran för en enda process.

Godkänn om den andra arbetaren lägger till betydligt mindre viktminne än den första samtidigt som samma resultat produceras med acceptabel kall fördröjning. Om PSS nästan fördubblas bör du kontrollera filidentitet, skrivbara mappningar, dekomprimering och dolda kopior innan du antar att mmap är ineffektivt.

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.