Files
2026-07-13 13:21:43 +08:00

72 lines
2.6 KiB
Python

# AUTOGENERATED! DO NOT EDIT! File to edit: nbs/74_callback.azureml.ipynb (unless otherwise specified).
__all__ = ['AzureMLCallback']
# Cell
from ..basics import *
from ..learner import Callback
# Cell
from azureml.core.run import Run
from azureml.exceptions import RunEnvironmentException
import warnings
# Cell
class AzureMLCallback(Callback):
"""
Log losses, metrics, model architecture summary to AzureML.
If `log_offline` is False, will only log if actually running on AzureML.
A custom AzureML `Run` class can be passed as `azurerun`.
If `log_to_parent` is True, will also log to the parent run, if exists (e.g. in AzureML pipelines).
"""
order = Recorder.order+1
def __init__(self, azurerun=None, log_to_parent=True):
if azurerun:
self.azurerun = azurerun
else:
try:
self.azurerun = Run.get_context(allow_offline=False)
except RunEnvironmentException:
# running locally
self.azurerun = None
warnings.warn("Not running on AzureML and no azurerun passed, AzureMLCallback will be disabled.")
self.log_to_parent = log_to_parent
def before_fit(self):
self._log("n_epoch", self.learn.n_epoch)
self._log("model_class", str(type(self.learn.model)))
try:
summary_file = Path("outputs") / 'model_summary.txt'
with summary_file.open("w") as f:
f.write(repr(self.learn.model))
except:
print('Did not log model summary. Check if your model is PyTorch model.')
def after_batch(self):
# log loss and opt.hypers
if self.learn.training:
self._log('batch__loss', self.learn.loss.item())
self._log('batch__train_iter', self.learn.train_iter)
for i, h in enumerate(self.learn.opt.hypers):
for k, v in h.items():
self._log(f'batch__opt.hypers.{k}', v)
def after_epoch(self):
# log metrics
for n, v in zip(self.learn.recorder.metric_names, self.learn.recorder.log):
if n not in ['epoch', 'time']:
self._log(f'epoch__{n}', v)
if n == 'time':
# split elapsed time string, then convert into 'seconds' to log
m, s = str(v).split(':')
elapsed = int(m)*60 + int(s)
self._log(f'epoch__{n}', elapsed)
def _log(self, metric, value):
if self.azurerun is not None:
self.azurerun.log(metric, value)
if self.log_to_parent and self.azurerun.parent is not None:
self.azurerun.parent.log(metric, value)