15. Entrenando tu primera política ACT
Capítulo 15 del curso para principiantes de SO-ARM Physical AI — entiende batch size, learning rate y pasos de entrenamiento, entrena tu primera política ACT con lerobot-train, vigila la pérdida y la GPU, y gestiona los checkpoints.
15.1 Tres configuraciones clave: batch size, learning rate, pasos
15.1 Tres configuraciones clave: batch size, learning rate, pasos
Batch size
Cuántos fotogramas ve el modelo por actualización. Batches mayores entrenan más estable pero consumen más VRAM. Si te quedas sin memoria CUDA, baja primero el batch. Empieza con el valor por defecto y tócalo solo si es necesario.
Learning rate
Cuánto se mueven los parámetros en cada actualización. Muy alto — la pérdida oscila o explota; muy bajo — el entrenamiento arrastra. El valor por defecto de ACT (orden de 1e-5) está bien probado para tareas de mesa; no lo cambies en la primera corrida.
Pasos de entrenamiento
Cuántas actualizaciones en total. Para tareas tipo SO-ARM, 100k-300k pasos es lo habitual; más pasos ayudan en tareas difíciles pero arriesgan sobreajuste. Guíate por la curva: cuando la pérdida de validación deja de mejorar, para.
Estrategia de la primera corrida: deja todo por defecto, entrena 100k pasos, evalúa en el robot real (Capítulo 16) y luego decide qué ajustar. Los principiantes pierden más tiempo afinando a ciegas que entrenando dos veces.
15.2 Guardar y gestionar checkpoints
15.2 Guardar y gestionar checkpoints
No hace falta guardar a mano: se guarda un checkpoint cada save_freq pasos más uno final last. Puedes poner un paso alto y luego elegir el modelo de menos pasos, descartando los sobreentrenados.
outputs/train/act_so101_test/
├── train_config.json ← Configuración completa (necesaria para reanudar)
└── checkpoints/
├── 0020000/pretrained_model/ ← Archivo por cada hito
├── 0040000/pretrained_model/
├── ...
└── last/pretrained_model/ ← Último checkpoint, usado en el Capítulo 16
- Disco: cada checkpoint son pesos completos; docenas suman. Estable el entrenamiento, puedes borrar los tempranos y quedarte con
last. - En la inferencia,
--policy.pathapunta acheckpoints/last/pretrained_model.
15.3 Empezar a entrenar
15.3 Empezar a entrenar
Todo verificado — arranca (en el entorno conda lerobot). Para un dataset local (grabado en el Capítulo 12), asegúrate de que el repo_id coincida con el de la recolección y añade --policy.push_to_hub=false:
lerobot-train \
--dataset.repo_id=seeedstudio123/test \
--policy.type=act \
--output_dir=outputs/train/act_so101_test \
--job_name=act_so101_test \
--policy.device=cuda \
--wandb.enable=false \
--policy.push_to_hub=false \
--steps=300000
Para un dataset en Hugging Face Hub, usa tu usuario:
lerobot-train \
--dataset.repo_id=${HF_USER}/so101_test \
--policy.type=act \
--output_dir=outputs/train/act_so101_test \
--job_name=act_so101_test \
--policy.device=cuda \
--wandb.enable=false \
--steps=300000
Qué hace cada argumento:
- Dataset:
--dataset.repo_idapunta al del Capítulo 12. - Pasos:
--steps=300000. El algoritmo va más alto por defecto; ajústalo según dificultad y curva. - Política:
--policy.type=actcarga la configuración ACT, que se adapta automáticamente a estados, acciones y cámeras — todo ya está en el dataset. Otras opciones:diffusion,pi0,pi0fast,smolvla,groot. - Dispositivo:
--policy.device=cudapara GPUs NVIDIA;mpsen Apple Silicon. - Visualización: reactiva
--wandb.enable=truepara graficar con Weights and Biases (anteswandb login).
Las RTX de la serie 50 deben añadir --dataset.video_backend=pyav — evita APIs ausentes en la torchvision preliminar. Comando completo:
lerobot-train \
--dataset.repo_id=seeedstudio123/test \
--dataset.video_backend=pyav \
--policy.type=act \
--output_dir=outputs/train/act_so101_test \
--policy.device=cuda \
--wandb.enable=false \
--policy.push_to_hub=false \
--steps=300000
15.4 Vigilar la pérdida y la GPU
15.4 Vigilar la pérdida y la GPU
- Pérdida: impresa cada
log_freqpasos. Espera una caída rápida al inicio y luego un descenso largo y suave — eso es sano. Si sube u oscila violentamente, el learning rate no encaja con tu equipo. - GPU: observa VRAM y uso con
nvidia-smi(owatch -n 1 nvidia-smi). Uso cercano a 0% durante ratos = el cuello de botella es la tubería de datos (disco/CPU), no la GPU. - Tiempos orientativos: 50 episodios tardan ~6 horas en una RTX 3060 8GB de portátil y 2–3 horas en una RTX 4090 o A100. Depende de tamaño, resolución, batch y hardware.
15.5 Reanudar un entrenamiento interrumpido
15.5 Reanudar un entrenamiento interrumpido
Para reanudar desde last, devuélvele la configuración guardada:
lerobot-train \
--config_path=outputs/train/act_so101_test/checkpoints/last/pretrained_model/train_config.json \
--resume=true
Subir los checkpoints (opcional)
Al terminar, sube el último:
huggingface-cli upload ${HF_USER}/act_so101_test \
outputs/train/act_so101_test/checkpoints/last/pretrained_model
15.6 Errores comunes de entrenamiento
15.6 Errores comunes de entrenamiento
| Error | Solución |
|---|---|
TypeError: stack(): argument 'tensors' must be tuple of Tensors, not Column | pip install datasets==2.19 |
| CUDA sin memoria | Baja el batch; cierra otros procesos GPU; usa --dataset.video_backend=pyav |
No valid stream found in input file al cargar | conda install ffmpeg=7.1.1 -c conda-forge (arreglo del Capítulo 5) |
| Dataset no encontrado | Revisa el repo_id exacto de la grabación; la carpeta está bajo ~/.cache/huggingface/lerobot/ |
Con un checkpoints/last/pretrained_model entrenado en la mano, el próximo capítulo lo lleva al brazo real.