Soup: fine-tuner Llama-3.1-8B sur une GPU laptop de 4 GB avec le layer streaming
Soup est un outil open source qui permet de fine-tuner un modèle de 8 milliards de paramètres sur une GPU laptop de 4 GB. Llama-3.1-8B-Instruct sur RTX 3050, 3,32 GB de VRAM de pic, 119,6 token par seconde. Les chiffres sont déclarés par les auteurs sur le repository GitHub.
La technique s’appelle layer streaming. Au lieu de charger l’intégralité du modèle en mémoire vidéo (ce qui ne tiendrait pas sur 4 GB), Soup garde le modèle de base hors de la VRAM et l’alimente à la GPU un layer de decoder à la fois. Le résultat, disent les auteurs, est bit-exact par rapport à une exécution normale avec le modèle résident en mémoire.
Pour qui veut adapter un modèle à ses propres données sans les envoyer sur un cloud, l’enjeu est direct. Le fine-tuning exigeait des GPU dédiées, souvent louées à l’heure. Si un laptop quelconque peut faire le travail, le fossé entre « j’utilise un modèle générique » et « j’entraîne mon propre modèle » devient plus court. C’est la même logique que l’inférence locale dans le navigateur : l’IA utile se rapproche du matériel que tu as déjà, sauf qu’ici on parle d’entraînement, pas seulement d’exécution.
L’outil est en bêta. Le layer streaming est opt-in (stream_layers: true). Les chiffres sont mesurés sur un seul matériel (RTX 3050 Laptop 4 GB) et pas encore répliqués indépendamment. La version 0.72.4 a ajouté le support de DPO, ORPO, SimPO et KTO, toujours via layer streaming, avec le modèle de référence de DPO obtenu gratuitement en réutilisant le même stream de base.
Licence Apache-2.0, disponible sur GitHub.
En détail
Le fine-tuning d’un LLM a un goulot d’étranglement simple : la mémoire vidéo. Un modèle de 8 milliards de paramètres en précision NF4 (4 bits par paramètre) occupe environ 4 GB rien que pour les poids. Sur une GPU de 4 GB comme la RTX 3050 Laptop, il ne reste pas de place pour les gradients, l’optimiseur et le batch d’entrée. Le modèle ne rentre pas.
Layer streaming contourne le problème de façon directe. Le modèle de base reste gelé (non mis à jour) et chargé en mémoire CPU ou sur disque. Soup l’alimente à la GPU un decoder layer à la fois : charge le layer, calcule l’activation, le décharge, passe au suivant. La GPU ne voit qu’un layer à la fois, pas le modèle entier. Ce qui reste en VRAM, c’est les paramètres de l’adaptateur LoRA (petits, quelques dizaines de millions) et le batch courant.
Les auteurs déclarent 3,32 GB de pic sur RTX 3050 4 GB avec Llama-3.1-8B-Instruct quantisé NF4, LoRA, batch 1, séquence 512 token, à 119,6 token par seconde. L’affirmation la plus forte est que le résultat est bit-exact par rapport à une exécution avec le modèle résident en VRAM : mêmes outputs, zéro différence. Si confirmé, cela signifie que le layer streaming n’introduit pas d’approximations, juste un réordonnancement de quand les données transitent en GPU.
La version 0.72.4 a étendu le layer streaming aux méthodes de preference learning (DPO, ORPO, SimPO, KTO). Le point intéressant est le modèle de référence de DPO. DPO normalement exige deux copies du modèle : celle que tu entraînes et une de référence gelée pour la comparaison. Deux copies sur 4 GB sont impossibles. Soup réutilise le même stream de base avec les adapter LoRA désactivés : un seul ensemble de poids, un seul stream. Le coût se paie entièrement en temps de calcul, sans peser sur la mémoire : DPO lit le stack de layer 1,52 fois plus souvent par step qu’au fine-tuning supervisé. Le pic de VRAM pour DPO en stream est 0,914 fois celui du SFT, toujours dans les limites des 4 GB.
Les auteurs sont honnêtes sur ce qui ne fonctionne pas. GRPO et PPO restent exclus : la génération de token exige de relire chaque layer, et le layer streaming devient prohibitif en temps de calcul. KTO, souvent décrit comme reference-free, utilise en réalité le même schéma de référence que DPO, et Soup le traite en conséquence.
Les limites sont claires. Les chiffres proviennent d’un seul matériel, mesurés par les auteurs eux-mêmes. Le layer streaming est marqué BETA et opt-in. La vitesse de 119,6 tok/s concerne batch 1 et séquence 512 : sur des données réelles, avec des séquences plus longues ou des batchs plus grands, les performances changent. Le repo compte 186 star sur GitHub et 60 issues ouvertes, signal d’une adoption encore précoce et de frictions réelles dans l’utilisation quotidienne.
Le signal, cependant, est intéressant. Si le layer streaming tient sa promesse du bit-exact, le fine-tuning local sur GPU grand public cesse d’être une expérience et devient une option pratique. Pour qui a des données sensibles qu’il ne veut pas envoyer sur un cloud, ou qui veut itérer rapidement sans payer des heures de GPU, la différence compte.