Recuperar un modelo entrenado desde el hub de Hugging Face te permite continuar un entrenamiento o ejecutar inferencia sin volver a entrenar desde cero. Aquí verás cómo cargar pesos en PyTorch usando un checkpoint, inicializar un modelo nuevo y validar la predicción con un ejemplo real.
¿Cómo descargo un checkpoint desde Hugging Face Hub?
El flujo empieza con la función load de PyTorch, que lee el archivo .pth guardado en tu carpeta local de weights. Ese archivo contiene un diccionario con el estado de los pesos previamente entrenados.
python
checkpoint = torch.load('weights/model-checkpoint.pth')
Una vez cargado, tienes acceso a varias llaves dentro del diccionario: el estado del modelo, el estado del optimizador, la época y la pérdida. Cada una se usará para reconstruir el entorno tal como estaba al momento de guardar.
¿Qué es un checkpoint en PyTorch? Es un diccionario que guarda los pesos del modelo, los parámetros del optimizador y métricas como la época y la loss, para poder reanudar el entrenamiento o hacer inferencia.
¿Cómo inicializo un modelo nuevo con los mismos parámetros?
Necesitas crear una instancia con la misma estructura original: número de clases, tamaño del vocabulario y tamaño del embedding. A esa nueva instancia la llamamos modelo2, y al optimizador optimizer2, ambos espejo de los originales.
- Inicializa
modelo2 con los hiperparámetros originales del clasificador de texto.
- Inicializa
optimizer2 con torch.optim.SGD y una tasa de aprendizaje de 0.2.
- Mantén la arquitectura idéntica; los pesos llegarán después con
load_state_dict.
Después de instanciar, los pesos siguen siendo aleatorios. La transferencia real ocurre con load_state_dict, que copia los tensores entrenados al nuevo modelo.
python
modelo2.load_state_dict(checkpoint['model_state_dict'])
optimizer2.load_state_dict(checkpoint['optimizer_state_dict'])
Si todo cuadra, PyTorch responde con all keys matched successfully, confirmando que los parámetros entrenables se transfirieron correctamente.
¿Por qué aparece el error "SGD object is not subscriptable"?
Este error ocurre cuando guardaste el optimizador completo en lugar de su state_dict. Es un detalle pequeño pero crítico: PyTorch necesita el diccionario, no el objeto del optimizador.
¿Cómo soluciono el error "object is not subscriptable" al cargar un optimizador? Asegúrate de guardar optimizer.state_dict() dentro del checkpoint, no el optimizador completo. Solo el diccionario es subscriptable y permite la transferencia de parámetros.
La corrección consiste en regresar al código donde construyes el checkpoint, reemplazar el objeto por su state_dict(), volver a guardar el archivo y subirlo de nuevo al hub de Hugging Face usando upload_file con la API.
¿Qué pasos sigo para reemplazar el checkpoint en el hub?
- Corrige el guardado del optimizador con
optimizer.state_dict().
- Sube el nuevo
model-checkpoint.pth con upload_file de la API.
- Elimina el archivo erróneo local con
remove weights/model-checkpoint.pth.
- Descarga la versión corregida desde el hub al directorio
weights.
Un detalle importante: si no borras el archivo viejo, tu entorno local seguirá leyendo la versión errónea. Hugging Face conserva el historial de commits, así que puedes revisar cuándo se subió cada versión.
¿Cómo recupero la época y la pérdida del entrenamiento previo?
El checkpoint también guarda metadatos del entrenamiento. Esto te sirve si quieres reanudar exactamente desde donde te quedaste, sin perder el contador de épocas ni la última loss registrada.
python
epoch2 = checkpoint['epoch']
loss2 = checkpoint['loss']
Con estas variables puedes reanudar el bucle de entrenamiento moviendo modelo2 al device CUDA, o quedarte en CPU si solo harás inferencia. Para inferencia no necesitas GPU, así que mover el modelo a CPU es suficiente y ahorra recursos.
¿Cómo pruebo el modelo cargado con un ejemplo de inferencia?
Para validar que los pesos son los correctos, basta con un texto de prueba. En el ejercicio se usó una descripción del ajolote como entrada al clasificador de texto, pasándola por el text_pipeline que convierte palabras al vocabulario del modelo.
La predicción se mapea con el diccionario divipedia_label, que traduce el número de clase a una etiqueta legible en inglés. El resultado para el texto del ajolote fue la categoría animal, lo que confirma que los pesos descargados funcionan como se esperaba.
- Mueve el modelo a CPU con
modelo2.cpu() antes de inferir.
- Aplica
text_pipeline al ejemplo para tokenizarlo según el vocabulario.
- Mapea la predicción numérica a texto usando
divipedia_label.
Este ciclo completo, guardar, subir, descargar, cargar y predecir, te da un flujo reproducible para versionar modelos en Hugging Face. ¿En qué otros proyectos aplicarías este patrón de checkpointing? Cuéntanos en los comentarios qué casos te gustaría explorar.