Skip to content

Commit 89817ae

Browse files
committed
Fix propagation of logging levels in MPIEvaluator and related modules
- Introduced logging level propagation to the `MPIEvaluator` to ensure consistent logging across MPI processes. - Adjusted the `mpi_initializer` function to accept a logger level and configure the logging for each worker accordingly. - Changed the logging statements within `MPIEvaluator` and `run_experiment_mpi` from DEBUG to INFO for better visibility. - Removed a redundant TODO regarding logging in `run_experiment_mpi`. - Modified the `log_to_stderr` method in `ema_logging.py` to allow for setting logging levels on all root module loggers. - Simplified the logging setup in the `ema_model.py` script, and ensured proper propagation of logging levels.
1 parent e8a11f0 commit 89817ae

File tree

3 files changed

+17
-11
lines changed

3 files changed

+17
-11
lines changed

ema_workbench/em_framework/evaluators.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import sys
1414
import threading
1515
import warnings
16+
import logging
1617

1718
from ema_workbench.em_framework.samplers import AbstractSampler
1819
from .callbacks import DefaultCallback
@@ -419,10 +420,13 @@ def evaluate_experiments(self, scenarios, policies, callback, combine="factorial
419420
experiment_runner = None
420421

421422

422-
def mpi_initializer(models):
423+
def mpi_initializer(models, logger_level):
423424
global experiment_runner
424425
experiment_runner = ExperimentRunner(models)
425426

427+
# Configure logger based on the passed level and adjusted format
428+
logging.basicConfig(level=logger_level, format="[%(processName)s/%(levelname)s] %(message)s")
429+
426430

427431
class MPIEvaluator(BaseEvaluator):
428432
"""Evaluator for experiments using MPI Pool Executor from mpi4py"""
@@ -440,7 +444,7 @@ def initialize(self):
440444
models.extend(self._msis)
441445

442446
# Use the initializer function to set up the ExperimentRunner for all the worker processes
443-
self._pool = MPIPoolExecutor(initializer=mpi_initializer, initargs=(models,))
447+
self._pool = MPIPoolExecutor(initializer=mpi_initializer, initargs=(models, _logger.level))
444448
_logger.info(f"MPI pool started with {self._pool._max_workers} workers")
445449
if self._pool._max_workers <= 10:
446450
_logger.warning(
@@ -460,15 +464,15 @@ def evaluate_experiments(self, scenarios, policies, callback, combine="factorial
460464
packed = [(experiment, experiment.model_name) for experiment in experiments]
461465

462466
# Use the pool to execute in parallel
463-
_logger.debug(
467+
_logger.info(
464468
f"MPIEvaluator: Starting {len(packed)} experiments using MPI pool with {self._pool._max_workers} workers"
465469
)
466470
results = self._pool.map(run_experiment_mpi, packed)
467471

468-
_logger.debug(f"MPIEvaluator: Completed all {len(packed)} experiments")
472+
_logger.info(f"MPIEvaluator: Completed all {len(packed)} experiments")
469473
for experiment, outcomes in results:
470474
callback(experiment, outcomes)
471-
_logger.debug(f"MPIEvaluator: Callback completed for all {len(packed)} experiments")
475+
_logger.info(f"MPIEvaluator: Callback completed for all {len(packed)} experiments")
472476

473477

474478
def run_experiment_mpi(packed_data):
@@ -477,13 +481,12 @@ def run_experiment_mpi(packed_data):
477481
rank = COMM_WORLD.Get_rank()
478482

479483
experiment, model_name = packed_data
480-
# TODO logger: They don't seem to use the main module logger/syntax, fix this
481-
_logger.debug(f"MPI Rank {rank}: starting {experiment}")
484+
_logger.info(f"MPI Rank {rank}: starting {repr(experiment)}")
482485

483486
# Use the global ExperimentRunner created by the initializer
484487
outcomes = experiment_runner.run_experiment(experiment)
485488

486-
_logger.debug(f"MPI Rank {rank}: completed {experiment}")
489+
_logger.info(f"MPI Rank {rank}: completed {experiment}")
487490

488491
return experiment, outcomes
489492

ema_workbench/util/ema_logging.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def get_rootlogger():
178178
return _rootlogger
179179

180180

181-
def log_to_stderr(level=None):
181+
def log_to_stderr(level=None, set_root_logger_levels=False):
182182
"""
183183
Turn on logging and add a handler which prints to stderr
184184
@@ -206,4 +206,8 @@ def log_to_stderr(level=None):
206206
logger.addHandler(handler)
207207
logger.propagate = False
208208

209+
if set_root_logger_levels:
210+
for _, mod_logger in _module_loggers.items():
211+
mod_logger.setLevel(level)
212+
209213
return logger

scripts/ema_model.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ def some_model(x1=None, x2=None, x3=None):
1919

2020

2121
if __name__ == "__main__":
22-
ema_logging.log_to_stderr(level=10)
23-
# TODO: Test logging to file
22+
ema_logging.log_to_stderr(level=20, set_root_logger_levels=True)
2423

2524
model = Model("simpleModel", function=some_model) # instantiate the model
2625

0 commit comments

Comments
 (0)