16. Entrenar tu primera política ACT
Capítulo 16 del Curso de Introducción a la IA Física de Seeed: tamaño de lote, tasa de aprendizaje y pasos, gestión de checkpoints, inicio del entrenamiento, monitorización de la pérdida y del estado de la GPU, y reanudación de entrenamientos interrumpidos.
16.1 Tres configuraciones clave: tamaño de lote, tasa de aprendizaje, pasos
16.1 Tres configuraciones clave: tamaño de lote, tasa de aprendizaje, pasos
En la terminal, ejecuta nvidia-smi para comprobar tu GPU y VRAM; las GPU de consumo (p. ej., 3050) también pueden entrenar.
Tamaño de lote
Si tienes margen de VRAM, auméntalo para acelerar la convergencia, pero no lo fuerces más allá de la VRAM disponible.
| Config | Escenario |
|---|---|
| 8 GB de VRAM o menos | Puede entrenar; usa un tamaño de lote pequeño: 8 GB → batch size 4, 4 GB → batch size 2. |
| 12 GB+ de VRAM | Zona cómoda; usa el tamaño de lote por defecto; si la VRAM es grande, pon batch size=16 |
| Solo GPU integrada / sin GPU NVIDIA | Entrena en un servidor en la nube |
Tasa de aprendizaje
El "tamaño de paso" por actualización. ACT viene con presets: optimizador AdamW, tasa de aprendizaje 1e-5, weight decay 1e-4, visual backbone en 1e-5. Los presets de la política están activados por defecto (use_policy_training_preset), así que estos valores se aplican automáticamente; no necesitas escribir nada. Un paso demasiado grande provoca oscilación o divergencia de la pérdida; uno demasiado pequeño duplica el tiempo de entrenamiento. No lo toques en tu primer entrenamiento: son valores ajustados a partir del paper original y de mucha práctica.
- Si cambias el tamaño de lote o los pasos, no hace falta ajustar la tasa de aprendizaje.
- Si haces fine-tuning/reanudas desde un checkpoint ya entrenado, reduce la tasa de aprendizaje a
1e-6–3e-6(3–10 veces menor). - Si la pérdida de entrenamiento apenas baja (se queda plana), no subas la LR todavía; primero añade pasos/datos y luego prueba con
2e-5.
Añade el siguiente código; cámbialos juntos al mismo valor:
--policy.optimizer_lr=1e-6 \
--policy.optimizer_lr_backbone=1e-6
Pasos de entrenamiento
Para 50 episodios, si no quieres leer la explicación de los pasos de abajo, simplemente ejecútalo con 80.000 (50 episodios).
Los pasos escalan proporcionalmente: si el tamaño de lote se reduce a la mitad, las muestras vistas por paso se reducen a la mitad; para dar al modelo el mismo número de pasadas (epochs), los pasos deben duplicarse. Por ejemplo, tamaño de lote por defecto=8, pasos=80000; batch size=4 → pasos=160000; batch size=2 → pasos×4; batch size=16 → pasos÷2.
También puedes fijar más pasos: durante el entrenamiento puedes pulsar Ctrl+C para parar en cualquier momento, decidiendo si parar según la pérdida y otros parámetros; el modelo generado hasta ese momento se guarda automáticamente.
- Total de frames ≈ duración total de las grabaciones de vídeo.
- epoch (una pasada) = el alumno ve toda la grabación de principio a fin.
- steps = cuántos segmentos ha visto el alumno en total.

16.2 Guardar y gestionar checkpoints
16.2 Guardar y gestionar checkpoints
No hace falta guardar manualmente: se guarda un checkpoint cada 20.000 pasos (save_freq), más uno final al terminar. Así que está bien fijar un número grande de pasos: puedes elegir el modelo de pasos más bajos y descartar los que estén poco entrenados o sobreajustados.
outputs/train/act_grab_cube_v1/
├── train_config.json ← Full config for this run (needed to resume)
└── checkpoints/
├── 0020000/pretrained_model/ ← Model archive at each step count
├── 0040000/pretrained_model/
├── ...
└── last/pretrained_model/ ← Last checkpoint, used in Chapter 17
- Uso de disco: cada checkpoint es un archivo completo de pesos del modelo; unas cuantas docenas se acumulan. Una vez que el entrenamiento se estabiliza, se pueden borrar los checkpoints tempranos/medios, dejando solo
last. - Durante la inferencia,
--policy.pathapunta acheckpoints/last/pretrained_model.
16.3 Iniciar el entrenamiento
16.3 Iniciar el entrenamiento
Todas las comprobaciones superadas: inicia (en el entorno conda lerobot):
lerobot-train \
--dataset.repo_id=seeed_rebot_b601_rs/test \
--policy.type=act \
--output_dir=outputs/train/act_rebot_test \
--job_name=act_rebot_test \
--policy.device=cuda \
--wandb.enable=false \
--policy.push_to_hub=false \
--steps=100000
Si usas una GPU RTX serie 50, añade --dataset.video_backend=pyav para evitar APIs que faltan en la versión preliminar de torchvision.
Si la VRAM es insuficiente o quieres fijar más de una vez, añade --batch_size para establecer el tamaño de lote.
Notas sobre los parámetros:
| Parámetro | Significado |
|---|---|
--dataset.repo_id | Nombre del dataset del Capítulo 13 (usa directamente el nombre local; para Hub usa ${HF_USER}/xxx) |
--policy.type=act | Tipo de política; también se puede usar diffusion, smolvla, etc. En esta etapa se usa ACT |
--output_dir | Directorio para todas las salidas de entrenamiento |
--job_name | Nombre para esta ejecución, usado en los logs para distinguir ejecuciones |
--policy.device=cuda | Entrenar en GPU |
--wandb.enable=false | Desactivar el panel online de wandb (regístrate y actívalo si quieres; no es obligatorio) |
--policy.push_to_hub=false | No subir aún al Hub; espera hasta que la evaluación del Capítulo 17 sea satisfactoria |
--steps | Pasos de entrenamiento |
--batch_size | Tamaño de lote |
Estimación de tiempo: 100k pasos en una GPU de consumo suelen llevar unas pocas horas, dependiendo de la GPU y del tamaño de lote.
16.4 Monitorizar la pérdida y el estado de la GPU
16.4 Monitorizar la pérdida y el estado de la GPU
Tras pulsar Enter, la terminal empieza a mostrar los logs de entrenamiento. LeRobot imprime una línea de resumen cada 200 pasos (controlado por --log_freq), como esta:
step: 10000 smpl: 80K ep: 35.6 loss: 1.832 grdn: 12.4 lr: 1.0e-05 updt_s: 0.21 data_s: 0.003 eta: 3:42:10
Campo por campo (los nombres de campo pueden variar ligeramente entre versiones):
| Campo | Significado | En qué fijarse |
|---|---|---|
step | Paso actual | Compáralo con --steps para comprobar el progreso |
ep | Epochs entrenadas | Corresponde a "cuántas veces se ha visto la grabación" |
loss | Pérdida de entrenamiento | Caída rápida al principio, descenso lento después, pequeñas fluctuaciones es la forma normal |
grdn | Norma del gradiente | Un pico repentino a cientos/miles indica entrenamiento inestable |
lr | Tasa de aprendizaje actual | Confirma que es el valor esperado |
updt_s / data_s | Tiempo de actualización/carga de datos por paso | Un data_s grande significa que la carga de datos es el cuello de botella |
eta | Tiempo restante estimado | Decide si ir a comer o dormir |
Tendencias normales de estas métricas, en tres categorías:
- Debería seguir bajando —
loss. La bajada tiene tres fases: caída pronunciada inicial, descenso gradual medio, pequeñas fluctuaciones a un nivel bajo al final, aplanándose en conjunto. Esta curva de "rápido, luego lento y luego plana" es una curva de convergencia sana. Dos formas anómalas a vigilar: nunca baja (problema de datos/configuración: comprueba las claves de la cámara); baja y luego vuelve a subir (divergencia del entrenamiento: reduce la LR a la mitad y vuelve a entrenar). - Debería converger en conjunto con cierto ruido —
grdn(norma del gradiente). La tendencia general sigue a la pérdida hacia abajo y se estabiliza, pero los picos son normales: un pico ocasional que se recupera está bien; lo peligroso es una amplificación continua, ola tras ola más alta: eso es un precursor de divergencia; trátalo como arriba: baja la LR. - Debería mantenerse constante —
lr,updt_s,data_s, utilización de la GPU.lrse mantiene en tu valor fijado todo el tiempo, solo para tu confirmación; el tiempo por paso (updt_s/data_s) y la utilización de la GPU conwatch -n 1 nvidia-smideberían ser estables: una utilización persistentemente baja o muy fluctuante significa que la GPU está esperando datos; el cuello de botella es la carga de datos, no la GPU.


16.5 Reanudar un entrenamiento interrumpido
16.5 Reanudar un entrenamiento interrumpido
Si el entrenamiento pierde alimentación, red o terminal a mitad de ejecución, no hace falta empezar de cero: mientras se haya guardado al menos un checkpoint (es decir, el entrenamiento haya pasado de 20.000 pasos):
lerobot-train \
--config_path=outputs/train/act_rebot_test/train_config.json \
--resume=true
- La reanudación usa la configuración guardada: el entrenamiento reanudado usa la configuración guardada en
train_config.json; se ignoran los parámetros de línea de comandos. Para cambiar parámetros (p. ej., pasos, tamaño de lote), inicia una nueva ejecución; no uses resume. - Continúa desde el último checkpoint: se restauran el estado del optimizador y el contador de pasos; la curva de pérdida continúa sin saltos.