KV Cache
Scopri come la KV Cache ottimizza i modelli Transformer come gli LLM. Scopri come questa tecnica riduce la latenza dell'inferenza e migliora l'efficienza di Ultralytics YOLO26.
KV Cache (cache chiave-valore) è una tecnica di ottimizzazione fondamentale, utilizzata soprattutto nei modelli linguistici di grandi dimensioni (LLMs) e in altre architetture basate su Transformer per accelerare la latenza di inferenza e ridurre i costi computazionali. In sostanza, la KV cache memorizza le matrici Key e Value generate dal meccanismo di attenzione per i token precedenti di 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 il flusso di lavoro della generazione del testo da un’operazione a complessità quadratica a una lineare, rendendo possibili le interazioni in tempo reale con chatbot e agenti IA.
Meccanismo e vantaggi#
In un modello Transformer standard, per generare la parola successiva occorre prestare attenzione a tutte quelle precedenti per comprendere il contesto. Senza memorizzazione nella cache, il modello dovrebbe ricalcolare le relazioni matematiche dell’intera sequenza a ogni passaggio. La KV cache risolve il problema fungendo da memoria.
- Miglioramento della velocità: Recuperando dalla memoria chiavi e valori precalcolati, il sistema accelera notevolmente il motore di inferenza. Questo è essenziale per le applicazioni che richiedono una latenza ridotta, come l’inferenza in tempo reale nei bot di assistenza clienti.
- Efficienza delle risorse: Sebbene aumenti l’uso della memoria (VRAM), riduce significativamente il calcolo (FLOPs) richiesto per token. Questo compromesso viene spesso gestito con tecniche come la quantizzazione del modello o il paging, in modo simile alla gestione della RAM da parte dei sistemi operativi.
- Contesto esteso: Una gestione efficiente della KV cache consente ai modelli di gestire una finestra di contesto più ampia, permettendo loro di elaborare documenti lunghi o mantenere conversazioni coerenti per periodi prolungati.
Applicazioni nel mondo reale#
La KV cache è un componente fondamentale per distribuire l’IA generativa moderna, ma i suoi principi si applicano anche alla visione artificiale (CV).
-
Chatbot generativi: Servizi come ChatGPT o Claude fanno ampio affidamento sulla KV cache. Quando un utente pone una domanda di approfondimento, il modello non rilegge da zero l’intera cronologia della chat. Aggiunge invece il nuovo input agli stati memorizzati nella cache del turno precedente, consentendo risposte quasi istantanee.
-
Comprensione dei video: Nelle attività di comprensione dei video, i modelli elaborano i fotogrammi in sequenza. Come i token di testo, le caratteristiche visive dei fotogrammi precedenti possono essere memorizzate nella cache per aiutare il modello a tracciare gli oggetti o riconoscere le azioni senza rielaborare l’intera cronologia del video. Ciò è particolarmente utile per il riconoscimento delle azioni, in cui il contesto temporale è fondamentale.
Gestione efficiente della memoria#
Man mano che i modelli crescono, le dimensioni della KV cache possono diventare un collo di bottiglia, consumando gigabyte di memoria GPU. I progressi recenti si concentrano sull’ottimizzazione di questa archiviazione.
- PagedAttention: Ispirato alla memoria virtuale dei sistemi operativi, PagedAttention (introdotto da vLLM) consente di archiviare la KV cache in blocchi di memoria non contigui. Ciò riduce la frammentazione e permette batch di dimensioni maggiori durante la distribuzione dei modelli.
- Quantizzazione della KV cache: Per risparmiare spazio, gli sviluppatori applicano spesso la precisione mista o la quantizzazione int8 specificamente ai valori memorizzati nella cache. Questo riduce l’ingombro in memoria, consentendo ai dispositivi di IA edge con RAM limitata di eseguire modelli performanti.
- Prompt caching: Tecnica correlata in cui gli stati KV di un prompt di sistema statico (ad esempio, «Sei un assistente di programmazione disponibile») vengono calcolati una sola volta e riutilizzati in diverse sessioni utente. È una funzionalità fondamentale per ottimizzare su larga scala i flussi di lavoro di prompt engineering.
Distinguere i concetti correlati#
È utile distinguere la KV cache da altri termini relativi alla memorizzazione nella cache e all’ottimizzazione:
- KV cache vs. prompt caching: La KV cache si riferisce in genere alla memoria dinamica, token per token, usata durante una singola generazione. Il prompt caching indica specificamente l’archiviazione dello stato elaborato di un’istruzione fissa, da riutilizzare in più chiamate di inferenza indipendenti.
- KV cache vs. embedding: Gli embedding sono rappresentazioni vettoriali dei dati di input (testo o immagini) che ne catturano il significato semantico. La KV cache memorizza le attivazioni (chiavi e valori) derivate da questi embedding nei livelli di attenzione, specificamente per generare sequenze.
- KV cache vs. pesi del modello: I pesi del modello sono i parametri appresi e statici della rete neurale. La KV cache è composta da dati dinamici e temporanei generati durante il passaggio in avanti di una specifica sequenza di input.
Esempio: contesto nei modelli di visione#
Sebbene la KV cache sia particolarmente nota nell’NLP, il concetto di mantenere uno stato si applica anche ai modelli di visione avanzati. Nell’esempio seguente, simuliamo l’idea di passare uno stato (contesto) in uno scenario di tracciamento video usando Ultralytics YOLO26. Qui, il tracker mantiene l’identità degli oggetti tra i fotogrammi, in modo concettualmente simile a come una cache mantiene il contesto tra 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 distribuire modelli ottimizzati possono usare la Ultralytics Platform, che semplifica la pipeline dall’annotazione dei dati alla distribuzione efficiente dei modelli. Chi è interessato ai meccanismi più approfonditi dell’attenzione può trovare in librerie come PyTorch i blocchi fondamentali in cui vengono implementati questi meccanismi di memorizzazione nella cache.









