La frammentazione della memoria della GPU può impedire l’esecuzione di un modello IA locale quando la capacità libera è suddivisa in aree che non riescono a soddisfare il modello di allocazione successivo del runtime.
Il problema si manifesta spesso dopo il passaggio da un modello all’altro, la modifica della lunghezza del contesto, l’esecuzione combinata di carichi di lavoro per immagini e linguaggio o la gestione di richieste i cui tensori temporanei aumentano e diminuiscono. Il monitoraggio può mostrare VRAM inutilizzata, ma l’allocatore potrebbe comunque non riuscire a collocare un’area di lavoro di grandi dimensioni, una partizione del modello o l’espansione della cache KV senza rilasciare o riorganizzare i blocchi esistenti. Le sezioni seguenti distinguono una reale carenza di capacità dalla frammentazione dell’allocatore e spiegano perché il riavvio del runtime può temporaneamente consentire allo stesso modello di rientrare nella memoria disponibile.
La VRAM libera totale non corrisponde allo spazio di allocazione utilizzabile
Un monitor della memoria indica la capacità aggregata, ma un allocatore deve soddisfare le richieste utilizzando i blocchi e le mappature virtuali che gestisce. Diverse aree libere di piccole dimensioni possono sommarsi a una quantità superiore a quella richiesta, pur rimanendo inutilizzabili secondo una regola di allocazione contigua.
Un’analisi sulle operazioni degli LLM descrive questa discrepanza della memoria libera quando le cache KV e i tensori variabili lasciano spazi vuoti più piccoli della richiesta successiva. L’errore di memoria esaurita visibile riguarda quindi sia la disposizione sia il numero totale di byte.
I driver e i framework possono inoltre riportare in modo diverso la memoria libera sul dispositivo, riservata, allocata e inattiva. Confronta la visualizzazione dell’allocatore del runtime con l’utilizzo a livello di dispositivo invece di affidarti a un unico numero riepilogativo.
Le dimensioni variabili dei tensori creano buchi nel tempo
I carichi di lavoro IA allocano e rilasciano ripetutamente tensori di dimensioni diverse per prompt, batch, dimensioni delle immagini, aree di lavoro per l’attenzione e conversioni temporanee. Un allocatore con cache conserva i blocchi per riutilizzarli, poiché restituirli ripetutamente al driver è costoso.
La ricerca GMLake mostra che le allocazioni irregolari possono ridurre l’efficienza dei pool di memoria basati sulla suddivisione e creare una frammentazione significativa nei modelli di grandi dimensioni. Riutilizzare dimensioni identiche è efficiente; suddividere e unire ripetutamente dimensioni non corrispondenti è più complesso.
Un home server che alterna diversi modelli è particolarmente vulnerabile, perché i runtime per linguaggio, diffusione, visione e voce richiedono forme di blocco molto diverse dalla stessa GPU.
La frammentazione può accumularsi senza una perdita di memoria. Ogni allocazione può essere infine rilasciata al pool, ma la forma del pool può rimanere scarsamente adatta al carico di lavoro successivo.
La crescita della cache KV rende dinamica la frammentazione durante l’inferenza
I pesi degli LLM sono relativamente stabili dopo il caricamento, mentre la cache KV cresce in base agli utenti attivi, alla lunghezza del prompt e ai token generati. Inoltre, le richieste terminano in momenti diversi, liberando aree non uniformi.
PagedAttention è stato progettato per ridurre la frammentazione della cache KV, memorizzando lo stato delle richieste in blocchi più piccoli invece di riservare un’unica grande area contigua per una lunghezza finale della sequenza sconosciuta.
Questo problema è diverso dalla frammentazione nell’allocatore generale dei tensori del framework, ma i due fenomeni possono coesistere. Un gestore KV con paging non può compattare automaticamente le aree di lavoro del modello o le allocazioni appartenenti a un altro processo.
La discussione di ZimaSpace sui contesti simultanei mostra perché un modello che funziona per un utente può superare un limite di memoria quando più conversazioni si espandono contemporaneamente.
La memoria riservata può far sembrare il problema una perdita
Gli allocatori dei framework spesso conservano i blocchi liberati per velocizzare le richieste successive. Gli strumenti del dispositivo contano questi blocchi come utilizzati dal processo, anche quando il modello corrente non contiene tensori attivi in tutti quei blocchi.
Una guida pratica agli errori di memoria esaurita distingue la memoria riservata dai requisiti del modello attivo e della cache. Una differenza significativa può indicare blocchi riutilizzabili dell’allocatore, frammentazione o un carico di lavoro il cui picco è stato superiore allo stato attuale.
Svuotare una cache può restituire alcuni blocchi al driver, ma non può liberare i pesi attivi, lo stato KV corrente, il contesto di un altro processo o l’area di lavoro richiesta dall’operazione successiva.
Forme di allocazione stabili e paging riducono i guasti ricorrenti
Riproduci il problema con un solo modello, un limite di contesto fisso, una dimensione del batch fissa e nessun servizio IA concorrente. Registra la memoria allocata e riservata a livello di processo, la memoria libera a livello di dispositivo, la richiesta più grande e la sequenza di carichi di lavoro che ha preceduto l’errore di memoria esaurita.
vAttention utilizza la mappatura della memoria virtuale per separare lo spazio KV virtuale contiguo dall’allocazione fisica. Approcci simili basati sul paging e sull’allocazione segmentata riducono la dipendenza da un’unica area fisicamente contigua.
Per un home server, i controlli pratici includono lasciare margine nella VRAM, limitare il passaggio frequente da un modello all’altro, usare limiti stabili per contesto e batch, coordinare i servizi tramite un unico runtime e riavviare un processo frammentato durante la manutenzione invece di aspettare che una richiesta utente fallisca.
Se un riavvio pulito non consente al modello di rientrare nella memoria disponibile, il problema principale è probabilmente una capacità realmente insufficiente, non la frammentazione accumulata. Riduci le dimensioni del modello, l’occupazione dovuta alla quantizzazione, il contesto, il batch o le allocazioni concorrenti.
Hub Tecnologico e AI
Altro da leggere

Perché le previsioni della casa intelligente diventano meno accurate dopo i cambiamenti stagionali delle abitudini?
Le routine stagionali cambiano il rapporto tra tempo, sensori, presenza e azioni desiderate, rendendo obsoleto un modello addestrato su abitudini precedenti.

Perché un NVR domestico perde gli eventi brevi quando il rilevamento degli oggetti è attivato?
Il tracciamento necessita di un numero sufficiente di rilevamenti per avviare e confermare una traiettoria, quindi un oggetto che compare solo per poco tempo...

Perché le etichette delle foto generate dall’IA cambiano dopo un aggiornamento del modello?
Un aggiornamento del modello modifica la rappresentazione e la classificazione utilizzate per assegnare le etichette, quindi la stessa foto può oltrepassare confini semantici o...

