@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/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Mikey Frilot
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mikey Frilot
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.es.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.md">English</a> | <a href="README.fr.md">Français</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
+ **Ajuste fino de LLM sin interfaz gráfica en 3 líneas. Configuraciones predeterminadas inteligentes, ajuste automático del tamaño de los lotes según la VRAM, entrenamiento SLAO en múltiples ejecuciones y exportación a GGUF con un solo clic para Ollama.**
18
+
19
+ *SLAO es Single LoRA Continual Learning via Asymmetric Merging, una técnica de combinación entre ejecuciones que evita el olvido catastrófico durante las campañas de ajuste fino prolongadas ([artículo](https://arxiv.org/abs/2512.23017)).*
20
+
21
+ *Entrena LLM con 3 líneas de código. Exporte a Ollama con una línea más.*
22
+
23
+ ## Inicio rápido
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
+ El repositorio incluye un pequeño archivo `examples/quickstart.jsonl` (5 ejemplos en formato ShareGPT) para que el fragmento de código anterior se ejecute de extremo a extremo en una instalación limpia. Para su propio entrenamiento, consulte el formato de conjunto de datos [Dataset Format](#dataset-format) a continuación.
38
+
39
+ ### Opción sin código: Interfaz web
40
+
41
+ ¿Prefiere una interfaz gráfica en lugar de una terminal de Python? Instale el paquete correspondiente y ejecute:
42
+
43
+ ```bash
44
+ pip install backpropagate[standard]
45
+ backprop ui --port 7862
46
+ ```
47
+
48
+ La interfaz de Reflex (Radix UI) le permite seleccionar un archivo JSONL, elegir un modelo, entrenar y exportar, sin necesidad de Python. La interfaz es local; para acceder desde Internet, consulte la sección [Web UI](#web-ui) a continuación, donde se explica el contrato de seguridad `--share` + `--auth` y las opciones de túnel admitidas (Cloudflare Tunnel, ngrok).
49
+
50
+ ## Formato del conjunto de datos
51
+
52
+ Su archivo de entrenamiento en formato JSONL debe tener un ejemplo por línea. El formato más sencillo es el chat de 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
+ También se admiten formatos Alpaca (`instruction`/`output`), OpenAI chat (`messages`) y texto sin formato. Consulte `examples/quickstart.jsonl` para obtener un punto de partida que se puede copiar.
60
+
61
+ ## ¿Por qué propagar hacia atrás?
62
+
63
+ | Problema | Solución |
64
+ |---------|----------|
65
+ | El ajuste fino es complejo | 3 líneas: cargar, entrenar, guardar |
66
+ | Windows es un problema | Soporte completo para Windows |
67
+ | La gestión de la VRAM es difícil | Ajuste automático del tamaño de los lotes, monitoreo de la GPU |
68
+ | La exportación de modelos es confusa | Exportación a GGUF con un solo clic + registro automático en Ollama |
69
+ | Las ejecuciones prolongadas causan olvido | Entrenamiento SLAO en múltiples ejecuciones |
70
+
71
+ ## Características principales
72
+
73
+ - **Diseñado para funcionar sin interfaz gráfica:** Ideal para pipelines de CI/CD, flujos de trabajo automatizados y ejecución programática.
74
+ - **Configuraciones predeterminadas inteligentes:** Configura automáticamente los hiperparámetros óptimos según su hardware y conjunto de datos.
75
+ - **Entrenamiento SLAO en múltiples ejecuciones:** Estrategias de entrenamiento avanzadas para evitar el olvido catastrófico durante las ejecuciones prolongadas.
76
+ - **Soporte completo para Windows:** Probado y optimizado para entornos Windows, evitando problemas comunes de PyTorch/CUDA.
77
+ - **Exportación sencilla:** Exportación con un solo clic al formato GGUF y registro automático en Ollama.
78
+ - **Arquitectura modular:** Instale solo las dependencias que necesita (por ejemplo, `[unsloth]`, `[ui]`, `[export]`).
79
+
80
+ ## Instalación
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
+ | Paquetes adicionales | Descripción | Dependencias |
91
+ |-------|-------------|--------------|
92
+ | `unsloth` | Entrenamiento 2 veces más rápido, 50% menos de VRAM | unsloth |
93
+ | `ui` | Interfaz web Reflex (Radix UI) | reflex>=0.9.2, fastapi>=0.115 |
94
+ | `validation` | Validación de configuración de Pydantic | pydantic, pydantic-settings |
95
+ | `export` | Exportación a GGUF para Ollama | llama-cpp-python |
96
+ | `monitoring` | WandB + monitoreo del sistema (integrado automáticamente en el entrenador en v1.1.0) | wandb, psutil |
97
+ | `observability` | Trazado de OpenTelemetry | opentelemetry-api, opentelemetry-sdk |
98
+ | `logging` | Registro estructurado | structlog |
99
+ | `security` | Autenticación JWT + generación de tokens | PyJWT, cryptography |
100
+ | `production` | unsloth + ui + validación + registro + seguridad | (paquete) |
101
+
102
+ **Requisitos:** Python 3.10+ · GPU con CUDA (8GB+ de VRAM) · PyTorch 2.0+
103
+
104
+ ### Requisitos de la plataforma
105
+
106
+ Backpropagate se encarga de las peculiaridades de la ejecución (multiproceso, xformers en RTX 40/50, trabajadores del cargador de datos en Windows). **No** se encarga de los problemas de instalación relacionados con la plataforma; resuélvalos primero:
107
+
108
+ - **Versión del kit de herramientas CUDA.** PyTorch se publica por versión de CUDA; elegir la versión incorrecta instala silenciosamente solo la versión de torch para CPU. Utilice el selector en <https://pytorch.org/get-started/locally/> para obtener el comando exacto `pip install torch ...` para su controlador. Ejecute `nvidia-smi` para ver la versión de su controlador/CUDA.
109
+ - **Windows.** Visual Studio Build Tools (C++) y CMake son necesarios para el extra `[export]` (las compilaciones de `llama-cpp-python` se realizan desde el código fuente). El paquete `bitsandbytes` se publica ahora de forma nativa para Windows (>= 0.43); las guías anteriores que mencionan `bitsandbytes-windows` están desactualizadas.
110
+ - **macOS.** El entrenamiento con GPU **no está soportado**; no hay CUDA. Puede instalar Backpropagate para ejecutar la *inferencia* en un modelo GGUF exportado a través de Ollama, pero `trainer.train()` genera un error `DEP_GPU_NOT_AVAILABLE`. Utilice una máquina con CUDA para el entrenamiento.
111
+ - **Linux.** La mayoría de las distribuciones funcionan sin problemas. Si está utilizando la versión binaria de PyPI, tenga en cuenta que la compilación de Linux utiliza solo la versión de torch para CPU (para mantenerse dentro del límite de 2 GB de archivos adjuntos de lanzamiento de GitHub); instale primero el paquete CUDA correspondiente de pytorch.org.
112
+
113
+ Para la resolución de problemas de instalación más detallada, consulte [la página del manual de solución de problemas](https://mcp-tool-shop-org.github.io/backpropagate/handbook/troubleshooting/).
114
+
115
+ ## Configuración
116
+
117
+ Todas las configuraciones se pueden sobrescribir con variables de entorno utilizando el prefijo `BACKPROPAGATE_` (por ejemplo, `BACKPROPAGATE_LOG_LEVEL=debug`). Un archivo `.env` en la raíz del proyecto se carga automáticamente cuando se instala el extra `[validation]`.
118
+
119
+ Parámetros comunes (consulte [la referencia completa de las variables de entorno](https://mcp-tool-shop-org.github.io/backpropagate/handbook/env-vars/) para obtener información completa):
120
+
121
+ | Variable | Valor predeterminado | Notas |
122
+ |----------|---------|-------|
123
+ | `BACKPROPAGATE_LOG_LEVEL` | `INFO` | `DEBUG` / `INFO` / `WARNING` / `ERROR` |
124
+ | `BACKPROPAGATE_LOG_JSON` | auto | Fuerza registros en formato JSON (`true`) o en la consola (`false`) |
125
+ | `BACKPROPAGATE_LOG_FILE` | no definido | Ruta para guardar los registros |
126
+ | `BACKPROPAGATE_DEFER_FEATURE_DETECTION` | no definido | Omite la detección de dependencias opcionales al inicio para un inicio más rápido de la interfaz de línea de comandos. |
127
+ | `BACKPROPAGATE_SECURITY__REQUIRE_AUTH_FOR_SHARE` | `true` | Cuando es `true`, rechaza `backprop ui --share` sin `--auth` |
128
+ | `BACKPROPAGATE_UI__OUTPUT_DIR` | `~/.backpropagate/ui-outputs` | Directorio base para todas las escrituras del sistema de archivos de la interfaz de usuario; validado por denylist. |
129
+ | `BACKPROPAGATE_MODEL__NAME` | `Qwen/Qwen2.5-7B-Instruct` | Modelo predeterminado |
130
+ | `BACKPROPAGATE_TRAINING__LEARNING_RATE` | `2e-4` | Tasa de aprendizaje |
131
+ | `BACKPROPAGATE_LORA__R` | `16` | Rango de LoRA |
132
+
133
+ Las claves anidadas utilizan el doble guion bajo como delimitador (convención de Pydantic `env_nested_delimiter`).
134
+
135
+ ## Uso
136
+
137
+ ### Entrenamiento básico
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` es el valor predeterminado canónico; el valor `Trainer()` se resuelve cuando se llama sin un argumento de modelo (consulte [`config.py`](backpropagate/config.py) `ModelConfig.name`). Los ejemplos anteriores utilizaban `unsloth/Qwen2.5-7B-Instruct-bnb-4bit` pre-cuantizado; hemos cambiado el valor predeterminado a los pesos oficiales de Qwen para una mejor fiabilidad ([REGISTRO DE CAMBIOS v0.1.3](CHANGELOG.md)). Cualquier modelo funciona.
149
+
150
+ ### Entrenamiento multi-ejecución SLAO
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 (Aprendizaje continuo de LoRA único mediante fusión asimétrica) implementa el artículo [Merge before Forget](https://arxiv.org/abs/2512.23017): inicialización ortogonal de la matriz A mediante descomposición QR, manejo asimétrico de A/B y escalado dependiente del tiempo `λ(i) = 1/√i`. La opción de la interfaz de línea de comandos es `--samples` (el campo subyacente es `samples_per_run`).
167
+
168
+ ### Exportación a 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
+ ### Interfaz de línea de comandos
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
+ Consulte [la referencia de la interfaz de línea de comandos](https://mcp-tool-shop-org.github.io/backpropagate/handbook/cli-reference/) para cada subcomando y opción, o ejecute `backprop <subcomando> --help`.
195
+
196
+ ### Reanudación desde el punto de control (v1.1.0)
197
+
198
+ Una ejecución multi-ejecución que falla en la ejecución 4 ahora es recuperable. Cada sesión de ejecución multi-ejecución escribe su `run_id` tanto en `run_history.json` como en el manifiesto de puntos de control en el disco, por lo que para reanudar desde donde lo dejó, solo necesita un comando:
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
+ El comportamiento predeterminado de `backprop multi-run` (sin `--resume`) detecta automáticamente una entrada en curso para el mismo directorio de salida y la continúa. Para forzar una sesión limpia, pase `resume_from="off"` (API de Python) o omita `--resume` y comience en un directorio de salida nuevo.
207
+
208
+ Cuando se reanuda una ejecución multi-ejecución, el último punto de control para ese `run_id` se carga en el modelo, el estado de fusión SLAO se restaura desde el directorio `slao/` junto al punto de control, y el bucle de ejecución continúa desde `last_completed_run + 1`. El estado de la entrada de historial cambia de nuevo a `running`, por lo que `backprop list-runs --status running` muestra la sesión activa.
209
+
210
+ ### Seguimiento de experimentos (v1.1.0)
211
+
212
+ `Trainer` detecta automáticamente los rastreadores de experimentos instalados (`wandb`, `tensorboard`, `mlflow`) y los integra en los `transformers.TrainingArguments` subyacentes. El valor predeterminado `report_to="auto"` selecciona lo que sea 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
+ Para optar explícitamente por no usarlo, use `Trainer(report_to=["wandb"])`, `Trainer(report_to=["tensorboard"])` o `Trainer(report_to="none")`. Para MLflow, instale `pip install mlflow`; para TensorBoard, instale `pip install tensorboard`. El nombre de la ejecución de W&B es `backprop-<run_id_prefix>`, lo que permite a un operador buscar en W&B, nuestros registros y `run_history.json` utilizando el mismo identificador.
221
+
222
+ ### Historial de entrenamiento
223
+
224
+ Cada invocación de `backprop train` y `backprop multi-run` registra una fila en `<output>/run_history.json` con el `run_id`, el modelo, el conjunto de datos, los hiperparámetros, el estado, la pérdida final, el historial de pérdidas y, para las ejecuciones multi-ejecución, la línea de tiempo de fusión SLAO. Para ver las ejecuciones recientes:
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
+ El historial de ejecuciones persiste entre procesos; la pestaña `Runs` en la interfaz web es una vista en memoria; el historial en el disco es la fuente de verdad para `list-runs` / `show-run` / `resume`.
234
+
235
+ ### Interfaz web
236
+
237
+ Inicie la interfaz de Reflex localmente:
238
+
239
+ ```bash
240
+ backprop ui --port 7862
241
+ ```
242
+
243
+ Para exponer una URL accesible desde Internet, debe combinar `--share` con `--auth`:
244
+
245
+ ```bash
246
+ backprop ui --share --auth alice:hunter2
247
+ ```
248
+
249
+ `backprop ui --share` sin `--auth` termina con el código `1` y el error estructurado `[INPUT_AUTH_REQUIRED]`. La razón: `--share` publica una URL `*.gradio.live` que cualquier persona en Internet puede acceder, y sin autenticación, eso significa que cualquier persona puede controlar su canal de entrenamiento.
250
+
251
+ Para optar explícitamente por no usarlo (por ejemplo, en un entorno de desarrollo interno), establezca la variable de entorno `BACKPROPAGATE_SECURITY__REQUIRE_AUTH_FOR_SHARE=false`. Se imprimirá una advertencia audible en cada inicio, y hay un período de gracia de 5 segundos antes de que la interfaz de usuario sin autenticación se active, por lo que puede presionar `Ctrl-C` si parece incorrecta.
252
+
253
+ Las escrituras en el sistema de archivos desde la interfaz de usuario están aisladas en un solo directorio:
254
+
255
+ - Predeterminado: `~/.backpropagate/ui-outputs`
256
+ - Para sobrescribir: `BACKPROPAGATE_UI__OUTPUT_DIR=/path/you/own`
257
+ - La sobrescritura está **validada mediante una lista de denegación**; las rutas del sistema/credenciales (`/etc`, `/var`, `~/.ssh`, `~/.aws`, `C:\Windows\System32`, etc.) se rechazan con `[UI_OUTPUT_DIR_FORBIDDEN]`.
258
+
259
+ ## Soporte para Windows
260
+
261
+ Backpropagate está diseñado para funcionar en Windows de forma predeterminada:
262
+
263
+ - Pre-tokenización para evitar fallos de multiprocesamiento
264
+ - Desactivación automática de xformers para series RTX 40/50
265
+ - Configuración segura del cargador de datos
266
+ - Probado en RTX 5080 (16GB de VRAM)
267
+
268
+ ## Preajustes de modelos
269
+
270
+ | Preajuste | VRAM | Velocidad | Calidad |
271
+ |--------|------|-------|---------|
272
+ | Qwen 2.5 7B | ~12GB | Medio | Mejor |
273
+ | Qwen 2.5 3B | ~8GB | Rápido | Bueno |
274
+ | Llama 3.2 3B | ~8GB | Rápido | Bueno |
275
+ | Llama 3.2 1B | ~6GB | Más rápido | Básico |
276
+ | Mistral 7B | ~12GB | Medio | Bueno |
277
+
278
+ ## Arquitectura
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
+ ## Resolución de problemas
308
+
309
+ Un índice breve de los fallos más comunes al inicio. El índice inverso completo se encuentra en [la página del manual de resolución de problemas](https://mcp-tool-shop-org.github.io/backpropagate/handbook/troubleshooting/); cada código que se muestra a continuación está documentado en [códigos de error](https://mcp-tool-shop-org.github.io/backpropagate/handbook/error-codes/).
310
+
311
+ | Síntoma | Código | Solución |
312
+ |---------|------|-----|
313
+ | La GPU se queda sin memoria durante el entrenamiento. | `RUNTIME_GPU_OOM` | La recuperación automática de errores de memoria (B-002) reduce automáticamente el tamaño del lote hasta 3 veces. Para desactivar esta función: `Trainer(oom_recovery=False)`. Para forzar un tamaño de lote más pequeño: `--batch-size 1`. |
314
+ | El centro de descargas de Hugging Face devuelve un error 401 / "modelo no encontrado". | `DEP_MODEL_LOAD_FAILED` | Ejecute `huggingface-cli login` e inténtelo de nuevo. Para corregir errores tipográficos, copie el ID exacto de <https://huggingface.co/models>. |
315
+ | Error tipográfico en el nombre del modelo. | `INPUT_VALIDATION_FAILED` o `DEP_MODEL_LOAD_FAILED`. | Verifique el identificador `org/name` en <https://huggingface.co/models>. |
316
+ | `register_with_ollama` rechaza la conexión. | `DEP_OLLAMA_REGISTRATION_FAILED` | Inicie el demonio: `ollama serve`. Instálelo desde <https://ollama.com>. Se puede volver a intentar. |
317
+ | El disco se llena durante el guardado del punto de control. | `STATE_CHECKPOINT_INVALID` | Las escrituras atómicas dejan un directorio `.partial` en caso de fallo; es seguro eliminarlo. El punto de control anterior y válido está intacto. |
318
+ | El entrenamiento se pausa/interrumpe debido al sobrecalentamiento de la GPU. | `RUNTIME_GPU_TEMPERATURE_CRITICAL` | B-003: el monitor se pausa debido al umbral de temperatura de NVML; se reanuda automáticamente a medida que la GPU se enfría. Mejore el flujo de aire o reduzca la carga sostenida. |
319
+ | `backprop ui --share` es rechazado. | `INPUT_AUTH_REQUIRED` | Pase `--auth user:password` o configure `BACKPROPAGATE_SECURITY__REQUIRE_AUTH_FOR_SHARE=false` para desactivar esta función (con una advertencia). |
320
+ | "Superposición de validación" en múltiples ejecuciones. | `CONFIG_INVALID` (Etapa A, backend B-001). | Reduzca `--samples` por debajo del tamaño del conjunto de entrenamiento, aumente el conjunto de datos o desactive la validación. |
321
+ | La exportación a GGUF falló en el primer intento. | `RUNTIME_GGUF_EXPORT_FAILED` | `pip install backpropagate[export]`; en Windows, también necesita Visual C++ Build Tools + CMake. |
322
+
323
+ ## Informar de errores
324
+
325
+ Cuando algo falla, Backpropagate imprime una línea `run_started run_id=<uuid>` al inicio y asocia el mismo ID a los manifiestos de puntos de control, la historia de combinación de SLAO y las líneas de registro estructuradas. Incluya el `run_id` en cualquier informe de error; esto permite a un mantenedor correlacionar cada línea de registro, cada punto de control y cada combinación para esa ejecución específica.
326
+
327
+ Un buen informe de error incluye:
328
+
329
+ 1. **`run_id`** — el UUID impreso al inicio (también disponible como `TrainingRun.run_id` y `RunResult.run_id`).
330
+ 2. **El código de error** — la línea `[CODE_NAME]: message` en stderr es lo que debe buscar; consulte [códigos de error](https://mcp-tool-shop-org.github.io/backpropagate/handbook/error-codes/) para ver el catálogo.
331
+ 3. **La línea de comandos sin información confidencial.** La salida de error en modo no detallado se borra automáticamente (los tokens Bearer, `sk-*`, `hf_*`, las claves de AWS, los pares `password=/token=/api_key=` se eliminan): es seguro pegarla. Para obtener el rastreo completo y sin información confidencial, vuelva a ejecutar con `--verbose`, pero revise antes de publicarlo.
332
+ 4. **Versiones de Python / PyTorch, modelo de GPU, sistema operativo.** `backprop info` imprime todo esto de una vez.
333
+
334
+ ## Privacidad
335
+
336
+ Todo el entrenamiento se realiza localmente en su GPU. Backpropagate no realiza solicitudes de red excepto para descargar modelos de HuggingFace (lo cual usted inicia). No hay telemetría, ni dependencia de la nube.
337
+
338
+ ## Tabla de rendimiento
339
+
340
+ | Categoría | Puntuación | Notas |
341
+ |----------|-------|-------|
342
+ | A. Seguridad | 6/8 | SECURITY.md, modelo de confianza, sin secretos/telemetría, safe_path(). Se omiten los elementos de MCP. |
343
+ | B. Manejo de errores | 5/7 | Estructura de excepciones (`código`/`mensaje`/`indicación`/`causa`/`reintentable`) a través del registro ERROR_CODES; códigos de salida de la CLI: 0/1/2/3; no se muestran rastreos de pila sin `--verbose`; correlación con `run_id`; salida de error estándar (stderr) censurada; bloqueo mediante `--share` + `--auth`. MCP/escritorio/VS Code omitidos. |
344
+ | C. Documentación para operadores | 4/7 | README, CHANGELOG, LICENCIA, --help. Registro/MCP/elementos complejos omitidos. |
345
+ | D. Higiene del proceso de entrega | 6/9 | verify.sh, versión=etiqueta, 5 analizadores en CI, dependabot, python_requires, compilación limpia. |
346
+ | E. Identidad | 4/4 | Logotipo, traducciones, página de inicio, metadatos. |
347
+ | **Total** | **25/31** | 14 elementos omitidos con justificación. `shipcheck audit` pasa el 100%. Fecha de auditoría: 2026-05-21 (la fila B fue reevaluada después de la etapa B y el trabajo de códigos de salida de la CLI). |
348
+
349
+ Historial de diseño y correspondencia de cada elemento: consulte [ROADMAP.md](ROADMAP.md). Todos los elementos de las semanas 1 a 4 se incluyen en la versión 1.1.0.
350
+
351
+ ## Licencia
352
+
353
+ MIT: Consulte [LICENSE](LICENSE) para obtener más detalles.
354
+
355
+ ---
356
+
357
+ <p align="center">
358
+ Built by <a href="https://mcp-tool-shop.github.io/">MCP Tool Shop</a>
359
+ </p>