From 48ef364961e50c7d6379388342d5bd25f2f2ddc3 Mon Sep 17 00:00:00 2001 From: Matthew Middlehurst Date: Sat, 4 Feb 2023 15:06:37 +0000 Subject: [PATCH 1/3] check_n_jobs --- sktime/utils/validation/__init__.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/sktime/utils/validation/__init__.py b/sktime/utils/validation/__init__.py index 551fe87eb2..c98d1953f8 100644 --- a/sktime/utils/validation/__init__.py +++ b/sktime/utils/validation/__init__.py @@ -126,24 +126,27 @@ def all_inputs_are_time_like(args: list) -> bool: def check_n_jobs(n_jobs: int) -> int: """Check `n_jobs` parameter according to the scikit-learn convention. + https://scikit-learn.org/stable/glossary.html#term-n_jobs + Parameters ---------- - n_jobs : int, positive or -1 + n_jobs : int or None The number of jobs for parallelization. + If None or 0, 1 is used. + If negative, (n_cpus + 1 + n_jobs) is used. In such a case, -1 would use all + available CPUs and -2 would use all but one. Returns ------- n_jobs : int - Checked number of jobs. + The number of threads to be used. """ - # scikit-learn convention - # https://scikit-learn.org/stable/glossary.html#term-n-jobs - if n_jobs is None: + if n_jobs is None or n_jobs == 0: return 1 - elif not is_int(n_jobs): + elif isinstance(n_jobs, (int, np.integer)): raise ValueError(f"`n_jobs` must be None or an integer, but found: {n_jobs}") elif n_jobs < 0: - return os.cpu_count() - n_jobs + 1 + return os.cpu_count() + 1 + n_jobs else: return n_jobs From c5537b5c1ed6fe5dfed48461c8fac128f82d3fbf Mon Sep 17 00:00:00 2001 From: Matthew Middlehurst Date: Sat, 4 Feb 2023 15:08:30 +0000 Subject: [PATCH 2/3] check_n_jobs --- sktime/utils/validation/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sktime/utils/validation/__init__.py b/sktime/utils/validation/__init__.py index c98d1953f8..79e7a17be0 100644 --- a/sktime/utils/validation/__init__.py +++ b/sktime/utils/validation/__init__.py @@ -143,7 +143,7 @@ def check_n_jobs(n_jobs: int) -> int: """ if n_jobs is None or n_jobs == 0: return 1 - elif isinstance(n_jobs, (int, np.integer)): + elif not is_int(n_jobs): raise ValueError(f"`n_jobs` must be None or an integer, but found: {n_jobs}") elif n_jobs < 0: return os.cpu_count() + 1 + n_jobs From 3cf54439791343adbb8f0a921344282152bea2b1 Mon Sep 17 00:00:00 2001 From: Matthew Middlehurst Date: Sat, 4 Feb 2023 15:52:25 +0000 Subject: [PATCH 3/3] min 1 thread --- sktime/utils/validation/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sktime/utils/validation/__init__.py b/sktime/utils/validation/__init__.py index 79e7a17be0..4e39be3a0e 100644 --- a/sktime/utils/validation/__init__.py +++ b/sktime/utils/validation/__init__.py @@ -134,7 +134,8 @@ def check_n_jobs(n_jobs: int) -> int: The number of jobs for parallelization. If None or 0, 1 is used. If negative, (n_cpus + 1 + n_jobs) is used. In such a case, -1 would use all - available CPUs and -2 would use all but one. + available CPUs and -2 would use all but one. If the number of CPUs used would + fall under 1, 1 is returned instead. Returns ------- @@ -146,7 +147,7 @@ def check_n_jobs(n_jobs: int) -> int: elif not is_int(n_jobs): raise ValueError(f"`n_jobs` must be None or an integer, but found: {n_jobs}") elif n_jobs < 0: - return os.cpu_count() + 1 + n_jobs + return max(1, os.cpu_count() + 1 + n_jobs) else: return n_jobs