GPU per la ricerca ML · Pagamento crypto senza KYC
IteraGPU
Memoria di inferenza · Contesto e concorrenza

Quanta memoria riservare alla cache KV?

Per una cache densa uniforme, conta due tensori, K e V, per ogni layer, testa KV, posizione conservata e sequenza simultanea. Usa il formato reale della cache, non quello dei pesi. Questo calcolo fornisce il volume teorico di un posto in memoria; non prevede né il picco totale della GPU, né la latenza, né la qualità delle risposte. Verifica poi la strategia di allocazione con il tuo carico.

01 /

Descrivere ciò che resta in memoria

Durante una generazione autoregressiva, le chiavi e i valori dei token già elaborati possono essere conservati per le fasi successive. Questa cache appartiene ai layer di attenzione. Il suo volume dipende quindi dal modello e dalla cronologia conservata, non solo dal numero di parametri. Il contesto di una conversazione comprende anche le istruzioni, i messaggi precedenti e i documenti aggiunti dall'applicazione.

La tua prima decisione è operativa: quante sequenze dovranno restare attive, fino a quale lunghezza? Una coda di venti richieste di cui due eseguite simultaneamente non rappresenta necessariamente venti cache residenti. Rileva l'ammissione reale delle richieste e le eventuali sequenze aggiuntive create dalla generazione.

Prepara una scheda con la revisione del modello, i layer di attenzione, le teste KV, la dimensione delle chiavi e dei valori, il loro dtype e la strategia di cache. Conta i token dopo il tokenizer e il template di conversazione. Un limite in caratteri non descrive questa allocazione.

Fonti tecniche: Hugging Face — funzionamento e forma delle cache per layer

02 /

Usare le teste KV, in particolare con GQA

Il numero di teste di query Q e quello delle teste KV possono differire. Nell'attenzione multi-testa classica coincidono. Con MQA si condivide un'unica testa KV; GQA raggruppa più teste Q attorno a una testa KV. Leggi num_key_value_heads nella configurazione quando questo campo esiste e verifica il suo significato per l'architettura.

Per esempio, quaranta teste Q e otto teste KV formano cinque teste Q per gruppo KV. La formula del cache memorizzato usa otto, non quaranta. Questo rapporto non descrive tutta la memoria dell'attenzione: operazioni o conversioni possono produrre temporanei.

Non modificare semplicemente questo numero per ridurre il fabbisogno di memoria di un modello già addestrato. Lo schema di attenzione fa parte della sua architettura. Due modelli con numeri di teste diversi non diventano varianti equivalenti tramite un calcolo di capacità; la loro qualità va valutata separatamente.

Fonti tecniche: Hugging Face — campi LlamaConfig e distinzione MHA, MQA, GQA · PyTorch — dimensioni Q/K/V e vincoli dell'attenzione GQA

03 /

Porre la formula e le sue unità

Nel caso uniforme, L è il numero di livelli, Hkv il numero di teste KV, D la loro dimensione, T il numero di posizioni conservate per sequenza, B il numero di sequenze e q il numero di byte per valore. Il fattore due conta K e V. Questa approssimazione presuppone chiavi e valori con la stessa dimensione e lo stesso formato, senza compressione né condivisione del prefisso.

Converti solo il risultato finale: un GiB vale 1 073 741 824 byte; un GB decimale vale 1 000 000 000 byte. Mantieni i byte nella tua scheda per evitare che un arrotondamento o un cambio di unità mascheri una differenza.

Per lunghezze diverse senza padding, sostituisci B × T con la somma delle posizioni effettivamente memorizzate. Per livelli eterogenei, fai una somma livello per livello. Una memorizzazione densa con padding, un'allocazione a blocchi o una prenotazione statica richiedono di contare gli slot allocati, che possono superare i token utili.

KV teorico (byte) = 2 × L × Hkv × D × T × B × q ; KV (GiB) = KV (byte) ÷ 1 073 741 824

Fonti tecniche: Hugging Face — dimensioni dei tensori del cache · NIST — unità decimali e prefissi binari

04 /

Esempio pratico: sei sequenze, senza misurazione della GPU

Prendiamo un'architettura fittizia di quaranta livelli, otto teste KV e una dimensione di 128. Supponiamo un cache uniforme con due byte per valore. Ogni sequenza riceve al massimo 3 072 token di input e una prenotazione per 1 024 token aggiuntivi, ovvero un limite di 4 096 posizioni. Sono ipotesi didattiche, non la configurazione attestata di un modello.

Il costo calcolato per posizione e per sequenza è 2 × 40 × 8 × 128 × 2 = 163 840 byte. Una sequenza di 4 096 posizioni rappresenta quindi 671 088 640 byte, ovvero 0,625 GiB. Sei sequenze danno 4 026 531 840 byte, cioè 3,75 GiB per il solo cache.

Raddoppiare la lunghezza conservata raddoppia questa voce in tale formula. Sostituire otto teste KV con quaranta la moltiplica per cinque, ferme restando tutte le altre ipotesi. Queste proporzioni non annunciano alcuna accelerazione, perdita di qualità o compatibilità di un modello reale.

Solo aritmetica teorica: L = 40, D = 128, q = 2 byte; pesi e temporanei esclusi.
Sequenze BPosizioni TTeste KVByte calcolatiGiB
14 0968671 088 6400,625
64 09684 026 531 8403,75
68 19288 053 063 6807,5
64 0964020 132 659 20018,75
05 /

Adattare il budget alla strategia di cache

Un cache dinamico cresce con le posizioni conservate. Un cache statico prenota una capacità massima: dimensiona quella prenotazione, non solo la richiesta breve osservata all'avvio. Per un'attenzione a finestra scorrevole, alcuni livelli possono limitare la loro cronologia; i livelli con attenzione completa richiedono un calcolo distinto.

La quantizzazione del cache e il suo offload verso la CPU sono altre strategie, dipendenti dal modello e dal software. Modificano i vincoli di memorizzazione, trasferimento o calcolo. Quantizzare i pesi non prova che il cache abbia lo stesso formato.

Annota la classe di cache e i suoi parametri espliciti. Verifica anche il rilascio degli slot dopo la fine o l'annullamento di una richiesta. Per un carico che mescola sequenze brevi e lunghe, una prenotazione massima uniforme può pesare più della sola somma dei contenuti utili.

Fonti tecniche: Hugging Face — cache dinamici, statici, quantizzati e con offload

06 /

Verificare un carico rappresentativo per fasi

Costruisci tre casi: input abituale, input lungo previsto e numero massimo di richieste simultanee consentito. Fissa modello, tokenizer, template, limite di generazione e regola di fine. Fai variare una dimensione alla volta; una risposta accorciata o un documento troncato cambia il lavoro svolto.

Misura separatamente caricamento, elaborazione iniziale dell'input e generazione. Sincronizza il device attorno alle fasi cronometrate, conserva i livelli di memoria iniziali e i picchi. Il metodo della memoria spiega perché allocated e reserved non si sommano e perché la differenza dei loro massimi non isola la cache.

Il tuo controllo deve portare a un limite testato e a output accettabili: ID delle richieste completate, errori, lunghezza prodotta e criterio di qualità. Un lancio che regge su un input breve non convalida la concorrenza massima. Un errore di memoria prima della fine non costituisce una misura del fabbisogno di un'esecuzione completa.

Fonti tecniche: PyTorch — sincronizzazione del lavoro sul device scelto · PyTorch — perimetro dei contatori di memoria

07 /

Escludere gli errori che falsano la scelta

Non trasformare la cache calcolata in capacità GPU totale. Aggiungi un'analisi dei pesi, delle attivazioni temporanee, degli output conservati e del software. Non dividere neppure questo volume automaticamente per il numero di schede: il posizionamento dei layer o delle teste deve essere realmente configurato e verificato su ogni device.

Il notebook IteraGPU Lab è un esercizio di strumentazione su una piccola rete densa senza attention. Aiuta a leggere le fasi di memoria; il suo parametro context non convalida questo calcolo KV. Usa la scheda di carico e la cartella inferenza per preparare il test del tuo modello.

Confronta le capacità delle offerte solo dopo aver distinto il volume aritmetico, il massimo realmente osservato e i casi ancora non testati. Il forfait di noleggio organizza la tua finestra di lavoro; non garantisce alcuna lunghezza di contesto né cadenza di generazione.

  • Confondere teste Q e teste KV: riprendi la configurazione dell'architettura.
  • Budgetare solo il prompt: integra la generazione e la prenotazione effettiva.
  • Leggere «pesi 4 bit» come «cache 4 bit»: rileva entrambi i formati.
  • Dimenticare la concorrenza: conta le sequenze realmente residenti.
  • Promettere memoria condivisa tra schede: verifica il posizionamento reale.

Domande pratiche

Posso conoscere la cache KV dal solo numero di parametri?

No. Servono anche l'architettura dei layer di attention, le teste KV, le loro dimensioni, il formato della cache, le posizioni conservate e le sequenze residenti. Due modelli di dimensione simile possono richiedere budget KV diversi.

Una cache statica consuma solo la lunghezza della mia richiesta?

Bisogna dimensionare la sua capacità riservata. Una richiesta breve non permette di dedurre questa allocazione massima. Rileva i parametri della cache e misura la configurazione effettivamente creata.

Il risultato della formula basta per scegliere una scheda?

Stima unicamente la cache secondo ipotesi dichiarate. La scelta deve tenere conto anche delle altre voci di memoria, della compatibilità software e di un test completo con contesto, concorrenza e qualità rappresentativi.