@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 +21 -21
- package/README.es.md +359 -0
- package/README.fr.md +359 -0
- package/README.hi.md +359 -0
- package/README.it.md +359 -0
- package/README.ja.md +359 -0
- package/README.md +306 -56
- package/README.pt-BR.md +359 -0
- package/README.zh.md +359 -0
- package/bin/backpropagate.js +6 -6
- package/package.json +12 -3
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>
|