Chapitre 1 : Optimisation de l'inférence
Cache KV
Stockez les paires clé-valeur calculées pour éviter le recalcul :
# Sans cache KV : recalculer tous les KV pour chaque nouveau jeton
# Avec cache KV : calculer uniquement les KV pour le nouveau jeton
class KVCache:
def __init__(self, max_batch, max_seq, num_heads, head_dim):
self.k_cache = torch.zeros(max_batch, num_heads, max_seq, head_dim)
self.v_cache = torch.zeros(max_batch, num_heads, max_seq, head_dim)
def update(self, k, v, position):
self.k_cache[:, :, position] = k
self.v_cache[:, :, position] = v
Décodage spéculatif
Utilisez un petit modèle pour rédiger, un grand modèle pour vérifier :
# 1. Rédiger : Le petit modèle génère N jetons rapidement
# 2. Vérifier : Le grand modèle vérifie tous les N jetons en parallèle
# 3. Accepter les jetons correspondants, régénérer à partir de la première divergence
Regroupement continu
Traitez plusieurs requêtes simultanément :
| Stratégie | Débit | Latence |
|---|---|---|
| Statique | Faible | Consistante |
| Continu | Élevé | Variable |