From dd217d352af54e6c335248ad787a8cfd3cbf9bc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Nobbe?= Date: Thu, 4 Dec 2025 18:02:00 +0100 Subject: [PATCH 1/4] Removed sync arg from wandb.log --- ignite/handlers/wandb_logger.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ignite/handlers/wandb_logger.py b/ignite/handlers/wandb_logger.py index 0c9293537132..0b584850b3c6 100644 --- a/ignite/handlers/wandb_logger.py +++ b/ignite/handlers/wandb_logger.py @@ -1,6 +1,7 @@ """WandB logger and its helper handlers.""" from typing import Any, Callable, List, Optional, Union +from warnings import warn from torch.optim import Optimizer @@ -284,7 +285,8 @@ def __init__( state_attributes: Optional[List[str]] = None, ): super().__init__(tag, metric_names, output_transform, global_step_transform, state_attributes) - self.sync = sync + if sync is not None: + warn("The sync argument for the WandBLoggers is no longer used, and may be removed in the future") def __call__(self, engine: Engine, logger: WandBLogger, event_name: Union[str, Events]) -> None: if not isinstance(logger, WandBLogger): @@ -298,7 +300,7 @@ def __call__(self, engine: Engine, logger: WandBLogger, event_name: Union[str, E ) metrics = self._setup_output_metrics_state_attrs(engine, log_text=True, key_tuple=False) - logger.log(metrics, step=global_step, sync=self.sync) + logger.log(metrics, step=global_step) class OptimizerParamsHandler(BaseOptimizerParamsHandler): @@ -346,7 +348,9 @@ def __init__( self, optimizer: Optimizer, param_name: str = "lr", tag: Optional[str] = None, sync: Optional[bool] = None ): super(OptimizerParamsHandler, self).__init__(optimizer, param_name, tag) - self.sync = sync + if sync is not None: + warn("The sync argument for the WandBLoggers is no longer used, and may be removed in the future") + def __call__(self, engine: Engine, logger: WandBLogger, event_name: Union[str, Events]) -> None: if not isinstance(logger, WandBLogger): @@ -358,4 +362,4 @@ def __call__(self, engine: Engine, logger: WandBLogger, event_name: Union[str, E f"{tag_prefix}{self.param_name}/group_{i}": float(param_group[self.param_name]) for i, param_group in enumerate(self.optimizer.param_groups) } - logger.log(params, step=global_step, sync=self.sync) + logger.log(params, step=global_step) From d0ff30869a0166aefd5224620bbc399b5e41c3cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Nobbe?= Date: Thu, 4 Dec 2025 18:14:36 +0100 Subject: [PATCH 2/4] Deprecate sync parameter in wandb_logger Updated sync parameter documentation to indicate deprecation. --- ignite/handlers/wandb_logger.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ignite/handlers/wandb_logger.py b/ignite/handlers/wandb_logger.py index 0b584850b3c6..1b9b1d3bf4b7 100644 --- a/ignite/handlers/wandb_logger.py +++ b/ignite/handlers/wandb_logger.py @@ -173,8 +173,7 @@ class OutputHandler(BaseOutputHandler): Default is None, global_step based on attached engine. If provided, uses function output as global_step. To setup global step from another engine, please use :meth:`~ignite.handlers.wandb_logger.global_step_from_engine`. - sync: If set to False, process calls to log in a seperate thread. Default (None) uses whatever - the default value of wandb.log. + sync: Deprecated, has no function. Argument is kept here for compatibility with existing code. Examples: .. code-block:: python @@ -311,8 +310,7 @@ class OptimizerParamsHandler(BaseOptimizerParamsHandler): as a sequence. param_name: parameter name tag: common title for all produced plots. For example, "generator" - sync: If set to False, process calls to log in a seperate thread. Default (None) uses whatever - the default value of wandb.log. + sync: Deprecated, has no function. Argument is kept here for compatibility with existing code. Examples: .. code-block:: python From 20da40ab752ed261a549e4ebe2140b8e13ca293b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Nobbe?= Date: Fri, 5 Dec 2025 11:51:25 +0000 Subject: [PATCH 3/4] remove unnecessary whitespace --- ignite/handlers/wandb_logger.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ignite/handlers/wandb_logger.py b/ignite/handlers/wandb_logger.py index 1b9b1d3bf4b7..d4d3bda2cc31 100644 --- a/ignite/handlers/wandb_logger.py +++ b/ignite/handlers/wandb_logger.py @@ -348,7 +348,6 @@ def __init__( super(OptimizerParamsHandler, self).__init__(optimizer, param_name, tag) if sync is not None: warn("The sync argument for the WandBLoggers is no longer used, and may be removed in the future") - def __call__(self, engine: Engine, logger: WandBLogger, event_name: Union[str, Events]) -> None: if not isinstance(logger, WandBLogger): From f2e06db450379e38a0319185510b141e98860726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Nobbe?= Date: Fri, 5 Dec 2025 11:57:21 +0000 Subject: [PATCH 4/4] remove sync argument from tests --- tests/ignite/handlers/test_wandb_logger.py | 50 ++++++---------------- 1 file changed, 13 insertions(+), 37 deletions(-) diff --git a/tests/ignite/handlers/test_wandb_logger.py b/tests/ignite/handlers/test_wandb_logger.py index be85060cc178..f828d5bec376 100644 --- a/tests/ignite/handlers/test_wandb_logger.py +++ b/tests/ignite/handlers/test_wandb_logger.py @@ -31,14 +31,14 @@ def test_optimizer_params(): mock_engine.state.iteration = 123 wrapper(mock_engine, mock_logger, Events.ITERATION_STARTED) - mock_logger.log.assert_called_once_with({"lr/group_0": 0.01}, step=123, sync=None) + mock_logger.log.assert_called_once_with({"lr/group_0": 0.01}, step=123) wrapper = OptimizerParamsHandler(optimizer, param_name="lr", tag="generator") mock_logger = MagicMock(spec=WandBLogger) mock_logger.log = MagicMock() wrapper(mock_engine, mock_logger, Events.ITERATION_STARTED) - mock_logger.log.assert_called_once_with({"generator/lr/group_0": 0.01}, step=123, sync=None) + mock_logger.log.assert_called_once_with({"generator/lr/group_0": 0.01}, step=123) def test_output_handler_with_wrong_logger_type(): @@ -62,36 +62,14 @@ def test_output_handler_output_transform(): wrapper(mock_engine, mock_logger, Events.ITERATION_STARTED) - mock_logger.log.assert_called_once_with({"tag/output": 12345}, step=123, sync=None) + mock_logger.log.assert_called_once_with({"tag/output": 12345}, step=123) wrapper = OutputHandler("another_tag", output_transform=lambda x: {"loss": x}) mock_logger = MagicMock(spec=WandBLogger) mock_logger.log = MagicMock() wrapper(mock_engine, mock_logger, Events.ITERATION_STARTED) - mock_logger.log.assert_called_once_with({"another_tag/loss": 12345}, step=123, sync=None) - - -def test_output_handler_output_transform_sync(): - wrapper = OutputHandler("tag", output_transform=lambda x: x, sync=False) - mock_logger = MagicMock(spec=WandBLogger) - mock_logger.log = MagicMock() - - mock_engine = MagicMock() - mock_engine.state = State() - mock_engine.state.output = 12345 - mock_engine.state.iteration = 123 - - wrapper(mock_engine, mock_logger, Events.ITERATION_STARTED) - - mock_logger.log.assert_called_once_with({"tag/output": 12345}, step=123, sync=False) - - wrapper = OutputHandler("another_tag", output_transform=lambda x: {"loss": x}, sync=True) - mock_logger = MagicMock(spec=WandBLogger) - mock_logger.log = MagicMock() - - wrapper(mock_engine, mock_logger, Events.ITERATION_STARTED) - mock_logger.log.assert_called_once_with({"another_tag/loss": 12345}, step=123, sync=True) + mock_logger.log.assert_called_once_with({"another_tag/loss": 12345}, step=123) def test_output_handler_metric_names(): @@ -104,7 +82,7 @@ def test_output_handler_metric_names(): mock_engine.state.iteration = 5 wrapper(mock_engine, mock_logger, Events.ITERATION_STARTED) - mock_logger.log.assert_called_once_with({"tag/a": 1, "tag/b": 5}, step=5, sync=None) + mock_logger.log.assert_called_once_with({"tag/a": 1, "tag/b": 5}, step=5) wrapper = OutputHandler("tag", metric_names=["a", "c"]) mock_engine = MagicMock() @@ -115,7 +93,7 @@ def test_output_handler_metric_names(): mock_logger.log = MagicMock() wrapper(mock_engine, mock_logger, Events.ITERATION_STARTED) - mock_logger.log.assert_called_once_with({"tag/a": 55.56, "tag/c": "Some text"}, step=7, sync=None) + mock_logger.log.assert_called_once_with({"tag/a": 55.56, "tag/c": "Some text"}, step=7) # all metrics wrapper = OutputHandler("tag", metric_names="all") @@ -127,7 +105,7 @@ def test_output_handler_metric_names(): mock_engine.state.iteration = 5 wrapper(mock_engine, mock_logger, Events.ITERATION_STARTED) - mock_logger.log.assert_called_once_with({"tag/a": 12.23, "tag/b": 23.45}, step=5, sync=None) + mock_logger.log.assert_called_once_with({"tag/a": 12.23, "tag/b": 23.45}, step=5) # log a torch vector wrapper = OutputHandler("tag", metric_names="all") @@ -139,7 +117,7 @@ def test_output_handler_metric_names(): mock_engine.state.iteration = 5 wrapper(mock_engine, mock_logger, Events.ITERATION_STARTED) - mock_logger.log.assert_called_once_with({f"tag/a/{i}": vector[i].item() for i in range(5)}, step=5, sync=None) + mock_logger.log.assert_called_once_with({f"tag/a/{i}": vector[i].item() for i in range(5)}, step=5) wrapper = OutputHandler("tag", metric_names=["a"]) mock_engine = MagicMock() @@ -151,7 +129,7 @@ def test_output_handler_metric_names(): mock_logger.log = MagicMock() wrapper(mock_engine, mock_logger, Events.ITERATION_STARTED) - mock_logger.log.assert_called_once_with({f"tag/a/{i}": v for i, v in enumerate(data)}, step=7, sync=None) + mock_logger.log.assert_called_once_with({f"tag/a/{i}": v for i, v in enumerate(data)}, step=7) wrapper = OutputHandler("tag", metric_names="all") mock_engine = MagicMock() @@ -179,7 +157,6 @@ def test_output_handler_metric_names(): "tag/c/2/e": 32.1, }, step=7, - sync=None, ) @@ -195,7 +172,7 @@ def test_output_handler_both(): wrapper(mock_engine, mock_logger, Events.EPOCH_STARTED) - mock_logger.log.assert_called_once_with({"tag/a": 12.23, "tag/b": 23.45, "tag/loss": 12345}, step=5, sync=None) + mock_logger.log.assert_called_once_with({"tag/a": 12.23, "tag/b": 23.45, "tag/loss": 12345}, step=5) def test_output_handler_with_wrong_global_step_transform_output(): @@ -229,7 +206,7 @@ def global_step_transform(*args, **kwargs): mock_engine.state.output = 12345 wrapper(mock_engine, mock_logger, Events.EPOCH_STARTED) - mock_logger.log.assert_called_once_with({"tag/loss": 12345}, step=10, sync=None) + mock_logger.log.assert_called_once_with({"tag/loss": 12345}, step=10) def test_output_handler_with_global_step_from_engine(): @@ -254,7 +231,7 @@ def test_output_handler_with_global_step_from_engine(): wrapper(mock_engine, mock_logger, Events.EPOCH_STARTED) mock_logger.log.assert_called_once_with( - {"tag/loss": mock_engine.state.output}, step=mock_another_engine.state.epoch, sync=None + {"tag/loss": mock_engine.state.output}, step=mock_another_engine.state.epoch ) mock_another_engine.state.epoch = 11 @@ -263,7 +240,7 @@ def test_output_handler_with_global_step_from_engine(): wrapper(mock_engine, mock_logger, Events.EPOCH_STARTED) assert mock_logger.log.call_count == 2 mock_logger.log.assert_has_calls( - [call({"tag/loss": mock_engine.state.output}, step=mock_another_engine.state.epoch, sync=None)] + [call({"tag/loss": mock_engine.state.output}, step=mock_another_engine.state.epoch)] ) @@ -291,7 +268,6 @@ def test_output_handler_state_attrs(): "tag/delta": "Some Text", }, step=5, - sync=None, )