Mejores Prácticas de Aprendizaje Profundo
Reglas para el entrenamiento y despliegue reproducible y eficiente de PyTorch. Aplicar durante la revisión de código y antes de escalar a multi-GPU.
Cómo Usar Esta Lista
- Las Reglas A-B cubren la configuración y los pipelines de datos.
- Las Reglas C-D rigen el entrenamiento y la evaluación.
- Las Reglas E-F cubren la exportación y la producción.
- Revisar al cambiar hardware, versión del framework o arquitectura del modelo.
A - Reproducibilidad
- Establecer semillas aleatorias.
torch.manual_seed(42),np.random.seed(42)y elgeneratorde DataLoader para ejecuciones reproducibles. - Fijar versiones de PyTorch y CUDA. Registrar
torch.__version__y el driver de CUDA en los logs del experimento. - Guardar hiperparámetros con los checkpoints. Incluir LR, tamaño de lote, configuración de arquitectura y versión del dataset.
- Usar flags deterministas al depurar.
torch.use_deterministic_algorithms(True)para reproducibilidad (puede reducir el rendimiento).
B - Pipeline de Datos
- Separar transformaciones de entrenamiento y validación. Aumentos aleatorios solo en entrenamiento; transformaciones deterministas en validación/prueba.
- Usar
pin_memoryynon_blockingcon CUDA. Superponer la transferencia de datos con la computación de la GPU. - Establecer
num_workersapropiadamente. 4-8 workers en máquinas multi-núcleo; 0 en notebooks. - Validar un solo lote antes de entrenar. Imprimir formas, tipos de datos y rangos de valores para detectar errores en el pipeline tempranamente.
C - Entrenamiento
- Llamar
model.train()ymodel.eval()correctamente. Dropout y batch norm dependen del modo. - Usar
zero_grad(set_to_none=True)antes debackward. Previene errores de acumulación de gradientes. - Recortar gradientes para RNNs y redes profundas.
clip_grad_norm_(model.parameters(), 1.0). - Usar precisión mixta en CUDA.
torch.amp.autocast+GradScalerpara una aceleración 2x. - Guardar checkpoints en mejoras de validación. No guardar solo la última época.
- Monitorizar métricas de validación cada época. La pérdida de entrenamiento por sí sola oculta el sobreajuste.
D - Diseño del Modelo
- Empezar desde pesos preentrenados cuando los datos son limitados. ImageNet para visión, HF hub para NLP.
- Usar tasas de aprendizaje diferenciales para el ajuste fino. LR más bajo para capas preentrenadas, más alto para la nueva cabeza.
- Emparejar la función de pérdida con la tarea.
CrossEntropyLosspara multi-clase;BCEWithLogitsLosspara multi-etiqueta. - Perfilar antes de optimizar. Identificar si la carga de datos o la computación de la GPU es el cuello de botella.
E - Checkpointing y Exportación
- Guardar
state_dict, no objetos completos del modelo. Reconstruir la clase del modelo al cargar. - Usar
weights_only=Trueal cargar checkpoints. Mejor práctica de seguridad de PyTorch 2.6+. - Exportar en modo
eval.model.eval()antes de trazar TorchScript o exportar ONNX. - Verificar que la salida del modelo exportado coincide con PyTorch.
torch.allclosecontra la salida de ONNX Runtime.
F - Producción
- Versionar artefactos del modelo en un registro. Vincular cada artefacto al hash de los datos de entrenamiento y las métricas.
- Incluir el esquema de entrada en el contrato de servicio. Forma del tensor esperada, tipo de datos y normalización.
- Probar la latencia y memoria de inferencia. Perfilar los tamaños de lote esperados en producción.
- Planificar el costo de la GPU. Usar instancias spot, precisión mixta y modelos del tamaño adecuado.
Preguntas Frecuentes
¿Cuál es el error de entrenamiento más común?
- Olvidar
model.eval()durante la validación. - Dropout aleatoriza las predicciones; batch norm usa estadísticas del lote.
- Las métricas de validación pierden sentido.
¿Cómo hago que el entrenamiento sea reproducible?
torch.manual_seed(42)
torch.cuda.manual_seed_all(42)
generator = torch.Generator().manual_seed(42)
loader = DataLoader(ds, generator=generator, shuffle=True)- La reproducibilidad completa en GPU puede requerir el flag de algoritmos deterministas.
¿Cuándo debería usar PyTorch Lightning?
- El boilerplate para multi-GPU, logging y checkpointing se acumula.
- Lightning vale la pena para proyectos en equipo y entrenamiento en producción.
- Aprende primero los bucles manuales para habilidades de depuración.
¿Cómo evito CUDA OOM?
- Reducir el tamaño del lote, habilitar precisión mixta, usar acumulación de gradientes.
torch.cuda.empty_cache()entre experimentos.
¿Debería usar torch.compile?
- Sí, para entrenamiento/inferencia repetida en PyTorch 2.6+.
- La primera iteración es lenta (compilación); haz benchmarks antes de comprometerte.
¿Cómo reviso un PR de entrenamiento?
- Comprueba el cambio de modo train/eval, la colocación del dispositivo y el guardado de checkpoints.
- Verifica que se registran las métricas de validación.
- Ejecuta el equivalente a
fast_dev_run(pocos lotes) para validar el bucle.
¿Qué debe incluir una configuración de entrenamiento?
- Tamaño del lote, LR, épocas, arquitectura del modelo, ruta del dataset, semilla y optimizador.
- Usa YAML/JSON o Hydra para configuraciones de experimentos reproducibles.
¿Cómo detecto un cuello de botella en la carga de datos?
- Utilización de GPU por debajo del 50% durante el entrenamiento (comprueba
nvidia-smi). - Aumenta
num_workersypin_memory. - Pre-cachea datos preprocesados en disco.
¿Cuándo vale la pena el entrenamiento distribuido?
- Una sola época tarda horas en una GPU.
- Aceleración casi lineal con DDP en 2-8 GPUs.
- No vale la pena la complejidad para experimentos rápidos.
¿Cómo documento un modelo entrenado?
- Arquitectura, datos de entrenamiento, métricas, limitaciones y especificación de entrada/salida.
- Incluye la versión de PyTorch y el hardware utilizado para el entrenamiento.
¿Qué pruebas debe tener el código de inferencia?
def test_model_output_shape():
out = model(torch.randn(1, 3, 224, 224))
assert out.shape == (1, num_classes)- Forma, tipo de datos y una prueba de entrada dorada con salida dorada.
¿Cómo elijo el tamaño del lote?
- El más grande que quepa en la memoria de la GPU sin OOM.
- Escala el LR con el tamaño del lote (regla de escalado lineal) al aumentar.
- Usa acumulación de gradientes para lotes efectivos más grandes.
Relacionado
- Training Loops - implementación del bucle
- GPUs & Mixed Precision - configuración de AMP
- Saving, Loading & Export - formato de artefactos
- Experiment Tracking - registro de ejecuciones
- Distributed Training - escalado horizontal
Versiones de la pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.