defon_pretrain_routine_end(trainer):"""Logs info before starting timer for upload rate limit."""session=getattr(trainer,'hub_session',None)ifsession:# Start timer for upload rate limitLOGGER.info(f'{PREFIX}View model at {HUB_WEB_ROOT}/models/{session.model_id} 🚀')session.timers={'metrics':time(),'ckpt':time()}# start timer on session.rate_limit
defon_fit_epoch_end(trainer):"""Uploads training progress metrics at the end of each epoch."""session=getattr(trainer,'hub_session',None)ifsession:# Upload metrics after val endall_plots={**trainer.label_loss_items(trainer.tloss,prefix='train'),**trainer.metrics}iftrainer.epoch==0:fromultralytics.utils.torch_utilsimportmodel_info_for_loggersall_plots={**all_plots,**model_info_for_loggers(trainer)}session.metrics_queue[trainer.epoch]=json.dumps(all_plots)iftime()-session.timers['metrics']>session.rate_limits['metrics']:session.upload_metrics()session.timers['metrics']=time()# reset timersession.metrics_queue={}# reset queue
defon_train_end(trainer):"""Upload final model and metrics to Ultralytics HUB at the end of training."""session=getattr(trainer,'hub_session',None)ifsession:# Upload final model and metrics with exponential standoffLOGGER.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# stop heartbeatsLOGGER.info(f'{PREFIX}Done ✅\n'f'{PREFIX}View model at {HUB_WEB_ROOT}/models/{session.model_id} 🚀')