Chunked Prefill
Scopri come il prefill suddiviso in chunk migliora la latenza e il throughput dell'inferenza degli LLM dividendo i prompt lunghi in blocchi di token per un serving più fluido con carichi di lavoro concorrenti.
Il prefill a blocchi è una tecnica di pianificazione dell'inferenza che suddivide un prompt di input lungo in gruppi più piccoli di token invece di elaborare l'intero prompt in un'unica operazione ininterrotta. Un motore di inferenza può alternare questi blocchi alla generazione di token per altre richieste, impedendo che un prompt lungo monopolizzi la GPU. Il risultato è in genere una latenza più uniforme con carichi di lavoro concorrenti, un migliore utilizzo dell'hardware e un servizio più prevedibile per le applicazioni interattive basate su modelli linguistici di grandi dimensioni.
Come funziona il prefill a blocchi#
L'inferenza autoregressiva con Transformer prevede due fasi principali:
- Prefill: Il modello elabora tutti i token di input, calcola i relativi stati di attenzione e popola la cache KV. Il prefill valuta molti token in parallelo ed è solitamente vincolato dalla capacità di calcolo.
- Decodifica: Il modello genera l'output un token alla volta leggendo gli stati memorizzati in cache. La decodifica è spesso limitata dalla larghezza di banda della memoria anziché dalla capacità di calcolo pura.
Senza suddivisione in blocchi, una richiesta di 20.000 token può occupare un passaggio di inferenza molto più a lungo di una richiesta breve. Le generazioni attive possono quindi subire pause, aumentando la latenza tra i token anche se i relativi prompt sono brevi.
Con il prefill a blocchi, lo scheduler assegna a ogni iterazione un budget di token. Pianifica innanzitutto le operazioni di decodifica attive, quindi utilizza il budget rimanente per uno o più blocchi del prompt. Se un prompt non entra nel budget, i token rimanenti attendono un'iterazione successiva. Le attuali indicazioni sull'ottimizzazione di vLLM descrivono questo approccio come un modo per combinare il lavoro di prefill ad alta intensità di calcolo con la decodifica ad alta intensità di memoria.
La suddivisione in blocchi modifica il momento in cui vengono elaborati i token del prompt, non il loro ordine o significato. Ogni blocco completato estende lo stato di attenzione memorizzato nella cache della richiesta finché il prompt completo non è pronto e può iniziare la decodifica.
Perché il prefill a blocchi è importante#
Il prefill a blocchi affronta obiettivi di prestazioni in competizione tra loro nella distribuzione dei modelli in produzione:
- Latenza tra i token: Dare priorità alle richieste di decodifica già esistenti aiuta le risposte trasmesse in streaming a proseguire senza pause prolungate.
- Tempo al primo token: I blocchi grandi completano prima un nuovo prompt, mentre blocchi molto piccoli possono ritardare il primo token generato.
- Throughput: La combinazione del lavoro di prefill e decodifica può utilizzare in modo più efficace la capacità di calcolo della GPU e la larghezza di banda della memoria.
- Equità: È meno probabile che i prompt lunghi blocchino molte richieste brevi e interattive.
L'impostazione del blocco o del budget di token rappresenta quindi un compromesso. La configurazione dello scheduler di vLLM espone controlli per i limiti dei token elaborati in batch, i prefill parziali e le soglie per i prompt lunghi. I budget più piccoli favoriscono generalmente una decodifica reattiva, mentre quelli più grandi favoriscono un'acquisizione più rapida del prompt.
La suddivisione in blocchi non elimina ogni collo di bottiglia. I contesti lunghi consumano comunque memoria della cache e un'ammissione eccessivamente aggressiva può causare pressione sulla cache, prelazione delle richieste o lavoro ripetuto. Gli operatori devono misurare la latenza dell'inferenza mediana e di coda, il tempo al primo token, la latenza tra i token, il throughput e l'utilizzo della memoria della GPU con distribuzioni realistiche dei prompt.
Concetti correlati sull'inferenza#
Il prefill a blocchi è strettamente collegato a diverse ottimizzazioni, ma ha uno scopo distinto:
- Batching continuo: Aggiunge e rimuove dinamicamente le richieste durante la generazione. Il prefill a blocchi lo completa rendendo pianificabile l'elaborazione dei prompt lunghi a livello dei confini dei token.
- Caching dei prompt: Riutilizza gli stati calcolati in precedenza per un prefisso di prompt ripetuto. Il prefill a blocchi pianifica nuovi calcoli, non li evita.
- Gestione della cache KV paginata: Organizza gli stati di attenzione memorizzati in blocchi di memoria. La panoramica di TensorRT-LLM di NVIDIA include il caching paginato e il batching in volo insieme alle ottimizzazioni per l'elaborazione dei prompt.
- Batching dinamico: Combina richieste separate in batch, come spiegato nella guida al batching dinamico di NVIDIA Triton. Non suddivide necessariamente un singolo prompt lungo in prefill parziali.
- Prefill e decodifica disaggregati: Esegue le fasi su worker separati. Le indicazioni di NVIDIA per la distribuzione di prefill e decodifica mostrano invece come sia possibile scalare le fasi in modo indipendente.
Sebbene il flusso di lavoro di distribuzione di Ultralytics YOLO26 con Triton supporti l'inferenza scalabile per la visione artificiale e il batching automatico, il rilevamento standard degli oggetti con YOLO non prevede una fase autoregressiva di prefill testuale. Il prefill a blocchi si applica principalmente ai modelli generativi linguistici e multimodali.
Applicazioni nel mondo reale#
-
Assistenti per documenti: Un assistente con recupero aumentato può ricevere un report lungo mentre serve contemporaneamente utenti con domande brevi. Suddividere in blocchi il prefill del report consente alle conversazioni in corso di continuare la decodifica invece di bloccarsi finché non viene elaborato l'intero contesto.
-
Analisi video multimodale: Un modello visione-linguaggio può ricevere caratteristiche delle immagini, descrizioni degli oggetti e una lunga istruzione testuale. Una pipeline di visione può prima produrre i rilevamenti usando la predizione di Ultralytics YOLO, quindi inviare il contesto visivo strutturato al modello generativo. Il prefill a blocchi aiuta a pianificare i token visivi e testuali risultanti insieme alle altre richieste. Il flusso di lavoro multimodale di codifica-prefill-decodifica di NVIDIA illustra perché la gestione indipendente di queste fasi può migliorare la scalabilità.
Indicazioni pratiche per la distribuzione#
Abilita il prefill a blocchi solo tramite un motore di serving che supporti ufficialmente l'architettura di destinazione. Ad esempio, la configurazione del backend TensorRT-LLM documenta i controlli del contesto suddiviso in blocchi per le distribuzioni supportate.
Esegui benchmark con concorrenza, lunghezze di input e lunghezze di output realistiche invece di basarti su una singola richiesta. Inizia con il budget di token consigliato dal runtime, quindi modificalo monitorando il tempo al primo token e la latenza tra i token. Infine, testa carichi di lavoro misti che contengano prompt molto lunghi e molto brevi; è in questo scenario che il prefill a blocchi offre il suo valore operativo più evidente.









