Logging & Experiment Tracking¶
PyTorch Lightning integrates with all major experiment tracking platforms.
Built-in Loggers¶
CSVLogger¶
Writes metrics to a CSV file (default when no logger is specified):
from lightning.pytorch.loggers import CSVLogger
logger = CSVLogger(save_dir="logs/", name="mnist_experiment")
trainer = Trainer(logger=logger)
TensorBoardLogger¶
from lightning.pytorch.loggers import TensorBoardLogger
logger = TensorBoardLogger(
save_dir="tb_logs/",
name="resnet50_imagenet",
version="v1",
log_graph=True,
)
# Launch TensorBoard
# tensorboard --logdir tb_logs/
Weights & Biases¶
from lightning.pytorch.loggers import WandbLogger
logger = WandbLogger(
project="image-classification",
name="resnet50-run-42",
tags=["resnet", "imagenet"],
log_model="all", # upload checkpoints to W&B Artifacts
)
trainer = Trainer(logger=logger, max_epochs=100)
MLflow¶
from lightning.pytorch.loggers import MLFlowLogger
logger = MLFlowLogger(
experiment_name="lightning-demo",
tracking_uri="http://mlflow-server:5000",
run_name="experiment-001",
)
Multiple Loggers¶
from lightning.pytorch.loggers import WandbLogger, CSVLogger, TensorBoardLogger
trainer = Trainer(
logger=[
WandbLogger(project="my-project"),
CSVLogger(save_dir="logs/"),
TensorBoardLogger(save_dir="tb_logs/"),
]
)
Custom Logger¶
from lightning.pytorch.loggers import Logger
from argparse import Namespace
from typing import Dict, Optional, Union
class MyCustomLogger(Logger):
@property
def name(self) -> str:
return "MyCustomLogger"
@property
def version(self) -> Optional[Union[int, str]]:
return "1.0"
def log_hyperparams(self, params: Namespace, *args, **kwargs) -> None:
print(f"Hyperparams: {vars(params)}")
def log_metrics(self, metrics: Dict[str, float], step: Optional[int] = None):
print(f"Step {step}: {metrics}")
def save(self) -> None:
pass
def finalize(self, status: str) -> None:
pass