@mcptoolshop/backpropagate 1.0.5 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.fr.md ADDED
@@ -0,0 +1,359 @@
1
+ <p align="center">
2
+ <a href="README.ja.md">日本語</a> | <a href="README.zh.md">中文</a> | <a href="README.es.md">Español</a> | <a href="README.md">English</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.it.md">Italiano</a> | <a href="README.pt-BR.md">Português (BR)</a>
3
+ </p>
4
+
5
+ <p align="center">
6
+ <img src="https://raw.githubusercontent.com/mcp-tool-shop-org/brand/main/logos/backpropagate/readme.png" alt="Backpropagate" width="400">
7
+ </p>
8
+
9
+ <p align="center">
10
+ <a href="https://github.com/mcp-tool-shop-org/backpropagate/actions/workflows/ci.yml"><img src="https://github.com/mcp-tool-shop-org/backpropagate/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
11
+ <a href="https://pypi.org/project/backpropagate/"><img src="https://img.shields.io/pypi/v/backpropagate" alt="PyPI"></a>
12
+ <a href="https://codecov.io/gh/mcp-tool-shop-org/backpropagate"><img src="https://img.shields.io/codecov/c/github/mcp-tool-shop-org/backpropagate" alt="Coverage"></a>
13
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT License"></a>
14
+ <a href="https://mcp-tool-shop-org.github.io/backpropagate/"><img src="https://img.shields.io/badge/Landing_Page-live-blue" alt="Landing Page"></a>
15
+ </p>
16
+
17
+ **Affinage de LLM sans interface graphique en 3 lignes. Paramètres par défaut intelligents, gestion de la taille des lots en fonction de la VRAM, apprentissage continu SLAO sur plusieurs exécutions, et exportation GGUF en un clic pour Ollama.**
18
+
19
+ *SLAO est l'apprentissage continu LoRA via une fusion asymétrique, une technique de fusion entre les exécutions qui empêche l'oubli catastrophique lors de sessions d'affinage prolongées ([article](https://arxiv.org/abs/2512.23017)).*
20
+
21
+ *Entraînez des LLM en 3 lignes de code. Exportez-les vers Ollama avec une ligne supplémentaire.*
22
+
23
+ ## Démarrage rapide
24
+
25
+ ```bash
26
+ pip install backpropagate[standard]
27
+ ```
28
+
29
+ ```python
30
+ from backpropagate import Trainer
31
+
32
+ trainer = Trainer("Qwen/Qwen2.5-7B-Instruct")
33
+ trainer.train("examples/quickstart.jsonl", steps=10)
34
+ trainer.export("gguf", quantization="q4_k_m") # Ready for Ollama
35
+ ```
36
+
37
+ Le dépôt contient un petit fichier `examples/quickstart.jsonl` (5 exemples au format ShareGPT) afin que le code ci-dessus puisse être exécuté de bout en bout sur une installation propre. Pour votre propre entraînement, consultez la section [Format des données](#dataset-format) ci-dessous.
38
+
39
+ ### Option sans code : Interface web
40
+
41
+ Préférez-vous une interface graphique plutôt qu'un REPL Python ? Installez le module correspondant et exécutez la commande suivante :
42
+
43
+ ```bash
44
+ pip install backpropagate[standard]
45
+ backprop ui --port 7862
46
+ ```
47
+
48
+ L'interface Reflex (Radix UI) vous permet de spécifier un fichier JSONL, de choisir un modèle, de l'entraîner et de l'exporter, sans nécessiter de code Python. L'interface est conçue pour fonctionner localement ; pour une exposition sur Internet, consultez la section [Interface web](#web-ui) ci-dessous pour connaître le contrat de sécurité `--share` + `--auth` et les options de tunnel prises en charge (Cloudflare Tunnel, ngrok).
49
+
50
+ ## Format des données
51
+
52
+ Votre fichier d'entraînement au format JSONL doit contenir un exemple par ligne. Le format le plus simple est le chat ShareGPT :
53
+
54
+ ```jsonl
55
+ {"conversations": [{"from": "human", "value": "What is Python?"}, {"from": "gpt", "value": "A programming language."}]}
56
+ {"conversations": [{"from": "human", "value": "Explain recursion."}, {"from": "gpt", "value": "A function that calls itself."}]}
57
+ ```
58
+
59
+ Les formats Alpaca (`instruction`/`output`), OpenAI chat (`messages`) et texte brut sont également pris en charge. Consultez le fichier `examples/quickstart.jsonl` pour un point de départ que vous pouvez copier.
60
+
61
+ ## Pourquoi propager le gradient ?
62
+
63
+ | Problème | Solution |
64
+ |---------|----------|
65
+ | L'affinage est complexe | 3 lignes : chargement, entraînement, sauvegarde |
66
+ | Windows est un cauchemar | Prise en charge complète de Windows |
67
+ | La gestion de la VRAM est difficile | Ajustement automatique de la taille des lots, surveillance du GPU |
68
+ | L'exportation des modèles est déroutante | Exportation GGUF en un clic + enregistrement automatique avec Ollama |
69
+ | Les longues exécutions entraînent l'oubli | Entraînement SLAO sur plusieurs exécutions |
70
+
71
+ ## Fonctionnalités clés
72
+
73
+ - **Conçu sans interface graphique :** Conçu pour les pipelines CI/CD, les flux de travail automatisés et l'exécution programmatique.
74
+ - **Paramètres par défaut intelligents :** Configure automatiquement les hyperparamètres optimaux en fonction de votre matériel et de votre ensemble de données.
75
+ - **Entraînement SLAO sur plusieurs exécutions :** Stratégies d'entraînement avancées pour éviter l'oubli catastrophique lors de longues exécutions.
76
+ - **Prise en charge complète de Windows :** Testé et optimisé pour les environnements Windows, évitant les pièges courants de PyTorch/CUDA.
77
+ - **Exportation transparente :** Exportation en un clic au format GGUF et enregistrement automatique avec Ollama.
78
+ - **Architecture modulaire :** Installez uniquement les dépendances dont vous avez besoin (par exemple, `[unsloth]`, `[ui]`, `[export]`).
79
+
80
+ ## Installation
81
+
82
+ ```bash
83
+ pip install backpropagate # Core only (minimal)
84
+ pip install backpropagate[unsloth] # + Unsloth 2x faster training
85
+ pip install backpropagate[ui] # + Reflex (Radix UI) web interface
86
+ pip install backpropagate[standard] # unsloth + ui (recommended)
87
+ pip install backpropagate[full] # Everything
88
+ ```
89
+
90
+ | Modules complémentaires | Description | Dépendances |
91
+ |-------|-------------|--------------|
92
+ | `unsloth` | Entraînement 2 fois plus rapide, 50 % de VRAM en moins | unsloth |
93
+ | `ui` | Interface web Reflex (Radix UI) | reflex>=0.9.2, fastapi>=0.115 |
94
+ | `validation` | Validation de configuration Pydantic | pydantic, pydantic-settings |
95
+ | `export` | Exportation GGUF pour Ollama | llama-cpp-python |
96
+ | `monitoring` | WandB + surveillance du système (intégré au trainer depuis la version 1.1.0) | wandb, psutil |
97
+ | `observability` | Traçage OpenTelemetry | opentelemetry-api, opentelemetry-sdk |
98
+ | `logging` | Journalisation structurée | structlog |
99
+ | `security` | Authentification JWT + génération de jetons | PyJWT, cryptography |
100
+ | `production` | unsloth + ui + validation + journalisation + sécurité | (ensemble) |
101
+
102
+ **Prérequis :** Python 3.10+ · GPU CUDA (8 Go+ de VRAM) · PyTorch 2.0+
103
+
104
+ ### Prérequis de la plateforme
105
+
106
+ Backpropagate gère les particularités liées à l'exécution (multiprocessing, xformers sur RTX 40/50, workers du dataloader sur Windows). Il **ne** gère pas les problèmes liés à l'installation propres à chaque plateforme ; corrigez d'abord ces problèmes :
107
+
108
+ - **Version du kit de développement CUDA.** PyTorch est publié en fonction de la version de CUDA ; choisir la mauvaise version installe silencieusement une version de torch qui n'utilise que le CPU. Utilisez le sélecteur à l'adresse <https://pytorch.org/get-started/locally/> pour obtenir la commande `pip install torch ...` exacte correspondant à votre pilote. Exécutez `nvidia-smi` pour voir la version de votre pilote/CUDA.
109
+ - **Windows.** Visual Studio Build Tools (C++) et CMake sont requis pour l'extension `[export]` (construction de `llama-cpp-python` à partir du code source). La version de `bitsandbytes` est maintenant disponible nativement pour Windows (>= 0.43) ; les anciens guides mentionnant `bitsandbytes-windows` sont obsolètes.
110
+ - **macOS.** L'entraînement sur GPU **n'est pas pris en charge** ; il n'y a pas de CUDA. Vous pouvez installer Backpropagate pour exécuter l' *inférence* sur un fichier GGUF exporté via Ollama, mais `trainer.train()` génère une erreur `DEP_GPU_NOT_AVAILABLE`. Utilisez une machine avec CUDA pour l'entraînement.
111
+ - **Linux.** La plupart des distributions fonctionnent sans problème. Si vous utilisez la version binaire PyPI, notez que la version Linux utilise torch uniquement pour le CPU (afin de respecter la limite de 2 Go des fichiers joints sur GitHub) ; installez d'abord la version CUDA correspondante à partir de pytorch.org.
112
+
113
+ Pour le dépannage de l'installation, consultez [la page du guide de dépannage](https://mcp-tool-shop-org.github.io/backpropagate/handbook/troubleshooting/).
114
+
115
+ ## Configuration
116
+
117
+ Tous les paramètres peuvent être remplacés à l'aide de variables d'environnement, en utilisant le préfixe `BACKPROPAGATE_` (par exemple, `BACKPROPAGATE_LOG_LEVEL=debug`). Un fichier `.env` à la racine du projet est chargé automatiquement lorsque l'extension `[validation]` est installée.
118
+
119
+ Paramètres courants (voir [la référence complète des variables d'environnement](https://mcp-tool-shop-org.github.io/backpropagate/handbook/env-vars/) pour tout) :
120
+
121
+ | Variable | Valeur par défaut | Notes |
122
+ |----------|---------|-------|
123
+ | `BACKPROPAGATE_LOG_LEVEL` | `INFO` | `DEBUG` / `INFO` / `WARNING` / `ERROR` |
124
+ | `BACKPROPAGATE_LOG_JSON` | auto | Force les journaux en JSON (`true`) ou sur la console (`false`) |
125
+ | `BACKPROPAGATE_LOG_FILE` | non défini | Chemin vers le répertoire où les journaux sont enregistrés |
126
+ | `BACKPROPAGATE_DEFER_FEATURE_DETECTION` | non défini | Ignore la détection des dépendances optionnelles au démarrage pour un démarrage plus rapide de l'interface en ligne de commande |
127
+ | `BACKPROPAGATE_SECURITY__REQUIRE_AUTH_FOR_SHARE` | `true` | Lorsque `true`, refuse `backprop ui --share` sans l'option `--auth` |
128
+ | `BACKPROPAGATE_UI__OUTPUT_DIR` | `~/.backpropagate/ui-outputs` | Répertoire de base pour toutes les opérations d'écriture sur le système de fichiers de l'interface utilisateur ; liste de contrôle d'accès validée |
129
+ | `BACKPROPAGATE_MODEL__NAME` | `Qwen/Qwen2.5-7B-Instruct` | Modèle par défaut |
130
+ | `BACKPROPAGATE_TRAINING__LEARNING_RATE` | `2e-4` | Taux d'apprentissage |
131
+ | `BACKPROPAGATE_LORA__R` | `16` | Rang LoRA |
132
+
133
+ Les clés imbriquées utilisent un double tiret-bas comme délimiteur (convention Pydantic `env_nested_delimiter`).
134
+
135
+ ## Utilisation
136
+
137
+ ### Entraînement de base
138
+
139
+ ```python
140
+ from backpropagate import Trainer
141
+
142
+ trainer = Trainer("Qwen/Qwen2.5-7B-Instruct")
143
+ trainer.train("my_data.jsonl", steps=100)
144
+ trainer.save("./my-model")
145
+ trainer.export("gguf", quantization="q4_k_m")
146
+ ```
147
+
148
+ `Qwen/Qwen2.5-7B-Instruct` est le modèle par défaut ; la valeur `Trainer()` est résolue lorsque celle-ci est appelée sans argument de modèle (voir [`config.py`](backpropagate/config.py) `ModelConfig.name`). Les exemples précédents utilisaient la version quantifiée `unsloth/Qwen2.5-7B-Instruct-bnb-4bit` ; nous avons modifié le modèle par défaut pour utiliser les poids officiels de Qwen afin d'améliorer la fiabilité ([CHANGELOG v0.1.3](CHANGELOG.md)). N'importe quel modèle fonctionne.
149
+
150
+ ### Entraînement SLAO multi-exécution
151
+
152
+ ```python
153
+ from backpropagate import Trainer
154
+
155
+ trainer = Trainer("Qwen/Qwen2.5-7B-Instruct")
156
+
157
+ result = trainer.multi_run(
158
+ dataset="HuggingFaceH4/ultrachat_200k",
159
+ num_runs=5,
160
+ steps_per_run=100,
161
+ samples_per_run=1000,
162
+ merge_mode="slao", # Single LoRA Continual Learning via Asymmetric Merging
163
+ )
164
+ ```
165
+
166
+ SLAO (Single LoRA Continual Learning via Asymmetric Merging) implémente l'article [Merge before Forget](https://arxiv.org/abs/2512.23017) : initialisation orthogonale de la matrice A via la décomposition QR, gestion asymétrique de A/B et mise à l'échelle temporelle `λ(i) = 1/√i`. Le paramètre de l'interface en ligne de commande est `--samples` (le champ sous-jacent est `samples_per_run`).
167
+
168
+ ### Exportation vers Ollama
169
+
170
+ ```python
171
+ # Export to GGUF
172
+ result = trainer.export("gguf", quantization="q4_k_m")
173
+
174
+ # Register with Ollama separately
175
+ from backpropagate import register_with_ollama
176
+ register_with_ollama(result.path, "my-finetuned-model")
177
+ # ollama run my-finetuned-model
178
+ ```
179
+
180
+ ### Interface en ligne de commande
181
+
182
+ ```bash
183
+ backprop train --data my_data.jsonl --model Qwen/Qwen2.5-7B-Instruct --steps 100
184
+ backprop multi-run --data my_data.jsonl --runs 5 --steps 100
185
+ backprop export ./output/lora --format gguf --quantization q4_k_m --ollama --ollama-name my-model
186
+ backprop ui --port 7862
187
+ backprop info
188
+ backprop list-runs # v1.1.0: query past training runs
189
+ backprop show-run <run-id> # v1.1.0: detail view
190
+ backprop resume <run-id> # v1.1.0: resume a crashed multi-run
191
+ backprop push ./output/lora --repo me/my-model # v1.1.0: push adapter to HF Hub
192
+ ```
193
+
194
+ Consultez [la référence de l'interface en ligne de commande](https://mcp-tool-shop-org.github.io/backpropagate/handbook/cli-reference/) pour chaque sous-commande et chaque paramètre, ou exécutez `backprop <sous-commande> --help`.
195
+
196
+ ### Reprise à partir d'un point de contrôle (v1.1.0)
197
+
198
+ Un cycle d'entraînement interrompu à la quatrième étape peut désormais être repris. Chaque session d'entraînement enregistre son identifiant (`run_id`) à la fois dans le fichier `run_history.json` et dans le fichier de manifeste des points de contrôle sur le disque, ce qui permet de reprendre l'entraînement en une seule commande.
199
+
200
+ ```bash
201
+ backprop resume <run-id> # picks up the in-progress session
202
+ backprop multi-run --data ... --resume <run-id> # explicit form
203
+ backprop train --data ... --resume <run-id> # single-run resume (continues run_id)
204
+ ```
205
+
206
+ Par défaut, la commande `backprop multi-run` (sans l'option `--resume`) détecte automatiquement une session en cours pour le même répertoire de sortie et la reprend. Pour forcer une nouvelle session, utilisez `resume_from="off"` (API Python) ou omettez l'option `--resume` et démarrez dans un nouveau répertoire de sortie.
207
+
208
+ Lorsqu'une session d'entraînement est reprise, le dernier point de contrôle associé à cet `run_id` est chargé dans le modèle, l'état de fusion SLAO est restauré à partir du répertoire `slao/` situé à côté du point de contrôle, et le cycle d'entraînement reprend à partir de `last_completed_run + 1`. L'état de la ligne d'historique passe à `running`, ce qui permet à la commande `backprop list-runs --status running` d'afficher la session en cours.
209
+
210
+ ### Suivi des expériences (v1.1.0)
211
+
212
+ Le module `Trainer` détecte automatiquement les outils de suivi d'expériences installés (`wandb`, `tensorboard`, `mlflow`) et les intègre aux paramètres d'entraînement de `transformers`. La valeur par défaut `report_to="auto"` utilise tout ce qui est importable.
213
+
214
+ ```bash
215
+ pip install backpropagate[monitoring] # installs wandb + psutil
216
+ wandb login # one-time
217
+ backprop train --data my_data.jsonl # W&B run gets the same run_id prefix as the on-disk history
218
+ ```
219
+
220
+ Pour désactiver explicitement le suivi, utilisez `Trainer(report_to=["wandb"])`, `Trainer(report_to=["tensorboard"])` ou `Trainer(report_to="none")`. Pour utiliser MLflow, installez le package `mlflow` avec `pip install mlflow`; pour TensorBoard, installez `pip install tensorboard`. Le nom de l'exécution W&B est `backprop-<run_id_prefix>`, ce qui permet aux utilisateurs de rechercher des informations à l'aide de ce même identifiant dans W&B, les journaux et le fichier `run_history.json`.
221
+
222
+ ### Historique de l'entraînement
223
+
224
+ Chaque invocation de `backprop train` et `backprop multi-run` enregistre une ligne dans le fichier `<output>/run_history.json` contenant l'identifiant de l'exécution, le modèle, le jeu de données, les hyperparamètres, l'état, la perte finale, l'historique des pertes et, pour les exécutions multiples, le calendrier de fusion SLAO. Pour afficher les exécutions récentes, utilisez la commande appropriée.
225
+
226
+ ```bash
227
+ backprop list-runs # most recent 20 runs, all statuses
228
+ backprop list-runs --status failed # filter
229
+ backprop list-runs --json --limit 100 # machine-readable
230
+ backprop show-run abcd1234 # detail view (partial run_id ok)
231
+ ```
232
+
233
+ L'historique des exécutions est conservé entre les processus. L'onglet "Runs" de l'interface web est une vue en mémoire distincte ; l'historique enregistré sur le disque est la source de vérité pour les commandes `list-runs` / `show-run` / `resume`.
234
+
235
+ ### Interface web
236
+
237
+ Lancez l'interface Reflex localement :
238
+
239
+ ```bash
240
+ backprop ui --port 7862
241
+ ```
242
+
243
+ Pour rendre l'URL accessible via Internet, vous devez combiner les options `--share` et `--auth` :
244
+
245
+ ```bash
246
+ backprop ui --share --auth alice:hunter2
247
+ ```
248
+
249
+ La commande `backprop ui --share` sans l'option `--auth` renvoie un code d'erreur `1` et un message d'erreur structuré `[INPUT_AUTH_REQUIRED]`. La raison est que l'option `--share` publie une URL `*.gradio.live` que toute personne sur Internet peut consulter, et sans authentification, cela signifie que toute personne peut contrôler votre pipeline d'entraînement.
250
+
251
+ Pour désactiver explicitement cette fonctionnalité (par exemple, dans un environnement de développement interne), définissez la variable d'environnement `BACKPROPAGATE_SECURITY__REQUIRE_AUTH_FOR_SHARE=false`. Un avertissement important s'affiche à chaque lancement, et il existe une période de grâce de 5 secondes avant que l'interface utilisateur non authentifiée ne s'active, ce qui vous permet d'utiliser `Ctrl-C` si quelque chose ne vous semble pas correct.
252
+
253
+ Les opérations d'écriture sur le système de fichiers via l'interface utilisateur sont limitées à un seul répertoire :
254
+
255
+ - Par défaut : `~/.backpropagate/ui-outputs`
256
+ - Pour modifier : `BACKPROPAGATE_UI__OUTPUT_DIR=/path/you/own`
257
+ - Cette modification est **validée par une liste de contrôle** : les chemins système et d'informations d'identification (`/etc`, `/var`, `~/.ssh`, `~/.aws`, `C:\Windows\System32`, etc.) sont refusés avec le message `[UI_OUTPUT_DIR_FORBIDDEN]`.
258
+
259
+ ## Prise en charge de Windows
260
+
261
+ Backpropagate est conçu pour fonctionner sur Windows sans configuration particulière :
262
+
263
+ - Pré-tokenisation pour éviter les plantages liés au multiprocessing.
264
+ - Désactivation automatique de xformers pour les séries RTX 40/50.
265
+ - Paramètres de dataloader sécurisés.
266
+ - Testé sur RTX 5080 (16 Go de VRAM).
267
+
268
+ ## Modèles préconfigurés
269
+
270
+ | Modèle | VRAM | Vitesse | Qualité |
271
+ |--------|------|-------|---------|
272
+ | Qwen 2.5 7B | ~12 Go | Moyenne | Meilleure |
273
+ | Qwen 2.5 3B | ~8 Go | Rapide | Bonne |
274
+ | Llama 3.2 3B | ~8 Go | Rapide | Bonne |
275
+ | Llama 3.2 1B | ~6 Go | Très rapide | Basique |
276
+ | Mistral 7B | ~12 Go | Moyenne | Bonne |
277
+
278
+ ## Architecture
279
+
280
+ ```
281
+ backpropagate/
282
+ ├── trainer.py # Core Trainer class
283
+ ├── multi_run.py # Multi-run SLAO training
284
+ ├── slao.py # SLAO LoRA merging algorithm
285
+ ├── datasets.py # Dataset loading, filtering & curriculum
286
+ ├── export.py # GGUF/Ollama export
287
+ ├── config.py # Pydantic settings + training presets
288
+ ├── gpu_safety.py # GPU monitoring & safety
289
+ ├── cli.py # CLI entry point (backprop command)
290
+ ├── checkpoints.py # Checkpoint management
291
+ ├── exceptions.py # Structured error hierarchy
292
+ ├── feature_flags.py # Optional feature detection
293
+ ├── security.py # Path traversal & torch security
294
+ ├── logging_config.py # Structured logging setup
295
+ ├── ui_theme.py # Radix theme tokens + CSS (Reflex era)
296
+ ├── ui_state.py # rx.State subclasses
297
+ ├── ui_app/ # Reflex web interface (Radix UI)
298
+ │ ├── app.py # rx.App entry point
299
+ │ ├── chrome.py # Header / LeftNav / SideRail / Footer
300
+ │ ├── pages/ # Train / Multi-Run / Export / Dataset
301
+ │ └── components/ # Bp* primitives (status pill, sparkline, event log…)
302
+ ├── ui_security.py # Rate limiting, CSRF, file validation (framework-agnostic)
303
+ ├── ui_gradio_legacy.py # DEPRECATED — preserved as v1.0 reference; removed in v1.2
304
+ └── theme_gradio_legacy.py # DEPRECATED — same
305
+ ```
306
+
307
+ ## Dépannage
308
+
309
+ Un bref index des erreurs les plus courantes rencontrées au démarrage. L'index complet se trouve sur la page du manuel de dépannage : [https://mcp-tool-shop-org.github.io/backpropagate/handbook/troubleshooting/](https://mcp-tool-shop-org.github.io/backpropagate/handbook/troubleshooting/); chaque code ci-dessous est documenté dans la section [codes d'erreur](https://mcp-tool-shop-org.github.io/backpropagate/handbook/error-codes/).
310
+
311
+ | Symptôme | Code | Solution |
312
+ |---------|------|-----|
313
+ | La mémoire de la GPU est épuisée pendant l'entraînement. | `RUNTIME_GPU_OOM` | La fonctionnalité de récupération automatique en cas de manque de mémoire (OOM) (B-002) réduit automatiquement la taille du lot jusqu'à 3 fois. Pour la désactiver : `Trainer(oom_recovery=False)`. Pour forcer une taille plus petite : `--batch-size 1`. |
314
+ | Le hub Hugging Face renvoie un code 401 / "modèle introuvable". | `DEP_MODEL_LOAD_FAILED` | Utilisez `huggingface-cli login` et réessayez. En cas de faute de frappe, copiez l'identifiant exact depuis <https://huggingface.co/models>. |
315
+ | Faute de frappe dans le nom du modèle. | `INPUT_VALIDATION_FAILED` ou `DEP_MODEL_LOAD_FAILED`. | Vérifiez l'identifiant `org/name` sur <https://huggingface.co/models>. |
316
+ | `register_with_ollama` : connexion refusée. | `DEP_OLLAMA_REGISTRATION_FAILED` | Démarrez le démon : `ollama serve`. Installez depuis <https://ollama.com>. Opération pouvant être répétée. |
317
+ | Le disque est plein lors de la sauvegarde du point de contrôle. | `STATE_CHECKPOINT_INVALID` | Les écritures atomiques laissent un répertoire `.partial` en cas de plantage ; il est sûr de le supprimer. Le point de contrôle précédent est intact. |
318
+ | L'entraînement est interrompu / arrêté en raison de la surchauffe de la GPU. | `RUNTIME_GPU_TEMPERATURE_CRITICAL` | B-003 : le moniteur met l'entraînement en pause lorsque le seuil de température NVML est atteint ; il reprend automatiquement lorsque la GPU refroidit. Améliorez la circulation de l'air ou réduisez la charge. |
319
+ | `backprop ui --share` est refusé. | `INPUT_AUTH_REQUIRED` | Passez `--auth user:password` ou définissez `BACKPROPAGATE_SECURITY__REQUIRE_AUTH_FOR_SHARE=false` pour le désactiver (avec un avertissement). |
320
+ | "Chevauchement" des exécutions multiples lors de la validation. | `CONFIG_INVALID` (Étape A, backend B-001). | Réduisez `--samples` en dessous de la taille du pool d'entraînement, augmentez la taille du jeu de données ou désactivez la validation. |
321
+ | L'export GGUF a échoué lors de la première tentative. | `RUNTIME_GGUF_EXPORT_FAILED` | `pip install backpropagate[export]`; sous Windows, vous avez également besoin des outils de construction Visual C++ et de CMake. |
322
+
323
+ ## Signaler des bogues
324
+
325
+ Lorsqu'une erreur se produit, Backpropagate affiche une ligne `run_started run_id=<uuid>` au démarrage et associe cet ID aux manifestes des points de contrôle, à l'historique des fusions SLAO et aux lignes de journal structurées. Incluez l'`run_id` dans tout rapport de bogue ; cela permet à un mainteneur de corréler chaque ligne de journal, chaque point de contrôle et chaque fusion pour cette exécution spécifique.
326
+
327
+ Un bon rapport de bogue comprend :
328
+
329
+ 1. **`run_id`** — l'UUID affiché au démarrage (également disponible sous `TrainingRun.run_id` et `RunResult.run_id`).
330
+ 2. **Le code d'erreur** — la ligne `[CODE_NAME]: message` dans stderr ; consultez [codes d'erreur](https://mcp-tool-shop-org.github.io/backpropagate/handbook/error-codes/) pour le catalogue.
331
+ 3. **La ligne de commande masquée.** La sortie stderr en mode non verbeux est automatiquement masquée (les jetons Bearer, `sk-*`, `hf_*`, les clés AWS, les paires `password=/token=/api_key=` sont supprimées) ; il est donc sûr de la copier. Pour obtenir la trace complète et non masquée, relancez avec `--verbose`, mais examinez-la avant de la publier.
332
+ 4. **Versions de Python / PyTorch, modèle de GPU, système d'exploitation.** `backprop info` affiche tout cela en une seule fois.
333
+
334
+ ## Confidentialité
335
+
336
+ Toute l'exécution se fait localement sur votre GPU. Backpropagate ne fait aucune requête réseau, sauf pour télécharger les modèles depuis HuggingFace (ce que vous initiez). Pas de télémétrie, pas de dépendance au cloud.
337
+
338
+ ## Tableau de bord
339
+
340
+ | Catégorie | Score | Notes |
341
+ |----------|-------|-------|
342
+ | A. Sécurité | 6/8 | SECURITY.md, modèle de confiance, pas de secrets/télémétrie, safe_path(). Les éléments MCP sont ignorés. |
343
+ | B. Gestion des erreurs | 5/7 | Structure des exceptions (code/message/indice/cause/pouvant être retentée) via le registre ERROR_CODES ; codes de sortie de la CLI : 0/1/2/3 ; pas de traces de pile brutes sans l'option `--verbose` ; corrélation par `run_id` ; stderr masqué ; blocage via `--share` + `--auth`. MCP/bureau/vscode ignorés. |
344
+ | C. Documentation pour les opérateurs | 4/7 | README, CHANGELOG, LICENSE, --help. Journalisation/MCP/éléments complexes ignorés. |
345
+ | D. Hygiène de la livraison | 6/9 | verify.sh, version=tag, 5 scanners dans l'intégration continue, dependabot, python_requires, build propre. |
346
+ | E. Identité | 4/4 | Logo, traductions, page d'accueil, métadonnées. |
347
+ | **Total** | **25/31** | 14 éléments ignorés avec justification. `shipcheck audit` réussit à 100 %. Date de l'audit : 2026-05-21 (la ligne B a été réévaluée après les travaux de la phase B et les codes de sortie de la CLI de la phase A). |
348
+
349
+ Historique de la conception et correspondance de chaque élément : voir [ROADMAP.md](ROADMAP.md) — tous les éléments des semaines 1 à 4 sont livrés dans la version 1.1.0.
350
+
351
+ ## Licence
352
+
353
+ MIT — voir [LICENSE](LICENSE) pour plus de détails.
354
+
355
+ ---
356
+
357
+ <p align="center">
358
+ Built by <a href="https://mcp-tool-shop.github.io/">MCP Tool Shop</a>
359
+ </p>