Cache KV
Scopri come KV Cache ottimizza i modelli Transformer come gli LLM. Scopri come questa tecnica riduce la latenza di inferenza e aumenta l'efficienza per Ultralytics .
La cache KV (Key-Value Cache) è una tecnica di ottimizzazione fondamentale utilizzata principalmente nei
modelli linguistici di grandi dimensioni (LLM)
e altre architetture basate su Transformer per accelerare la
latenza dell'inferenza e ridurre i
costi computazionali. Fondamentalmente, la cache KV memorizza le matrici chiave e valore generate dal
meccanismo di attenzione per i
token precedenti in una sequenza. Salvando questi calcoli intermedi, il modello evita di ricalcolare gli stati di attenzione
per l'intera cronologia della conversazione ogni volta che genera un nuovo token. Questo processo trasforma la
flusso di lavoro della generazione di testo da un'operazione di
complessità quadratica a una lineare, rendendo le interazioni in tempo reale con chatbot e
agenti AI .
Meccanismo e vantaggi
In un trasformatore standard Transformer ,
per generare la parola successiva è necessario prestare attenzione a tutte le parole precedenti per comprenderne il contesto. Senza la cache,
il modello dovrebbe ricalcolare le relazioni matematiche per l'intera sequenza ad ogni passo. La cache KV
risolve questo problema fungendo da banca dati.
-
Miglioramento della velocità: recuperando chiavi e valori precalcolati dalla memoria, il sistema accelera notevolmente
il motore di inferenza. Ciò è essenziale per le applicazioni che richiedono una bassa latenza, come l'
inferenza in tempo reale nei
bot del servizio clienti.
-
Efficienza delle risorse: sebbene aumenti l'utilizzo della memoria (VRAM), riduce significativamente la potenza di calcolo
(FLOP) richiesta per ogni token. Questo compromesso viene spesso gestito attraverso tecniche come la
quantizzazione del modello o il paging,
simili a quelle utilizzate dai sistemi operativi per gestire la RAM.
-
Contesto esteso: una gestione efficiente della cache KV consente ai modelli di gestire un contesto più ampio
finestra di contesto, consentendo loro di elaborare documenti lunghi o mantenere conversazioni coerenti per periodi prolungati.
Applicazioni nel mondo reale
La cache KV è un componente fondamentale nell'implementazione della moderna IA generativa, ma i suoi principi si estendono anche alla
visione artificiale (CV).
-
Chatbot generativi: servizi come
ChatGPT o
Claude si basano fortemente sul caching KV. Quando un utente
pone una domanda di follow-up, il modello non rilegge l'intera cronologia della chat da zero. Invece, aggiunge il
nuovo input agli stati memorizzati nella cache del turno precedente, consentendo risposte quasi istantanee.
-
Comprensione dei video:
attività di comprensione dei video , i
modelli elaborano i fotogrammi in modo sequenziale. Analogamente ai token di testo, le caratteristiche visive dei fotogrammi precedenti possono essere memorizzate nella cache per aiutare il
modello track o riconoscere le azioni senza rielaborare l'intera cronologia video. Ciò è particolarmente
rilevante per il
riconoscimento delle azioni in cui
il contesto temporale è fondamentale.
Gestione efficiente della memoria
Man mano che i modelli diventano più grandi, la dimensione della cache KV può diventare un collo di bottiglia, consumando gigabyte di GPU . I recenti
progressi si concentrano sull'ottimizzazione di questa memoria.
-
PagedAttention: Ispirato alla memoria virtuale nei sistemi operativi,
PagedAttention (introdotto da vLLM) consente alla cache KV
di essere memorizzata in blocchi di memoria non contigui. Ciò riduce la frammentazione e consente dimensioni di batch più elevate
durante il servizio del modello.
-
Quantizzazione della cache KV: per risparmiare spazio, gli sviluppatori spesso applicano
quantizzazione a precisione mista o int8
specificamente ai valori memorizzati nella cache. Ciò riduce l'ingombro di memoria, consentendo all'
ai dispositivi edge AI con RAM limitata di eseguire
modelli capaci.
-
Prompt Caching: una tecnica correlata in cui gli stati KV di un prompt di sistema statico (ad esempio, "Sei
un utile assistente di codifica") vengono calcolati una sola volta e riutilizzati in molte sessioni utente diverse. Si tratta di una
funzionalità fondamentale per l'ottimizzazione dell'
ingegneria dei prompt su larga scala
.
Distinguere i concetti correlati
È utile distinguere la cache KV dagli altri termini relativi alla cache e all'ottimizzazione:
-
Cache KV vs. Caching immediato: la cache KV
si riferisce in genere alla memoria dinamica, token per token, utilizzata durante un singolo flusso di generazione. Il caching immediato
si riferisce in particolare alla memorizzazione dello stato elaborato di un'istruzione di input fissa da riutilizzare in più
chiamate di inferenza indipendenti.
-
Cache KV vs. Embedding: Gli embedding
sono rappresentazioni vettoriali dei dati di input (testo o immagini) che catturano il significato semantico. La cache KV memorizza le
attivazioni (chiavi e valori) derivate da questi embedding all'interno dei livelli di attenzione, in particolare allo
scopo di generare sequenze.
-
Cache KV vs. Pesi del modello: I pesi del modello
sono i parametri statici appresi della rete neurale. La cache KV è costituita da dati dinamici e temporanei
generati durante il passaggio in avanti di una sequenza di input specifica.
Esempio: contesto nei modelli di visione
Sebbene il caching KV sia più famoso nell'NLP, il concetto di mantenimento dello stato si applica ai modelli di visione avanzati. Nell'
esempio seguente, simuliamo l'idea di passare lo stato (contesto) in uno scenario di tracciamento video utilizzando
Ultralytics . Qui, il tracker mantiene l'identità degli oggetti attraverso i fotogrammi, concettualmente simile a come una cache mantiene il
contesto attraverso i token.
from ultralytics import YOLO
# Load the Ultralytics YOLO26 model
model = YOLO("yolo26n.pt")
# Track objects in a video, maintaining identity state across frames
# The 'track' mode effectively caches object features to link detections
results = model.track(source="https://ultralytics.com/images/bus.jpg", show=False)
# Print the ID of the tracked objects
if results[0].boxes.id is not None:
print(f"Tracked IDs: {results[0].boxes.id.numpy()}")
Gli sviluppatori che desiderano gestire set di dati e implementare modelli ottimizzati possono utilizzare la
Ultralytics , che semplifica il processo dall'annotazione dei dati all'implementazione efficiente dei modelli
implementazione dei modelli. Per chi è interessato ai meccanismi più approfonditi dell'attenzione, librerie come
PyTorch
forniscono i blocchi fondamentali in cui sono implementati questi meccanismi di caching.