| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | from argparse import Namespace |
| | from dataclasses import dataclass |
| | from pathlib import Path |
| | from typing import Optional |
| |
|
| | from lightning_utilities.core.apply_func import apply_to_collection |
| | from omegaconf import DictConfig, ListConfig, OmegaConf |
| | from pytorch_lightning.loggers import Logger |
| | from pytorch_lightning.utilities.parsing import AttributeDict |
| |
|
| | from nemo.utils import logging |
| |
|
| | try: |
| | import dllogger |
| | from dllogger import Verbosity |
| |
|
| | HAVE_DLLOGGER = True |
| | except (ImportError, ModuleNotFoundError): |
| | HAVE_DLLOGGER = False |
| |
|
| | try: |
| | from lightning_fabric.utilities.logger import _convert_params, _flatten_dict, _sanitize_callable_params |
| |
|
| | PL_LOGGER_UTILITIES = True |
| | except (ImportError, ModuleNotFoundError): |
| | PL_LOGGER_UTILITIES = False |
| |
|
| |
|
| | @dataclass |
| | class DLLoggerParams: |
| | verbose: Optional[bool] = False |
| | stdout: Optional[bool] = False |
| | json_file: Optional[str] = "./dllogger.json" |
| |
|
| |
|
| | class DLLogger(Logger): |
| | @property |
| | def name(self): |
| | return self.__class__.__name__ |
| |
|
| | @property |
| | def version(self): |
| | return None |
| |
|
| | def __init__(self, stdout: bool, verbose: bool, json_file: str): |
| | if not HAVE_DLLOGGER: |
| | raise ImportError( |
| | "DLLogger was not found. Please see the README for installation instructions: " |
| | "https://github.com/NVIDIA/dllogger" |
| | ) |
| | if not PL_LOGGER_UTILITIES: |
| | raise ImportError( |
| | "DLLogger utilities were not found. You probably need to update PyTorch Lightning>=1.9.0. " |
| | "pip install pytorch-lightning -U" |
| | ) |
| | verbosity = Verbosity.VERBOSE if verbose else Verbosity.DEFAULT |
| | backends = [] |
| | if json_file: |
| | Path(json_file).parent.mkdir(parents=True, exist_ok=True) |
| | backends.append(dllogger.JSONStreamBackend(verbosity, json_file)) |
| | if stdout: |
| | backends.append(dllogger.StdOutBackend(verbosity)) |
| |
|
| | if not backends: |
| | logging.warning( |
| | "Neither stdout nor json_file DLLogger parameters were specified." "DLLogger will not log anything." |
| | ) |
| | dllogger.init(backends=backends) |
| |
|
| | def log_hyperparams(self, params, *args, **kwargs): |
| | if isinstance(params, Namespace): |
| | params = vars(params) |
| | elif isinstance(params, AttributeDict): |
| | params = dict(params) |
| | params = apply_to_collection(params, (DictConfig, ListConfig), OmegaConf.to_container, resolve=True) |
| | params = apply_to_collection(params, Path, str) |
| | params = _sanitize_callable_params(_flatten_dict(_convert_params(params))) |
| | dllogger.log(step="PARAMETER", data=params) |
| |
|
| | def log_metrics(self, metrics, step=None): |
| | if step is None: |
| | step = tuple() |
| |
|
| | dllogger.log(step=step, data=metrics) |
| |
|
| | def save(self): |
| | dllogger.flush() |
| |
|