diff --git a/docs/source/v1.5.md.inc b/docs/source/v1.5.md.inc index cdafca0d3..5522271b1 100644 --- a/docs/source/v1.5.md.inc +++ b/docs/source/v1.5.md.inc @@ -50,4 +50,5 @@ All users are encouraged to update. - Fixed bug with parallelization across runs for Maxwell filtering (#761 by @larsoner) - Fixed bug where head position files were not written with a proper suffix and extension (#761 by @larsoner) - Fixed bug where default values for `decoding_csp_times` and `decoding_csp_freqs` were not set dynamically based on the config parameters (#779 by @larsoner) +- Fixed bug where the MNE logger verbosity was not respected inside parallel jobs (#813 by @larsoner) - A number of processing steps erroneously **always** operated on un-cleaned epochs (`sensor/decoding_full_epochs`, `sensor/decoding_time_by_time`, `sensor/decoding_csp`); or operated on un-cleaned epochs (without PTP rejection) if no ICA or SSP was requested (`sensor/ime_frequency`, `sensor/make_cov`) The bug in `sensor/make_cov` could propagate to the source level, as the covariance matrix is used for inverse modeling. (#796 by @hoechenberger) \ No newline at end of file diff --git a/mne_bids_pipeline/_parallel.py b/mne_bids_pipeline/_parallel.py index 12f70cf57..e79ae5151 100644 --- a/mne_bids_pipeline/_parallel.py +++ b/mne_bids_pipeline/_parallel.py @@ -4,6 +4,7 @@ from types import SimpleNamespace import joblib +from mne.utils import use_log_level, logger as mne_logger from ._logging import logger, gen_log_kwargs, _is_testing @@ -127,19 +128,21 @@ def get_parallel_backend(exec_params: SimpleNamespace) -> joblib.parallel_backen def parallel_func(func: Callable, *, exec_params: SimpleNamespace): - if get_parallel_backend_name(exec_params=exec_params) == "loky": - if get_n_jobs(exec_params=exec_params) == 1: - my_func = func - parallel = list - else: - from joblib import Parallel, delayed - - parallel = Parallel() - my_func = delayed(func) - else: # Dask + if ( + get_parallel_backend_name(exec_params=exec_params) == "loky" + and get_n_jobs(exec_params=exec_params) == 1 + ): + my_func = func + parallel = list + else: # Dask or n_jobs > 1 from joblib import Parallel, delayed parallel = Parallel() - my_func = delayed(func) + + def run_verbose(*args, verbose=mne_logger.level, **kwargs): + with use_log_level(verbose=verbose): + return func(*args, **kwargs) + + my_func = delayed(run_verbose) return parallel, my_func