from pytorch_lightning.loggers import CSVLogger, WandbLogger from pytorch_lightning.callbacks import EarlyStopping, ModelCheckpoint import pytorch_lightning as pl import wandb def train_model(model, data_module, model_name="main", batch_size=256, max_epochs=40, version="0", save_output=True): conv_model = model loggers = [] if save_output: csv_logger = CSVLogger( save_dir=f"models/{model_name}/logs", version=version, ) loggers.append(csv_logger) wandb_logger = WandbLogger( project="mdl-mlops", name=f"{model_name}-v{version}", config={ "model_name": model_name, "version": version, "max_epochs": max_epochs, "batch_size": batch_size, "latent_dim": getattr(model, "latent_dim", "unknown"), "learning_rate": getattr(model, "lr", "unknown") } ) loggers.append(wandb_logger) callbacks = [] early_stopping_callback = EarlyStopping( monitor="val_loss", patience=5, mode="min" ) callbacks.append(early_stopping_callback) if save_output: checkpoint_callback = ModelCheckpoint( monitor="val_loss", mode="min", save_top_k=1, dirpath=f"models/{model_name}", filename=f'best_model-{version}', enable_version_counter=False ) callbacks.append(checkpoint_callback) trainer = pl.Trainer( max_epochs=max_epochs, callbacks=callbacks, accelerator="auto", devices=1, enable_checkpointing=True, logger=loggers ) trainer.fit(conv_model, datamodule=data_module) if save_output: artifact = wandb.Artifact( name=f"{model_name}-v{version}", type="model" ) artifact.add_file(checkpoint_callback.best_model_path) wandb.log_artifact(artifact)