Vous êtes dans un entretien d'ingénieur en IA chez OpenAI. L'intervieweur demande : "Notre modèle GPT génère 100 tokens en 42 secondes. Comment le rendre 5 fois plus rapide ?" Vous : "Je vais allouer plus de GPU pour une génération plus rapide." Entretien terminé. Voici ce que vous avez manqué :
Le véritable goulot d'étranglement n'est pas le calcul, c'est le calcul redondant. Sans mise en cache KV, votre modèle recalculera les clés et les valeurs pour chaque jeton, répétant ainsi le travail. - avec mise en cache KV → 9 secondes - sans mise en cache KV → 42 secondes (~5x plus lent) Plongeons pour comprendre comment cela fonctionne !
Pour comprendre la mise en cache KV, nous devons savoir comment les LLMs produisent des tokens. - Le Transformer produit des états cachés pour tous les tokens. - Les états cachés sont projetés dans l'espace vocabulaire. - Les logits du dernier token sont utilisés pour générer le token suivant. - Répétez pour les tokens suivants. Vérifiez ceci👇
Ainsi, pour générer un nouveau jeton, nous avons seulement besoin de l'état caché du jeton le plus récent. Aucun des autres états cachés n'est requis. Ensuite, voyons comment le dernier état caché est calculé au sein de la couche transformateur à partir du mécanisme d'attention.
Lors de l'attention : La dernière ligne du produit requête-clé implique : - le dernier vecteur de requête. - tous les vecteurs de clé. De plus, la dernière ligne du résultat final d'attention implique : - le dernier vecteur de requête. - tous les vecteurs de clé et de valeur. Vérifiez cette visualisation pour mieux comprendre :
L'insight ci-dessus suggère que pour générer un nouveau token, chaque opération d'attention dans le réseau n'a besoin que de : - le vecteur de requête du dernier token. - tous les vecteurs de clé et de valeur. Mais, il y a un autre insight clé ici.
Alors que nous générons de nouveaux tokens : - Les vecteurs KV utilisés pour TOUS les tokens précédents ne changent pas. Ainsi, nous n'avons besoin de générer qu'un vecteur KV pour le token généré une étape auparavant. Le reste des vecteurs KV peut être récupéré à partir d'un cache pour économiser des ressources et du temps.
Cela s'appelle la mise en cache KV ! Pour réitérer, au lieu de calculer de manière redondante les vecteurs KV de tous les tokens de contexte, mettez-les en cache. Pour générer un token : - Générez le vecteur QKV pour le token généré une étape auparavant. - Obtenez tous les autres vecteurs KV depuis le cache. - Calculez l'attention. Vérifiez ceci👇
Le caching KV accélère l'inférence en calculant le cache KV du prompt avant de générer des tokens. C'est exactement pourquoi ChatGPT met plus de temps à générer le premier token que les autres. Ce délai est connu sous le nom de temps jusqu'au premier token (TTFT). Améliorer le TTFT est un sujet pour un autre jour !
204