Ce que coûte un caractère

la mesure. relevé local · 2026-09-05 · le serveur · 151 936 touches · 0 €

Le clavier de Qwen2.5 est sorti du fichier GGUF présent ici, le BPE est réécrit, et on le fait tourner sur des textes réels du dépôt. Même clavier partout : seule la matière change.

run
relevé local
date
2026-09-05
machine
le serveur, CPU
durée
2 min
coût
0 €
journal
EXPERIENCES.md

Le témoin, avant tout le reste

Une réimplémentation du BPE qui se trompe donnerait des chiffres crédibles et faux. Le contrôle : elle doit refaire à l'identique les deux découpes que le vrai tokenizer avait mesurées sur Kaggle au run-015. « Le chat noir dort sur le canapé. » → 10 jetons. « anticonstitutionnellement » → 5. Les deux tombent juste, et le script s'arrête net sinon.

assertion dans training/local/tokenisation.py · comparée au run-015

Sept matières, un seul clavier

0 1 2 3 4 page emploi · anglais 3,77 page emploi · français 3,32 code Python 3,24 prose française 2,98 HTML du site 2,87 JSON de mesures 1,93 nombres 1,00 car./jeton
Caractères par jeton. Plus la barre est longue, moins le texte coûte cher. Mêmes 151 936 touches dans les sept cas.

Sur des pages d'emploi issues du même crawl, 300 en français et 300 en anglais, la même quantité de texte coûte 3,32 caractères par jeton en français contre 3,77 en anglais. Dire la même chose en français consomme 13 % de jetons en plus — donc 13 % de fenêtre en moins, et 13 % de facture en plus chez un fournisseur.

2 × 300 pages, ~1 milli. de caractères par langue → tokenisation.json

Les nombres font exactement 1,00. Pas « environ » : chaque chiffre est un jeton, toujours. Ce n'est pas appris, c'est la règle de découpe de la page précédente qui isole les chiffres un par un. 4096 coûte 4 jetons, et un modèle qui calcule ne voit jamais un nombre comme un objet.

3 945 caractères de nombres → 3 945 jetons

Le clavier n'est pas neutre

Sur les 141 755 touches qui portent au moins une lettre, voici pour quelle écriture elles ont été dépensées :

écrituretouches%
ASCII (l'alphabet nu)88 91162,7
chinois / japonais / coréen31 08621,9
latin accentué (é, ñ, ü…)5 9754,2
cyrillique4 1422,9
arabe3 9782,8
hébreu3 1792,2
thaï2 5491,8

Le français ne se partage que 5 975 touches accentuées — avec l'espagnol, le portugais, l'allemand et le vietnamien. L'anglais a l'ASCII pour lui seul, soit 88 911. C'est l'explication des 13 % mesurés plus haut : le clavier a été fabriqué sur un corpus où le français pesait peu.

décodage des 151 936 touches du GGUF, classées par bloc Unicode

Ce que le clavier coûte en poids

Chaque touche occupe une ligne dans la table d'entrée, et une dans celle de sortie. Sur un petit modèle, ça se voit :

Pythia-160M

47,6 %

des poids sont le clavier — 50 304 touches, deux tables séparées

Qwen2.5-0.5B

27,6 %

151 936 touches, mais une seule table partagée entrée / sortie

Près de la moitié de Pythia-160M n'est pas un cerveau : c'est un annuaire. Et le modèle qui a trois fois plus de touches en dépense deux fois moins en proportion, parce qu'il réutilise la même table aux deux bouts.

tailles lues dans le GGUF et dans le config.json de Pythia

Le duel : gros clavier contre longues séquences

Le même texte — 20 000 caractères de mon journal — donne 6 712 jetons avec le clavier BPE de Qwen, et 20 000 avec le clavier caractère de mon MoE maison. Soit ×2,98 de longueur pour un clavier ×638 plus petit. Et comme l'attention grandit avec le carré de la longueur, ce ×2,98 devient ×8,9 de cases d'attention.

238 caractères (run-034/035) contre 151 936 jetons (Qwen) sur le même texte

Les cinq claviers déjà construits ici

modèlematièretouchesla règle
mini-GPT dessin (run-004b)traits QuickDraw1357 jetons de service + 64 abscisses + 64 ordonnées
mini-GPT dessin conditionné (run-006c)traits Sketchy388grille 128 + un jeton par catégorie, en tête de séquence
VQ-GPT (run-013)images 128×128513dictionnaire visuel APPRIS ; une image = 16×16 = 256 jetons
MoE maison (run-034/035)Wikipédia FR238un caractère = un jeton, s'il apparaît au moins 100 fois
Qwen2.5 (run-015…)texte151 936BPE octet : les paires fréquentes fusionnent, 151 387 fois

Le texte a des unités naturelles ; un dessin, non — il a fallu les inventer (une grille de coordonnées) ; une image, non plus — au run-013 c'est le modèle qui a appris son propre alphabet de 512 codes visuels.

Ce qui n'est pas mesuré, et qui manque : l'effet de la taille du clavier sur la qualité, à corpus et budget égaux. Tout ce qui est ici décrit des coûts, pas des résultats. Le run existe en tête — mini-GPT, même largeur, vocabulaire caractère / 512 / 4 096 / 16 000, trois graines — il n'est pas lancé.

Reste la question qui vient juste après : d'accord pour la découpe, mais on lui donne quoi ? Une phrase, un texte, un livre ? La page suivante le montre en direct.