TARGET_SPACE / docs /LEARNING.md
RDS777's picture
Upload 115 files
884b5f8 verified
|
Raw History Blame Contribute Delete
6.39 kB
# Apprentissage continu d'UNIQUE (tout sur Hugging Face)
> **Obsolète depuis la v4.1** : le mode Jobs (pilote automatique, professeur, alimentation, export) est retiré. Le fonctionnement actuel est décrit dans [ADR-004](ADR-004-LOCAL.md).
```
OpenCodeInstruct ─▶ job d'alimentation (CPU, chaque heure) ─┐
Space M.O.U.H. (sessions avec tests) ───────────────────────┴─▶ dataset privé RDS777/mouh-trajectories
│
┌───────────── job d'entraînement (GPU T4, relancé chaque heure s'il ne tourne pas) ◀┘
│ boucle : SFT (TRL) → porte pass@1 → GRPO récompensé par pytest (TRL) → porte → …
▼
adaptateur promu RDS777/unique-qwen2.5-coder-0.5b-lora ─▶ redémarrage du Space (générateur « UNIQUE »)
progression toutes les ~20 s ─▶ bucket privé RDS777/unique-progress ─▶ panneau en direct dans le Space
```
## La boucle
1. **Alimentation** (`jobs/ingest_tasks.py`, CPU `cpu-upgrade`, chaque heure) : tranche suivante de 4 000 lignes de
`nvidia/OpenCodeInstruct` (CC BY 4.0), tests convertis en pytest, solutions **ré-exécutées**, seules celles qui passent
sont ajoutées.
2. **SFT** (`trl.SFTTrainer`, LoRA r=16, perte sur la réponse seulement) sur la tranche suivante de 2 000 exemples,
en repartant de l'adaptateur en service.
3. **Porte** : pass@1 réel (tests pytest exécutés) sur un **heldout figé** de 100 tâches jamais vues. Promotion seulement si
le candidat fait strictement mieux que l'adaptateur en service (ou que la base au départ).
4. **GRPO** (`trl.GRPOTrainer`) : 4 solutions générées par tâche, récompense = 1 si les tests passent, 0,1 si le code
compile mais échoue, 0 sinon. Même porte.
5. Après une promotion, le Space redémarre et charge le nouvel adaptateur.
Un passage dure au plus 11 h 30 (UNIQUE_RUN_HOURS) ; le job planifié chaque heure relance la boucle dès qu'aucun passage ne tourne
(jamais deux à la fois). Un passage qui démarre alors que le budget GPU du jour est épuisé s'arrête aussitôt.
## Améliorations (v3) et interrupteurs de retour arrière
Chaque amélioration se coupe par une variable du Space (Settings → Variables), sans ré-uploader de fichier :
le Space recrée alors le job concerné avec l'ancien comportement.
| Amélioration | Ce qu'elle fait | Interrupteur (mettre `0` pour revenir en arrière) |
|---|---|---|
| Curriculum adaptatif | GRPO choisit en priorité les tâches que l'élève réussit *parfois* (les seules qui donnent un signal) ; statistiques par tâche gardées d'un passage à l'autre | `UNIQUE_CURRICULUM` |
| Vrais échecs | les échecs d'UNIQUE pendant GRPO sont enregistrés avec leur vraie trace pytest (`failures/` du dataset) | `UNIQUE_SAVE_FAILURES` |
| Réflexion fondée sur les tests | 25 % des prompts GRPO demandent de corriger un échec réel à partir de sa trace | `GRPO_REPAIR_FRACTION` (= `0`) |
| Modèle maître | job toutes les 2 h : 30 tâches nouvelles au niveau de l'élève (facile / moyen / difficile selon son score), gardées seulement si la solution passe ses tests **et** si les tests tuent au moins 60 % des mutants (test par mutation) ; + correction des vrais échecs, validée par pytest | `UNIQUE_TEACHER` (supprime le job) |
| Benchmark indépendant | HumanEval (164 tâches, jamais utilisé à l'entraînement) mesuré pour la base et pour chaque nouvel adaptateur en service ; les sessions qui partagent 13 mots consécutifs avec HumanEval sont retirées de l'entraînement | `UNIQUE_BENCHMARK` |
| Mémoire à long terme | recherche BM25 des 2 tâches validées les plus proches, données en exemple ; jamais la tâche elle-même ni un quasi-doublon. Mesurée avec / sans sur le heldout (panneau) | mesure : `UNIQUE_MEMORY_AB` ; utilisation dans le Space : `UNIQUE_MEMORY=1` seulement si le panneau affiche « gain » |
Modèle maître : `UNIQUE_TEACHER_MODEL` (défaut `Qwen/Qwen3-Coder-30B-A3B-Instruct`), appelé via les Inference Providers
de Hugging Face, facturé à l'usage sur votre compte. Le jeton `HF_TOKEN` doit avoir le droit « Make calls to Inference
Providers ». Sans ce droit, le job du maître échoue proprement et les autres continuent.
Retour complet à la version précédente : remettre les fichiers de la version « boucle continue » (onglet Files →
historique de chaque fichier), puis redémarrer le Space ; les jobs sont recréés automatiquement.
## Panneau dans le Space
En haut de la page : phase en cours avec barre de progression et temps restant, budget GPU du jour, perte et
récompense, score base / meilleur en service, courbe des scores avec les promotions. Rafraîchi toutes les 15 s.
## Réglages (Settings → Variables and secrets)
| Variable | Défaut | Effet |
|---|---|---|
| `UNIQUE_AUTOTRAIN` | — | `1` = accord pour les dépenses ; sans elle, rien ne démarre |
| `UNIQUE_MAX_GPU_HOURS_PER_DAY` | `24` | plafond quotidien d'heures GPU (24 = non-stop) |
| `UNIQUE_FLAVOR` | `t4-small` | matériel d'entraînement |
| `UNIQUE_INGEST` | `1` | `0` coupe l'alimentation |
| `INGEST_SOURCE` | `opencodeinstruct` | `kodcode` possible (licence CC BY-NC : non commercial) |
Le secret `UNIQUE_ADMIN_KEY` protège les boutons « Alimenter maintenant » et « Entraîner maintenant ».
Pour tout arrêter : suspendre les deux jobs sur huggingface.co/settings/jobs (retirer la variable ne suffit pas).
## Coûts
`t4-small` : 0,40 $/h. En non-stop : environ 9,60 $ par jour, 290 $ par mois. L'alimentation CPU coûte quelques
centimes par jour. Réduire `UNIQUE_MAX_GPU_HOURS_PER_DAY` plafonne la dépense.
## Limites
- Non mesuré en conditions réelles : durée d'un cycle sur T4, part des tâches qui passent la re-vérification, gain réel.
- GRPO sur un modèle de 0,5 Md n'apprend que si certaines générations réussissent déjà : sur les tâches trop dures,
toutes les récompenses sont nulles et la phase n'apporte rien (visible dans le panneau, `reward` proche de 0).
- « Certifié » = passe les tests fournis. La qualité du modèle dépend de celle des tests.
- Le heldout est figé pour que les scores restent comparables ; s'il est agrandi, la base et l'adaptateur en service
sont re-mesurés avant toute nouvelle promotion.