From d4754ad881a15795400778841df924f0fd84a3cf Mon Sep 17 00:00:00 2001 From: Kavyansh Tyagi <142140238+KAVYANSHTYAGI@users.noreply.github.com> Date: Mon, 2 Jun 2025 18:54:57 +0530 Subject: [PATCH 1/4] Update test_mlflow.py --- tests/tests_pytorch/loggers/test_mlflow.py | 32 ++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/tests_pytorch/loggers/test_mlflow.py b/tests/tests_pytorch/loggers/test_mlflow.py index c7f9dbe1fe2c6..d99449eb9f893 100644 --- a/tests/tests_pytorch/loggers/test_mlflow.py +++ b/tests/tests_pytorch/loggers/test_mlflow.py @@ -427,3 +427,35 @@ def test_set_tracking_uri(mlflow_mock): mlflow_mock.set_tracking_uri.assert_not_called() _ = logger.experiment mlflow_mock.set_tracking_uri.assert_called_with("the_tracking_uri") + +def test_mlflowlogger_metric_deduplication(monkeypatch): + import types + from lightning.pytorch.loggers.mlflow import MLFlowLogger + + # Dummy MLflow client to record log_batch calls + logged_metrics = [] + class DummyMlflowClient: + def log_batch(self, run_id, metrics, **kwargs): + logged_metrics.extend(metrics) + def set_tracking_uri(self, uri): pass + def create_run(self, experiment_id, tags): + class Run: info = types.SimpleNamespace(run_id="dummy_run_id") + return Run() + def get_run(self, run_id): + class Run: info = types.SimpleNamespace(experiment_id="dummy_experiment_id") + return Run() + def get_experiment_by_name(self, name): return None + def create_experiment(self, name, artifact_location=None): return "dummy_experiment_id" + + # Patch the MLFlowLogger to use DummyMlflowClient + monkeypatch.setattr("mlflow.tracking.MlflowClient", lambda *a, **k: DummyMlflowClient()) + + logger = MLFlowLogger(experiment_name="test_exp") + logger.log_metrics({'foo': 1.0}, step=5) + logger.log_metrics({'foo': 1.0}, step=5) # duplicate + + # Only the first metric should be logged + assert len(logged_metrics) == 1 + assert logged_metrics[0].key == "foo" + assert logged_metrics[0].value == 1.0 + assert logged_metrics[0].step == 5 From 0773eb455b13812674547dc81833d78fa09a2faa Mon Sep 17 00:00:00 2001 From: Kavyansh Tyagi <142140238+KAVYANSHTYAGI@users.noreply.github.com> Date: Mon, 2 Jun 2025 19:02:50 +0530 Subject: [PATCH 2/4] test_mlflow.py --- tests/tests_pytorch/loggers/test_mlflow.py | 32 ---------------------- 1 file changed, 32 deletions(-) diff --git a/tests/tests_pytorch/loggers/test_mlflow.py b/tests/tests_pytorch/loggers/test_mlflow.py index d99449eb9f893..c7f9dbe1fe2c6 100644 --- a/tests/tests_pytorch/loggers/test_mlflow.py +++ b/tests/tests_pytorch/loggers/test_mlflow.py @@ -427,35 +427,3 @@ def test_set_tracking_uri(mlflow_mock): mlflow_mock.set_tracking_uri.assert_not_called() _ = logger.experiment mlflow_mock.set_tracking_uri.assert_called_with("the_tracking_uri") - -def test_mlflowlogger_metric_deduplication(monkeypatch): - import types - from lightning.pytorch.loggers.mlflow import MLFlowLogger - - # Dummy MLflow client to record log_batch calls - logged_metrics = [] - class DummyMlflowClient: - def log_batch(self, run_id, metrics, **kwargs): - logged_metrics.extend(metrics) - def set_tracking_uri(self, uri): pass - def create_run(self, experiment_id, tags): - class Run: info = types.SimpleNamespace(run_id="dummy_run_id") - return Run() - def get_run(self, run_id): - class Run: info = types.SimpleNamespace(experiment_id="dummy_experiment_id") - return Run() - def get_experiment_by_name(self, name): return None - def create_experiment(self, name, artifact_location=None): return "dummy_experiment_id" - - # Patch the MLFlowLogger to use DummyMlflowClient - monkeypatch.setattr("mlflow.tracking.MlflowClient", lambda *a, **k: DummyMlflowClient()) - - logger = MLFlowLogger(experiment_name="test_exp") - logger.log_metrics({'foo': 1.0}, step=5) - logger.log_metrics({'foo': 1.0}, step=5) # duplicate - - # Only the first metric should be logged - assert len(logged_metrics) == 1 - assert logged_metrics[0].key == "foo" - assert logged_metrics[0].value == 1.0 - assert logged_metrics[0].step == 5 From c41c24bbb184c774a286cbbdd1eab6ccbe836aed Mon Sep 17 00:00:00 2001 From: Kavyansh Tyagi <142140238+KAVYANSHTYAGI@users.noreply.github.com> Date: Thu, 4 Sep 2025 12:35:28 +0530 Subject: [PATCH 3/4] Respect verbose flag in seed_everything --- src/lightning/fabric/CHANGELOG.md | 1 + src/lightning/fabric/utilities/seed.py | 3 ++- tests/tests_fabric/utilities/test_seed.py | 8 ++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/lightning/fabric/CHANGELOG.md b/src/lightning/fabric/CHANGELOG.md index 9f55de94d9135..691e0d7d9dd31 100644 --- a/src/lightning/fabric/CHANGELOG.md +++ b/src/lightning/fabric/CHANGELOG.md @@ -28,6 +28,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). ### Fixed - Fixed with adding a missing device id for pytorch 2.8 ([#21105](https://github.com/Lightning-AI/pytorch-lightning/pull/21105)) +- Respect `verbose=False` in `seed_everything` when no seed is provided --- diff --git a/src/lightning/fabric/utilities/seed.py b/src/lightning/fabric/utilities/seed.py index 534e5e3db653e..841fa195696a2 100644 --- a/src/lightning/fabric/utilities/seed.py +++ b/src/lightning/fabric/utilities/seed.py @@ -40,7 +40,8 @@ def seed_everything(seed: Optional[int] = None, workers: bool = False, verbose: env_seed = os.environ.get("PL_GLOBAL_SEED") if env_seed is None: seed = 0 - rank_zero_warn(f"No seed found, seed set to {seed}") + if verbose: + rank_zero_warn(f"No seed found, seed set to {seed}") else: try: seed = int(env_seed) diff --git a/tests/tests_fabric/utilities/test_seed.py b/tests/tests_fabric/utilities/test_seed.py index 2700213747f9a..81fde5aae3ef5 100644 --- a/tests/tests_fabric/utilities/test_seed.py +++ b/tests/tests_fabric/utilities/test_seed.py @@ -72,6 +72,14 @@ def test_seed_everything_accepts_valid_seed_from_env(): assert seed_everything() == 17 +@mock.patch.dict(os.environ, {}, clear=True) +def test_seed_everything_non_verbose_no_warning(): + """Ensure that no warning is emitted when verbose is False and no seed is provided.""" + with warnings.catch_warnings(record=True) as caught: + seed_everything(verbose=False) + assert caught == [] + + def test_reset_seed_no_op(): """Test that the reset_seed function is a no-op when seed_everything() was not used.""" assert "PL_GLOBAL_SEED" not in os.environ From 1caea2e61bd8ae2fe73c0c93a34b9f007a74470a Mon Sep 17 00:00:00 2001 From: Jirka Borovec <6035284+Borda@users.noreply.github.com> Date: Thu, 4 Sep 2025 10:20:58 +0200 Subject: [PATCH 4/4] Apply suggestions from code review --- src/lightning/fabric/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lightning/fabric/CHANGELOG.md b/src/lightning/fabric/CHANGELOG.md index 691e0d7d9dd31..42bd1ca54679a 100644 --- a/src/lightning/fabric/CHANGELOG.md +++ b/src/lightning/fabric/CHANGELOG.md @@ -28,6 +28,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). ### Fixed - Fixed with adding a missing device id for pytorch 2.8 ([#21105](https://github.com/Lightning-AI/pytorch-lightning/pull/21105)) + + - Respect `verbose=False` in `seed_everything` when no seed is provided