|
|
|
|
|
import json |
|
from time import time |
|
|
|
from ultralytics.hub.utils import HUB_WEB_ROOT, PREFIX, events |
|
from ultralytics.utils import LOGGER, SETTINGS |
|
|
|
|
|
def on_pretrain_routine_end(trainer): |
|
"""Logs info before starting timer for upload rate limit.""" |
|
session = getattr(trainer, "hub_session", None) |
|
if session: |
|
|
|
session.timers = { |
|
"metrics": time(), |
|
"ckpt": time(), |
|
} |
|
|
|
|
|
def on_fit_epoch_end(trainer): |
|
"""Uploads training progress metrics at the end of each epoch.""" |
|
session = getattr(trainer, "hub_session", None) |
|
if session: |
|
|
|
all_plots = { |
|
**trainer.label_loss_items(trainer.tloss, prefix="train"), |
|
**trainer.metrics, |
|
} |
|
if trainer.epoch == 0: |
|
from ultralytics.utils.torch_utils import model_info_for_loggers |
|
|
|
all_plots = {**all_plots, **model_info_for_loggers(trainer)} |
|
|
|
session.metrics_queue[trainer.epoch] = json.dumps(all_plots) |
|
|
|
|
|
if session.metrics_upload_failed_queue: |
|
session.metrics_queue.update(session.metrics_upload_failed_queue) |
|
|
|
if time() - session.timers["metrics"] > session.rate_limits["metrics"]: |
|
session.upload_metrics() |
|
session.timers["metrics"] = time() |
|
session.metrics_queue = {} |
|
|
|
|
|
def on_model_save(trainer): |
|
"""Saves checkpoints to Ultralytics HUB with rate limiting.""" |
|
session = getattr(trainer, "hub_session", None) |
|
if session: |
|
|
|
is_best = trainer.best_fitness == trainer.fitness |
|
if time() - session.timers["ckpt"] > session.rate_limits["ckpt"]: |
|
LOGGER.info(f"{PREFIX}Uploading checkpoint {HUB_WEB_ROOT}/models/{session.model.id}") |
|
session.upload_model(trainer.epoch, trainer.last, is_best) |
|
session.timers["ckpt"] = time() |
|
|
|
|
|
def on_train_end(trainer): |
|
"""Upload final model and metrics to Ultralytics HUB at the end of training.""" |
|
session = getattr(trainer, "hub_session", None) |
|
if session: |
|
|
|
LOGGER.info(f"{PREFIX}Syncing final model...") |
|
session.upload_model( |
|
trainer.epoch, |
|
trainer.best, |
|
map=trainer.metrics.get("metrics/mAP50-95(B)", 0), |
|
final=True, |
|
) |
|
session.alive = False |
|
LOGGER.info(f"{PREFIX}Done β
\n" f"{PREFIX}View model at {session.model_url} π") |
|
|
|
|
|
def on_train_start(trainer): |
|
"""Run events on train start.""" |
|
events(trainer.args) |
|
|
|
|
|
def on_val_start(validator): |
|
"""Runs events on validation start.""" |
|
events(validator.args) |
|
|
|
|
|
def on_predict_start(predictor): |
|
"""Run events on predict start.""" |
|
events(predictor.args) |
|
|
|
|
|
def on_export_start(exporter): |
|
"""Run events on export start.""" |
|
events(exporter.args) |
|
|
|
|
|
callbacks = ( |
|
{ |
|
"on_pretrain_routine_end": on_pretrain_routine_end, |
|
"on_fit_epoch_end": on_fit_epoch_end, |
|
"on_model_save": on_model_save, |
|
"on_train_end": on_train_end, |
|
"on_train_start": on_train_start, |
|
"on_val_start": on_val_start, |
|
"on_predict_start": on_predict_start, |
|
"on_export_start": on_export_start, |
|
} |
|
if SETTINGS["hub"] is True |
|
else {} |
|
) |
|
|