2020-03-03 01:49:14 +00:00
|
|
|
import os
|
|
|
|
import pickle
|
|
|
|
from unittest.mock import patch
|
|
|
|
|
|
|
|
import pytest
|
2020-03-12 16:41:37 +00:00
|
|
|
import torch
|
2020-03-03 01:49:14 +00:00
|
|
|
|
2020-03-25 11:46:27 +00:00
|
|
|
import tests.base.utils as tutils
|
2020-03-03 01:49:14 +00:00
|
|
|
from pytorch_lightning import Trainer
|
|
|
|
from pytorch_lightning.loggers import CometLogger
|
2020-03-31 12:57:48 +00:00
|
|
|
from pytorch_lightning.utilities.exceptions import MisconfigurationException
|
2020-03-25 11:46:27 +00:00
|
|
|
from tests.base import LightningTestModel
|
2020-03-03 01:49:14 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_comet_logger(tmpdir, monkeypatch):
|
|
|
|
"""Verify that basic functionality of Comet.ml logger works."""
|
|
|
|
|
|
|
|
# prevent comet logger from trying to print at exit, since
|
|
|
|
# pytest's stdout/stderr redirection breaks it
|
|
|
|
import atexit
|
|
|
|
monkeypatch.setattr(atexit, 'register', lambda _: None)
|
|
|
|
|
|
|
|
tutils.reset_seed()
|
|
|
|
|
2020-03-25 11:46:27 +00:00
|
|
|
hparams = tutils.get_default_hparams()
|
2020-03-03 01:49:14 +00:00
|
|
|
model = LightningTestModel(hparams)
|
|
|
|
|
|
|
|
comet_dir = os.path.join(tmpdir, 'cometruns')
|
|
|
|
|
|
|
|
# We test CometLogger in offline mode with local saves
|
|
|
|
logger = CometLogger(
|
|
|
|
save_dir=comet_dir,
|
|
|
|
project_name='general',
|
|
|
|
workspace='dummy-test',
|
|
|
|
)
|
|
|
|
|
|
|
|
trainer_options = dict(
|
|
|
|
default_save_path=tmpdir,
|
|
|
|
max_epochs=1,
|
|
|
|
train_percent_check=0.05,
|
|
|
|
logger=logger
|
|
|
|
)
|
|
|
|
|
|
|
|
trainer = Trainer(**trainer_options)
|
|
|
|
result = trainer.fit(model)
|
|
|
|
trainer.logger.log_metrics({'acc': torch.ones(1)})
|
|
|
|
|
|
|
|
assert result == 1, 'Training failed'
|
|
|
|
|
|
|
|
|
|
|
|
def test_comet_logger_online():
|
|
|
|
"""Test comet online with mocks."""
|
|
|
|
# Test api_key given
|
|
|
|
with patch('pytorch_lightning.loggers.comet.CometExperiment') as comet:
|
|
|
|
logger = CometLogger(
|
|
|
|
api_key='key',
|
|
|
|
workspace='dummy-test',
|
|
|
|
project_name='general'
|
|
|
|
)
|
|
|
|
|
|
|
|
_ = logger.experiment
|
|
|
|
|
|
|
|
comet.assert_called_once_with(
|
|
|
|
api_key='key',
|
|
|
|
workspace='dummy-test',
|
|
|
|
project_name='general'
|
|
|
|
)
|
|
|
|
|
|
|
|
# Test both given
|
|
|
|
with patch('pytorch_lightning.loggers.comet.CometExperiment') as comet:
|
|
|
|
logger = CometLogger(
|
|
|
|
save_dir='test',
|
|
|
|
api_key='key',
|
|
|
|
workspace='dummy-test',
|
|
|
|
project_name='general'
|
|
|
|
)
|
|
|
|
|
|
|
|
_ = logger.experiment
|
|
|
|
|
|
|
|
comet.assert_called_once_with(
|
|
|
|
api_key='key',
|
|
|
|
workspace='dummy-test',
|
|
|
|
project_name='general'
|
|
|
|
)
|
|
|
|
|
|
|
|
# Test neither given
|
|
|
|
with pytest.raises(MisconfigurationException):
|
|
|
|
CometLogger(
|
|
|
|
workspace='dummy-test',
|
|
|
|
project_name='general'
|
|
|
|
)
|
|
|
|
|
|
|
|
# Test already exists
|
|
|
|
with patch('pytorch_lightning.loggers.comet.CometExistingExperiment') as comet_existing:
|
|
|
|
logger = CometLogger(
|
|
|
|
experiment_key='test',
|
|
|
|
experiment_name='experiment',
|
|
|
|
api_key='key',
|
|
|
|
workspace='dummy-test',
|
|
|
|
project_name='general'
|
|
|
|
)
|
|
|
|
|
|
|
|
_ = logger.experiment
|
|
|
|
|
|
|
|
comet_existing.assert_called_once_with(
|
|
|
|
api_key='key',
|
|
|
|
workspace='dummy-test',
|
|
|
|
project_name='general',
|
|
|
|
previous_experiment='test'
|
|
|
|
)
|
|
|
|
|
|
|
|
comet_existing().set_name.assert_called_once_with('experiment')
|
|
|
|
|
|
|
|
with patch('pytorch_lightning.loggers.comet.API') as api:
|
|
|
|
CometLogger(
|
|
|
|
api_key='key',
|
|
|
|
workspace='dummy-test',
|
|
|
|
project_name='general',
|
|
|
|
rest_api_key='rest'
|
|
|
|
)
|
|
|
|
|
|
|
|
api.assert_called_once_with('rest')
|
|
|
|
|
|
|
|
|
|
|
|
def test_comet_pickle(tmpdir, monkeypatch):
|
|
|
|
"""Verify that pickling trainer with comet logger works."""
|
|
|
|
|
|
|
|
# prevent comet logger from trying to print at exit, since
|
|
|
|
# pytest's stdout/stderr redirection breaks it
|
|
|
|
import atexit
|
|
|
|
monkeypatch.setattr(atexit, 'register', lambda _: None)
|
|
|
|
|
|
|
|
tutils.reset_seed()
|
|
|
|
|
2020-03-25 11:46:27 +00:00
|
|
|
# hparams = tutils.get_default_hparams()
|
2020-03-03 01:49:14 +00:00
|
|
|
# model = LightningTestModel(hparams)
|
|
|
|
|
|
|
|
comet_dir = os.path.join(tmpdir, 'cometruns')
|
|
|
|
|
|
|
|
# We test CometLogger in offline mode with local saves
|
|
|
|
logger = CometLogger(
|
|
|
|
save_dir=comet_dir,
|
|
|
|
project_name='general',
|
|
|
|
workspace='dummy-test',
|
|
|
|
)
|
|
|
|
|
|
|
|
trainer_options = dict(
|
|
|
|
default_save_path=tmpdir,
|
|
|
|
max_epochs=1,
|
|
|
|
logger=logger
|
|
|
|
)
|
|
|
|
|
|
|
|
trainer = Trainer(**trainer_options)
|
|
|
|
pkl_bytes = pickle.dumps(trainer)
|
|
|
|
trainer2 = pickle.loads(pkl_bytes)
|
|
|
|
trainer2.logger.log_metrics({'acc': 1.0})
|