Aller au contenu

Training SLMs (6) - La taille ne fait pas tout.

La taille importe peu. Regarde-moi. Est-ce par ma taille que tu peux me juger ?
Qwen 3.5 0.8B(ou Yoda dans l'Empire Contre-Attaque, je ne sais plus)

Le log précédent s’est terminé sur un aveu : pendant que je montais toute une machinerie d’annotation et d’arbitrage pour comparer mon petit modèle à Claude Opus 5, le meilleur résultat du projet dormait déjà dans mon dossier de résultats. J’avais noté ce modèle-là avec l’ancienne règle, celle de 30 cas dont le log #4 a raconté l’enterrement. Il y affichait 21/30, un chiffre parfaitement moyen, coincé dans le bruit avec tous les autres. Je l’avais rangé mentalement dans la case “plafonne comme les copains” et je n’y étais jamais revenu.

Il fallait donc tout renoter. Et là, deux surprises : une bonne, et une qui m’a obligé à retirer la conclusion de l’article précédent. Oui, encore une fois (à lire en chantant). Je commence à croire que c’est la seule chose que ce projet produise de façon fiable.

Un résultat entièrement gratuit

Voici la situation. J’ai douze adaptateurs entraînés depuis les logs #3 et #4. Ils ont tous été notés à l’époque, mais sur l’ancien jeu de test de 30 cas. Renoter ne demande aucun entraînement. C’est de l’inférence pure, quelques minutes par modèle, et ça produit d’un coup une courbe complète sur l’axe des tailles avec les catégories séparées. Ça m’a coûté un après-midi et un script.

Une précaution avant tout chiffre : ces douze adaptateurs ont été entraînés à des époques différentes du projet, sur des corpus qui ont bougé. Avant d’écrire quoi que ce soit, il est vérifié qu’aucun des 68 commits du jeu de test n’apparaît dans les 824 paires d’entraînement, ni dans le fichier de validation. Un modèle qui aurait vu ces réponses ferait un score magnifique… et on n’y verrait que du feu.

Le meilleur score du projet change de main

Catégorie S-135M G-270M S-360M Q-0.8B S-1.7B Opus 5
chore 16/17 15/17 16/17 16/17 15/17 12/17
fix 12/16 11/16 9/16 13/16 12/16 8/16
feat 5/13 4/13 4/13 7/13 7/13 9/13
refactor 1/6 0/6 0/6 3/6 0/6 5/6
autres 7/16 8/16 6/16 12/16 10/16 13/16
DIALECTE (chore+fix) 28/33 26/33 25/33 29/33 27/33 20/33
JUGEMENT (feat+refactor) 6/19 4/19 4/19 10/19 7/19 14/19
Total 41/68 38/68 35/68 51/68 44/68 47/68

La ligne “autres” regroupe test, perf, docs et style, soit 16 cas, que je ne sépare pas ici pour garder le tableau lisible. Les deux lignes en gras sont les regroupements de l’article précédent : le dialecte, ces conventions maison qu’aucun modèle ne peut deviner, et le jugement, cette lecture de l’intention que je croyais impossible avant de la mesurer.

Et donc : Qwen 3.5 0.8B, fine-tuné sur mes commits, marque 51/68. Claude Opus 5 en marque 47.

Un modèle de 800 millions de paramètres qui tourne sur une carte graphique de 2019, entraîné pendant une heure et quarante-huit minutes sur 824 de mes propres commits, bat un modèle frontière sur ma tâche. Sur ma tâche, et uniquement sur ma tâche, restons réalistes : demandez-lui n’importe quoi d’autre et il vous répondra n’importe quoi. Mais c’est très exactement la thèse que ce projet existe pour tester, et c’est le genre de résultat qui justifie six articles.

Ce que le résultat agrégé cache

Maintenant, la ligne du total, lue seule : 41, 38, 35, 51, 44. En ignorant les deux creux, ça monte. La conclusion s’écrit toute seule, et elle est nulle : plus c’est gros, mieux c’est.

Les deux lignes en gras racontent une tout autre histoire.

Le dialecte est plat. 28, 26, 25, 29 sur 33. Entre mon plus petit modèle et un modèle six fois plus gros, l’écart est d’un cas. Le 135M apprend mes conventions maison aussi bien que n’importe qui d’autre dans ce tableau, et il les apprend nettement mieux que Claude Opus 5, qui plafonne à 20/33 parce que ces conventions ne sont écrites nulle part et qu’il n’y a rien à deviner.

Le jugement est toute la différence. 6, 4, 4, 10 sur 19, et le modèle frontière est encore loin devant à 14.

Sur les +10 cas que Qwen prend au 135M, exactement +1 vient du dialecte. Tout le reste vient du jugement et des catégories groupées. Ce qui veut dire que la belle courbe montante de la dernière ligne mesure principalement une chose, et que cette chose n’est pas celle que le 135M existe pour faire. Le petit modèle est déjà au maximum de ce que le fine-tuning a à offrir. Acheter des paramètres, ici, n’achète pas plus de dialecte, parce qu’il n’y a plus de dialecte à acheter.

“L’échelle achète le jugement” : c’était faux

Voilà, j’avais mon titre, ma thèse et ma jolie formule de l’article 5. Le fine-tuning achète le dialecte, l’échelle achète le jugement. Le tableau ci-dessus la confirme sur toute la ligne.

Sauf qu’il y a un défaut dans ce tableau, et il est de taille : ce n’est pas un axe de tailles. C’est un axe de tailles et de familles. SmolLM2 pour le 135M et le 360M, Gemma pour le 270M, Qwen pour le 0.8B. Donc “le 0.8B gagne” et “Qwen est un meilleur modèle de base” produisent rigoureusement le même tableau, et rien là-dedans ne permet de les séparer.

Il n’y a qu’une façon de trancher : faire varier la taille sans changer de famille. SmolLM2-1.7B, même corpus, même recette, mêmes 3 époques, même rang 16. Le seul paramètre qui bouge est le nombre de paramètres.

SmolLM2, même famille 135M 360M 1.7B
DIALECTE 28/33 25/33 27/33
JUGEMENT 6/19 4/19 7/19
Total 41/68 35/68 44/68

Multiplier les paramètres par 12,6 rapporte 3 cas, et le chemin n’est même pas monotone : le 360M est le pire des trois. Le jugement fait 6, puis 4, puis 7 sur 19, ce qui sur dix-neuf cas est une ligne plate avec du bruit dessus. Et le 1.7B ne trouve jamais un seul refactor, 0/6, comme tous les SmolLM2 avant lui, là où le Qwen deux fois plus petit en trouve 3.

Donc un modèle de 1,7 milliard de paramètres se fait battre par un modèle de 800 millions. Ma formule de l’article précédent ne survit pas : ce n’est pas la taille qui achète le jugement.

Le levier, c’est le modèle de base

La version corrigée : le fine-tuning achète le dialecte, et un meilleur pré-entraînement achète le jugement.

Ce qui distingue Qwen des SmolLM2 ici, ce n’est pas sa taille, c’est ce qu’il a lu avant que je m’en mêle. Quelque chose dans son pré-entraînement lui permet de reconnaître un refactor, une chose que trois autres familles ne font jamais, à aucune taille. Je ne sais pas ce que c’est. C’est d’ailleurs la question la moins chère et la plus intéressante qui reste ouverte dans ce projet : six cas de refactor, quatre familles, allez voir ce qui se passe.

Et notez que la moitié de la formule sort renforcée plutôt qu’abîmée. Le dialecte est plat sur un facteur 12,6 en taille et sur trois familles différentes. Ce n’est plus une observation, c’est une propriété : mes conventions maison s’apprennent au plancher de l’axe des tailles, et rien de ce que j’ai essayé n’en achète davantage.

Tester sa propre prédiction : le 4B

Un raisonnement qui ne fait que ranger les résultats déjà obtenus ne vaut pas grand-chose. Le mien fait une prédiction vérifiable : si le levier est le modèle de base et non le nombre de paramètres, alors monter en taille dans la famille Qwen ne doit rien rapporter.

Il se trouve que je peux tester ça. Qwen 3.5 4B tient sur mes 8 Go de VRAM en QLoRA, tout juste. Même corpus, mêmes 3 époques, même rang 16, même longueur maximale. Cinq fois les paramètres du 0.8B.

Ce que fait un 4B sans entraînement

Avec la réflexion coupée (cf article 2) : format 68/68, type 28/68.

DIALECTE JUGEMENT Total
4B non entraîné 5/33 18/19 28/68
135M fine-tuné 28/33 6/19 41/68
0.8B fine-tuné 29/33 10/19 51/68
Claude Opus 5, zéro entraînement 20/33 14/19 47/68

Ce 18/19 en jugement, qui bat le modèle frontière, est un mirage complet, et c’est la troisième fois que la même colonne de contrôle me sauve. Le 4B répond feat ou refactor pour 55 cas sur 68, alors que ces deux catégories n’en contiennent que 19. Sa précision sur feat est de 12 sur 34. Il n’a aucun jugement, il a un a priori massivement orienté “nouvelle fonctionnalité” qui tombe par construction sur les deux catégories que j’ai regroupées sous ce nom. Pour comparaison, Claude Opus 5 place 29 de ses 68 réponses dans ces catégories, pour une précision de 9 sur 15.

Trois fois, donc, que la répartition des prédictions attrape le même artefact : le Qwen non entraîné qui marquait 11/13 sur feat en répondant feat 52 fois sur 68, la fausse régression du 135M dont le feat tombe de 8/13 à 4/13 quand on lui donne plus de données alors qu’il s’agit de son effondrement qui se dissout, et celui-ci. Un score par catégorie sans la distribution des réponses à côté est un chiffre qu’on ne peut pas lire, et je ne le répéterai plus après cet article, promis.

Ce que ce modèle montre vraiment tient en trois lignes :

  • Le format est gratuit à 4B. 68/68 sans entraînement, là où le 135M, le 270M, le 360M et le 1.7B font tous 0/68 et ont besoin du fine-tuning pour produire ne serait-ce qu’une ligne analysable.
  • 28/68 passe au-dessus de la stratégie idiote qui répond chore à tout et en marque 17. Le 0.8B non entraîné, lui, n’y arrivait pas avec ses 13/68.
  • fix à 0 sur 16 est la case la plus parlante du projet. Il lit treize commits de correction comme des feat. Mon corpus est majoritairement fait de correctifs, parce que ce sont quatre dépôts Rust en maintenance, et l’a priori du modèle est orienté fonctionnalité.

Donc la frontière fix/feat est du dialecte, et la capacité brute ne la fournit à aucune taille mesurée. Un modèle de 4 milliards de paramètres sorti du carton connaît la grammaire et ignore mes habitudes. C’est la même conclusion que celle tirée avec Claude Opus 5 dans l’article précédent, obtenue avec un modèle situé deux ordres de grandeur plus bas, et c’est à peu près tout ce que ce projet peut produire comme corroboration.

Le 4B entraîné : la question de l’échelle est close

Modèle DIALECTE JUGEMENT Total
SmolLM2-135M 28/33 6/19 41/68
Qwen 3.5 0.8B 29/33 10/19 51/68
SmolLM2-1.7B 27/33 7/19 44/68
Qwen 3.5 4B 28/33 9/19 49/68

49 contre 51. Le 4B est nominalement moins bon que le modèle cinq fois plus petit, et les deux ne diffèrent que sur 12 cas, 7 à 5, soit p = 0,774 au test de McNemar exact. Autrement dit : rigoureusement rien. Cinq fois les paramètres n’ont acheté aucune différence mesurable.

Le prix, lui, est parfaitement mesurable : 25,7 heures d’entraînement contre 1,8. Et pas parce que le modèle est cinq fois plus gros, une mise à l’échelle naïve depuis le 0.8B prédisait environ 6 heures. Le reste vient de la mémoire : 7,23 Go de pic sur les 8 disponibles. Avec 250 Mo de marge, l’allocateur passe son temps à libérer et réallouer au lieu de réutiliser ses blocs. Le plafond réel d’une carte n’est pas la mémoire qu’un modèle réclame, c’est celle qu’il lui reste, et le symptôme n’est pas une erreur de mémoire insuffisante, c’est une lenteur silencieuse. Une journée entière de calcul pour deux cas de moins.

L’axe va donc maintenant de 135M à 4B, soit un facteur 30, et le meilleur score est à 800 millions de paramètres. Rien au-dessus n’aide.

Ce que le fine-tuning a fait au 4B

C’est de loin l’illustration la plus nette de toute cette série, parce que pour une fois on voit les deux moitiés du même modèle.

Qwen 3.5 4B Non entraîné Fine-tuné
chore 5/17 16/17
fix 0/16 12/16
feat 12/13 7/13
DIALECTE 5/33 28/33
JUGEMENT 18/19 9/19
Total 28/68 49/68

Le fine-tuning a installé mon dialecte et écrasé l’a priori générique. Le fix passe de zéro sur seize à douze sur seize. Le chore de cinq à seize sur dix-sept.

Et le feat qui dégringole de 12/13 à 7/13 n’est pas un dégât collatéral, c’est le mirage qui se dissipe : ce 12/13 était obtenu en répondant feat ou refactor à 55 cas sur 68. L’entraînement a remplacé un a priori bancal par un a priori calibré, et le total est monté de 28 à 49 dans l’opération. On ne voit jamais aussi bien ce que le fine-tuning achète que sur un modèle assez gros pour avoir déjà une opinion, et qu’on force à changer d’avis.

Et maintenant ?

Bilan : le meilleur modèle du projet est un Qwen 0.8B qui traînait dans mes fichiers, il bat un modèle frontière sur ma tâche, et la formule que j’avais fièrement publiée dans l’article précédent était fausse dans sa moitié la plus vendeuse.

La consigne pour la suite est claire et un peu austère : n’achetez pas de paramètres. Sur 30x d’écart, le meilleur point est à 0,8 milliard, et le suivant coûte une journée de GPU pour rendre deux cas. Si le levier est le modèle de base, le point de mesure intéressant est une autre famille à taille comparable, pas la même famille en plus gros.

Il reste une question que j’ai soigneusement contournée depuis six articles. Tout ce qui précède est mesuré sur du Rust, mes dépôts, mes habitudes. J’ai pourtant un jeu de commits TypeScript qu’aucun modèle n’a jamais vu à l’entraînement, mis de côté depuis le tout début et attendant sagement son tour. Le prochain article le sort du placard, et il pose la seule question qui vaille sur un modèle entraîné à imiter une seule personne : est-ce que ça sert à quelque chose ailleurs ? La réponse est moitié oui, moitié franchement non, et la moitié négative est plus intéressante que l’autre.

TL;DR

  • Douze adaptateurs déjà entraînés, jamais renotés depuis que le jeu de test a changé. Les renoter ne coûte aucun entraînement et a fait changer le meilleur score du projet de main.
  • Qwen 3.5 0.8B fine-tuné marque 51/68, contre 47/68 pour Claude Opus 5. Un modèle de 800M entraîné une heure quarante-huit sur une carte de 2019 bat un modèle frontière, sur cette tâche et seulement sur elle.
  • Le dialecte est plat sur l’axe des tailles, 28 à 29 sur 33 du 135M au 0.8B. Le jugement fait toute la différence. Sur les 10 cas que Qwen prend au 135M, un seul vient du dialecte.
  • “L’échelle achète le jugement” est faux. SmolLM2-1.7B, même famille et même recette, marque 44/68, sous le Qwen deux fois plus petit, et la progression 41 → 35 → 44 n’est même pas monotone. Le levier est le modèle de base, pas le nombre de paramètres.
  • Vérification de cette prédiction à 4B : 49/68 contre 51/68 pour le 0.8B, p = 0,774, pour cinq fois les paramètres, 25,7 heures d’entraînement contre 1,8. Sur un facteur 30 en taille, le meilleur point est à 0,8B.
  • Un 4B non entraîné écrit un format parfait, 68/68, et marque fix 0 sur 16. La capacité brute fournit la grammaire, jamais les conventions maison.