Fonctionnement
L’inférence nécessite les poids, le cache KV et un peu de mémoire de travail :
poids = paramètres × octets par paramètre
cache KV = 2 × couches × têtes KV × dim. de tête × jetons × séquences × octets par valeur
total = (poids + cache KV) × (1 + surcoût)
Le cache KV stocke un vecteur clé et un vecteur valeur par couche et par tête KV pour chaque jeton du contexte. Les modèles à attention à requêtes groupées (GQA, la plupart des modèles récents) ont bien moins de têtes KV que de têtes d’attention. Pour Llama 3.1 8B, cela fait 128 Kio par jeton en 16 bits : un contexte de 8k coûte 1 Gio et 128k coûte 16 Gio.
Le fine-tuning complet avec Adam en précision mixte demande environ 16 octets par paramètre : poids et gradients en 16 bits (2 + 2), une copie maîtresse des poids en 32 bits (4) et deux moments Adam en 32 bits (4 + 4).
LoRA garde les poids de base figés (à n’importe quelle précision ; en 4 bits, c’est QLoRA) et entraîne de petits adaptateurs, typiquement 0.1–2 % des paramètres, à 16 octets chacun.
Ce que l’estimation ne prend pas en compte
- Les activations d’entraînement, qui croissent avec batch × longueur de séquence et sont souvent le terme le plus important ; le gradient checkpointing les échange contre du calcul.
- Les tampons propres à chaque framework. Le pourcentage de surcoût d’inférence tient lieu des activations, du contexte CUDA (~0.3–1 Go) et de la fragmentation ; 10–20 % est un bon point de départ.
- Les caches KV paginés ou déchargés (vLLM, llama.cpp) peuvent consommer moins que le pire cas à contexte plein.
Préréglages
Le nombre de couches, de têtes KV et la dimension des têtes proviennent du config.json publié pour chaque modèle. Considérez les résultats comme une estimation de planification ; mesurez sur le runtime réel avant d’acheter du matériel.