Ultralytics YOLO27: Únete a la lista de espera.
Get Started
Desarrolla con Ultralytics Platform·Implementación y supervisión·Lección 10/10
Lecciónintermedio

Automatiza el ciclo de reentrenamiento

Convierte un despliegue en un ciclo repetible: un procedimiento operativo, una puerta de promoción con secuencia de comandos, un lanzamiento automatizado con reversión y una revisión semanal.

El primer despliegue es un proyecto; todos los siguientes son un proceso. Los equipos que automatizan el ciclo con secuencias de comandos vuelven a entrenar en una tarde cada vez que se activa una alerta del conjunto de retención; los que no lo hacen reconstruyen el proceso de memoria bajo presión y publican regresiones. En esta lección se ejecuta el ciclo completo una vez con el modelo de píldoras —ajuste fino, validación y lanzamiento— y se redacta el procedimiento operativo para que la próxima vez sea algo rutinario.

Resultado

Puedes completar un ciclo de reentrenamiento de principio a fin: ajustar con precisión una nueva versión del conjunto de datos, superar la puerta de promoción frente al modelo desplegado, lanzar la nueva versión con Reemplazar modelo desde una secuencia de comandos y volver a la versión anterior en un solo paso.

Vía rápida
Si ya tienes experiencia, aquí tienes un resumen.
  1. Activador: caída en el conjunto de retención, aumento de la tasa de edición o cambio de distribución en la pestaña Supervisión.

  2. Recopila datos con Guardar en conjunto de datos o Agents, etiquétalos con Anotación por lotes, revísalos y crea una versión.

  3. Ajusta con precisión el modelo desplegado indicando un optimizador explícito y lr0.

  4. Valida el modelo candidato frente al modelo desplegado; lánzalo con deployments.update(action="replace").

  5. Revierte sustituyéndolo por el modelo anterior; no lo elimines mientras sea el modelo al que puedes volver.

Práctico

El ciclo, con una persona responsable de cada paso#

La trazabilidad viene incluida si has seguido las lecciones anteriores: la tarjeta Run Information de un modelo indica su modelo de origen y la versión fijada del conjunto de datos; la pestaña Models del conjunto de datos muestra todos los modelos entrenados con cada versión; y la página de despliegue enlaza al modelo que sirve. Cuando la precisión caiga, empieza por el despliegue y sigue el camino hacia atrás.

Pestaña Models del conjunto de datos Logistics Safety de Ultralytics Platform, que muestra los modelos entrenados con él, con las columnas de estado, tarea, épocas, mAP50 y mAP50-95

Agents automatiza el paso de recopilación. Collect Uncertain Detections predice con tu despliegue y copia las imágenes cuyas detecciones se encuentran dentro de un intervalo de confianza en un conjunto de datos de revisión; Capture and Alert guarda las imágenes coincidentes y publica un mensaje en Slack. Los flujos de trabajo se ejecutan cuando haces clic en Run, así que incluye una ejecución en la revisión semanal.

Lienzo de Agents de Ultralytics Platform con un bloque de imagen de entrada conectado a un bloque YOLO de detección de personas, una condición para cuando aparece una persona, un bloque de modelo de lenguaje para describir la escena y un bloque de salida

Ejemplo práctico: un ciclo completo con el modelo de pastillas#

1. Ajusta el modelo desplegado. En Platform, selecciona el modelo desplegado en My Models, activa Save Dataset Version y establece explícitamente el optimizador. En local, el mismo paso es:

from ultralytics import YOLO

model = YOLO("pills-v1.pt")  # el archivo best.pt del modelo desplegado
model.train(data="medical-pills.yaml", epochs=5, imgsz=320, optimizer="SGD", lr0=0.001, name="v2-finetune")

Este es el ajuste de Train, Read, and Fine-Tune Runs: mAP50-95 0.659 → 0.687.

2. Evalúalo frente al modelo desplegado. Reutiliza gate.py de la lección 6 con el conjunto de reserva y los dos checkpoints:

DATA = "medical-pills.yaml"  # el YAML de tu conjunto de reserva o URI ul://
BASELINE, CANDIDATE = "pills-v1.pt", "pills-v2.pt"  # modelo desplegado frente al candidato reentrenado
PASS mAP50-95 0.659 -> 0.687 beats noise
PASS every class keeps 90% of its AP (weak: none)
PASS inference 4.0 ms within 100 ms
verdict: ship the candidate

La comprobación termina con el código 0, así que CI puede continuar con el paso de lanzamiento. (En esta demostración, la partición de validación de medical-pills hace las veces de conjunto de reserva; en producción, usa una versión del conjunto de reserva que el modelo nunca haya visto.)

3. Lánzalo. Sube o entrena el candidato en el mismo espacio de trabajo y, después, deja que CI llame a Replace model mediante el SDK ultralytics-platform y confirme qué modelo está sirviendo:

import time

from ultralytics_platform import Platform

OWNER, DEPLOYMENT = "your-username", "pill-detector-st-ghislain"
PROJECT, NEW_MODEL = "pill-inspection", "v2-finetune"

with Platform() as client:  # reads ULTRALYTICS_API_KEY
    body = {"action": "replace", "project": PROJECT, "model": NEW_MODEL}
    reply = client.deployments.update(OWNER, DEPLOYMENT, body=body)
    print(reply["status"], "-", reply["message"])  # "deploying" while the new model starts
    while (deployment := client.deployments.retrieve(OWNER, DEPLOYMENT)["deployment"])["status"] == "deploying":
        time.sleep(15)
    print(f"status={deployment['status']} model={deployment.get('model')}")
    if deployment.get("model") != NEW_MODEL:  # a failed rollout leaves the previous model serving
        raise SystemExit("Replacement failed; the previous model is still live")

Con una API simulada que informa de deploying una vez y después de ready, se muestra:

deploying - Replacement model is deploying
status=ready model=v2-finetune

deployments.update envía PATCH /api/deployments/{owner}/{deployment} con action: "replace"; el modelo anterior sigue sirviendo hasta que el nuevo esté listo. El ciclo consulta retrieve hasta que el estado deja de ser deploying; después, comprueba el modelo que está sirviendo, porque una implementación fallida también termina en ready, pero conserva el modelo anterior. Para volver atrás, usa el mismo script con NEW_MODEL establecido en la versión anterior. La herramienta de línea de comandos ul cloud que se distribuye con ultralytics utiliza la misma API, y la referencia de la API documenta todas las llamadas.

4. Restablece la referencia. Ejecuta holdout_check.py de la lección 8 con el nuevo checkpoint y un archivo de historial nuevo.

Escribe el manual de operaciones#

# Retraining runbook: pill-detector

## Trigger
- Holdout mAP50-95 more than 1 point below baseline for 2 consecutive weeks, OR
- Batch Annotation edit rate above 25% on a new batch.

## Steps
1. Collect: Save to dataset from Monitoring, plus the "Collect Uncertain Detections" agent into pill-review.
2. Label: Batch Annotation with the deployed model at the swept threshold; review every image; record the edit rate.
3. Merge into the training dataset; rerun the duplicate check, class audit, and Clustering.
4. Create dataset version v(n+1) with a description of what changed.
5. Fine-tune from the deployed model with Save Dataset Version on; optimizer SGD, lr0 0.001.
6. Run gate.py against the deployed model on the holdout. Stop here on any FAIL.
7. ML lead approves; CI runs release.py.
8. Watch endpoint_check.py for 24 hours; start a new holdout baseline.

## Rollback
- Run release.py with NEW_MODEL set to the previous version. Never delete that model while it's the rollback target.

## Owner
- ML lead approves step 7. On-call runs steps 1-6 and 8.

Reserva en el calendario una revisión semanal de 15 minutos con dos preguntas: ¿hay algo en rojo (comprobación del endpoint, conjunto de reserva, tasa de edición)? ¿Ha cambiado algo en el despliegue y por qué? La mayoría de las semanas, la respuesta a ambas preguntas es no y la reunión dura cinco minutos. Un trimestre típico sería así:

   Week 1   : Holdout alert. Collect, label, retrain, gate, release v(n+1).
   Week 2-3 : Quiet. Checks green.
   Week 4   : New defect class requested. Label, new version, retrain v(n+2).
   Week 5-7 : Quiet.
   Week 8   : Second plant in Poland. Check regions; add an endpoint in europe-central2.
   Week 9-11: Quiet.
   Week 12  : Quarterly holdout refresh and review.

Errores habituales#

Eliminar el objetivo de reversión

Síntoma: una publicación sale mal y el modelo anterior ya no está. Solución: conserva en el proyecto al menos los dos últimos modelos de producción. Al eliminar un modelo, se mueve a la papelera, y eliminarlo permanentemente también elimina cualquier despliegue que siga sirviéndolo.

Esperar un despliegue gradual

Síntoma: planeaste una prueba canaria del 10 %/50 %/100 %, pero Replace model cambia todo el tráfico de una vez. Solución: los endpoints sirven un solo modelo. Para una prueba canaria, despliega el candidato en un segundo endpoint y divide el tráfico en tu propio enrutador; después, sustituye el modelo y elimina el segundo endpoint.

Usar como criterio de aceptación los datos con los que entrenaste

Síntoma: todos los candidatos superan el criterio de aceptación, pero el rendimiento en producción sigue empeorando. Solución: el criterio de aceptación solo es fiable con una versión de reserva con la que no se haya entrenado ninguna ejecución. Mantén el conjunto de reserva en su propio conjunto de datos privado y no lo combines nunca con los datos de entrenamiento.

Pruébalo

Escribe el manual de operaciones de tu proyecto con el formato anterior: incluye un desencadenante medible, pasos que indiquen la función de Platform y el script correspondientes, un procedimiento para volver atrás y las personas responsables. Después, completa un ciclo: ajusta el modelo desplegado con una nueva versión del conjunto de datos, ejecuta gate.py con ese modelo en tu conjunto de reserva y, si supera la comprobación, lánzalo con release.py (o con Replace model en la interfaz) y restablece la referencia del conjunto de reserva.

Commit
git add retraining-runbook.md gate.py release.py && git commit -m "ops: add retraining runbook, promotion gate, and release script"
Cuándo se considera terminado
Has terminado la lección cuando se cumplen todas estas condiciones.
  • Tu manual de operaciones tiene un desencadenante medible, pasos numerados, un procedimiento para volver atrás y personas responsables identificadas.

  • gate.py ha emitido un veredicto sobre un candidato real frente al modelo desplegado.

  • El endpoint sirve el modelo que ha superado la comprobación, el modelo anterior sigue en el proyecto y hay una nueva fila de referencia del conjunto de reserva.

Mostrar solución

Ciclo práctico para la línea de pastillas. Desencadenante: la comprobación del conjunto de reserva del turno de noche bajó 0.05. Recopilación: se guardaron 180 ejemplos de Monitoring del turno de tarde en pill-review, además de 120 del agente Collect Uncertain Detections; Batch Annotation a 0.35 con el v2-finetune desplegado, tasa de edición del 18 %; revisados y combinados; auditorías correctas; versión v6: +300 night-shift frames. Ajusta v3-night a partir de v2-finetune, con SGD, lr0 0.001 y 20 épocas. Evalúa con el conjunto de reserva de 300 imágenes, incluidas 100 imágenes nocturnas: mAP50-95 0.66 → 0.71, sin clases débiles, 4 ms: APROBADO. release.py con NEW_MODEL = "v3-night" informa de status=ready model=v3-night; holdout_check.py escribe una nueva referencia de 0.71. v2-finetune permanece en el proyecto como modelo de referencia para volver atrás, y el manual de operaciones, la comprobación y el script de lanzamiento se confirman juntos.

Qué viene después

Curso completado: haz el examen final para obtener el certificado Build with Ultralytics Platform y, después, profundiza en la inferencia en el edge y autohospedada con Ultralytics YOLO in Production.