lightning/tests/loggers/test_neptune.py

127 lines
5.0 KiB
Python

# Copyright The PyTorch Lightning team.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from unittest.mock import MagicMock, patch
import torch
from pytorch_lightning import Trainer
from pytorch_lightning.loggers import NeptuneLogger
from tests.helpers import BoringModel
@patch('pytorch_lightning.loggers.neptune.neptune')
def test_neptune_online(neptune):
logger = NeptuneLogger(api_key='test', project_name='project')
created_experiment = neptune.Session.with_default_backend().get_project().create_experiment()
# It's important to check if the internal variable _experiment was initialized in __init__.
# Calling logger.experiment would cause a side-effect of initializing _experiment,
# if it wasn't already initialized.
assert logger._experiment is None
_ = logger.experiment
assert logger._experiment == created_experiment
assert logger.name == created_experiment.name
assert logger.version == created_experiment.id
@patch('pytorch_lightning.loggers.neptune.neptune')
def test_neptune_existing_experiment(neptune):
logger = NeptuneLogger(experiment_id='TEST-123')
neptune.Session.with_default_backend().get_project().get_experiments.assert_not_called()
experiment = logger.experiment
neptune.Session.with_default_backend().get_project().get_experiments.assert_called_once_with(id='TEST-123')
assert logger.experiment_name == experiment.get_system_properties()['name']
assert logger.params == experiment.get_parameters()
assert logger.properties == experiment.get_properties()
assert logger.tags == experiment.get_tags()
@patch('pytorch_lightning.loggers.neptune.neptune')
def test_neptune_offline(neptune):
logger = NeptuneLogger(offline_mode=True)
neptune.Session.assert_not_called()
_ = logger.experiment
neptune.Session.assert_called_once_with(backend=neptune.OfflineBackend())
assert logger.experiment == neptune.Session().get_project().create_experiment()
@patch('pytorch_lightning.loggers.neptune.neptune')
def test_neptune_additional_methods(neptune):
logger = NeptuneLogger(api_key='test', project_name='project')
created_experiment = neptune.Session.with_default_backend().get_project().create_experiment()
logger.log_metric('test', torch.ones(1))
created_experiment.log_metric.assert_called_once_with('test', torch.ones(1))
created_experiment.log_metric.reset_mock()
logger.log_metric('test', 1.0)
created_experiment.log_metric.assert_called_once_with('test', 1.0)
created_experiment.log_metric.reset_mock()
logger.log_metric('test', 1.0, step=2)
created_experiment.log_metric.assert_called_once_with('test', x=2, y=1.0)
created_experiment.log_metric.reset_mock()
logger.log_text('test', 'text')
created_experiment.log_text.assert_called_once_with('test', 'text', step=None)
created_experiment.log_text.reset_mock()
logger.log_image('test', 'image file')
created_experiment.log_image.assert_called_once_with('test', 'image file')
created_experiment.log_image.reset_mock()
logger.log_image('test', 'image file', step=2)
created_experiment.log_image.assert_called_once_with('test', x=2, y='image file')
created_experiment.log_image.reset_mock()
logger.log_artifact('file')
created_experiment.log_artifact.assert_called_once_with('file', None)
logger.set_property('property', 10)
created_experiment.set_property.assert_called_once_with('property', 10)
logger.append_tags('one tag')
created_experiment.append_tags.assert_called_once_with('one tag')
created_experiment.append_tags.reset_mock()
logger.append_tags(['two', 'tags'])
created_experiment.append_tags.assert_called_once_with('two', 'tags')
@patch('pytorch_lightning.loggers.neptune.neptune')
def test_neptune_leave_open_experiment_after_fit(neptune, tmpdir):
"""Verify that neptune experiment was closed after training"""
model = BoringModel()
def _run_training(logger):
logger._experiment = MagicMock()
trainer = Trainer(
default_root_dir=tmpdir,
max_epochs=1,
limit_train_batches=0.05,
logger=logger,
)
assert trainer.log_dir is None
trainer.fit(model)
assert trainer.log_dir is None
return logger
logger_close_after_fit = _run_training(NeptuneLogger(offline_mode=True))
assert logger_close_after_fit._experiment.stop.call_count == 1
logger_open_after_fit = _run_training(NeptuneLogger(offline_mode=True, close_after_fit=False))
assert logger_open_after_fit._experiment.stop.call_count == 0