|
|
|
# Ultralytics YOLO 🚀, GPL-3.0 license
|
|
|
|
|
|
|
|
import json
|
|
|
|
from time import time
|
|
|
|
|
|
|
|
from ultralytics.hub.utils import PREFIX, traces
|
|
|
|
from ultralytics.yolo.utils import LOGGER, TESTS_RUNNING
|
|
|
|
|
|
|
|
|
|
|
|
def on_pretrain_routine_end(trainer):
|
|
|
|
session = not TESTS_RUNNING and getattr(trainer, 'hub_session', None)
|
|
|
|
if session:
|
|
|
|
# Start timer for upload rate limit
|
|
|
|
LOGGER.info(f'{PREFIX}View model at https://hub.ultralytics.com/models/{session.model_id} 🚀')
|
|
|
|
session.t = {'metrics': time(), 'ckpt': time()} # start timer on self.rate_limit
|
|
|
|
|
|
|
|
|
|
|
|
def on_fit_epoch_end(trainer):
|
|
|
|
session = getattr(trainer, 'hub_session', None)
|
|
|
|
if session:
|
|
|
|
session.metrics_queue[trainer.epoch] = json.dumps(trainer.metrics) # json string
|
|
|
|
if time() - session.t['metrics'] > session.rate_limits['metrics']:
|
|
|
|
session.upload_metrics()
|
|
|
|
session.t['metrics'] = time() # reset timer
|
|
|
|
session.metrics_queue = {} # reset queue
|
|
|
|
|
|
|
|
|
|
|
|
def on_model_save(trainer):
|
|
|
|
session = getattr(trainer, 'hub_session', None)
|
|
|
|
if session:
|
|
|
|
# Upload checkpoints with rate limiting
|
|
|
|
is_best = trainer.best_fitness == trainer.fitness
|
|
|
|
if time() - session.t['ckpt'] > session.rate_limits['ckpt']:
|
|
|
|
LOGGER.info(f'{PREFIX}Uploading checkpoint {session.model_id}')
|
|
|
|
session.upload_model(trainer.epoch, trainer.last, is_best)
|
|
|
|
session.t['ckpt'] = time() # reset timer
|
|
|
|
|
|
|
|
|
|
|
|
def on_train_end(trainer):
|
|
|
|
session = getattr(trainer, 'hub_session', None)
|
|
|
|
if session:
|
|
|
|
# Upload final model and metrics with exponential standoff
|
|
|
|
LOGGER.info(f'{PREFIX}Training completed successfully ✅\n'
|
|
|
|
f'{PREFIX}Uploading final {session.model_id}')
|
|
|
|
session.upload_model(trainer.epoch, trainer.best, map=trainer.metrics['metrics/mAP50-95(B)'], final=True)
|
|
|
|
session.shutdown() # stop heartbeats
|
|
|
|
LOGGER.info(f'{PREFIX}View model at https://hub.ultralytics.com/models/{session.model_id} 🚀')
|
|
|
|
|
|
|
|
|
|
|
|
def on_train_start(trainer):
|
|
|
|
traces(trainer.args, traces_sample_rate=1.0)
|
|
|
|
|
|
|
|
|
|
|
|
def on_val_start(validator):
|
|
|
|
traces(validator.args, traces_sample_rate=1.0)
|
|
|
|
|
|
|
|
|
|
|
|
def on_predict_start(predictor):
|
|
|
|
traces(predictor.args, traces_sample_rate=1.0)
|
|
|
|
|
|
|
|
|
|
|
|
def on_export_start(exporter):
|
|
|
|
traces(exporter.args, traces_sample_rate=1.0)
|
|
|
|
|
|
|
|
|
|
|
|
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}
|