Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Compter les tokens d'un dataset avec tiktoken
Quand tu estimes le coût du fine-tuning en divisant le nombre de caractères par 4, tu obtiens une approximation. Parfois ça suffit pour une estimation rapide, mais quand tu gères un budget serré ou que tu prépares un rapport pour ton manager, tu veux le chiffre exact.
La bibliothèque tiktoken te donne le comptage exact des tokens, exactement comme OpenAI les compte en interne. Le principe est simple : tu choisis l'encodeur qui correspond à ton modèle, tu lui donnes du texte, et il te dit combien de tokens ça fait.
import tiktoken
enc = tiktoken.get_encoding("cl100k_base") tokens = enc.encode("Bonjour le monde") nombre = len(tokens)
L'encodeur cl100k_base est celui utilisé par GPT-4o et GPT-4o-mini. C'est donc celui que tu utiliseras pour calculer le coût du fine-tuning de ces modèles.
Attention, pour un dataset de fine-tuning, le coût ne se calcule pas seulement sur le texte brut. OpenAI ajoute des tokens supplémentaires pour la structure des messages. Pour chaque exemple, il y a environ 4 tokens de surcoût par message (les délimiteurs de rôle), plus 2 tokens pour l'en-tête de l'exemple. C'est une approximation officielle simplifiée.
Écris une fonction compter_tokens_dataset(exemples, encoding_name="cl100k_base") qui prend une liste d'exemples au format messages et renvoie un dictionnaire avec : - "tokens_contenu" : le nombre total de tokens dans le texte de tous les messages (content uniquement) - "tokens_structure" : le surcoût structurel estimé (4 tokens par message + 2 par exemple) - "tokens_total" : la somme des deux - "cout_finetune" : le coût en dollars pour un fine-tuning à 3$/million de tokens sur 3 epochs, arrondi à 4 décimales - "par_exemple" : liste de dicts avec "index" et "tokens" (tokens de contenu par exemple)
Exemple :
data = [{"messages": [{"role": "system", "content": "Sois bref."}, {"role": "user", "content": "Salut"}, {"role": "assistant", "content": "Bonjour !"}]}] r = compter_tokens_dataset(data) r["tokens_contenu"] est le nombre exact de tokens dans les trois contenus r["tokens_structure"] vaut 4*3 + 2 = 14 r["tokens_total"] est la somme