Skip to content

Commit

Permalink
Limit n processes on Windows to 61
Browse files Browse the repository at this point in the history
  • Loading branch information
adamltyson committed Oct 13, 2023
1 parent b7209ef commit 9bac2b7
Showing 1 changed file with 42 additions and 17 deletions.
59 changes: 42 additions & 17 deletions brainglobe_utils/general/system.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@

from brainglobe_utils.general.string import get_text_lines

# On Windows, max_workers must be less than or equal to 61
# https://docs.python.org/3/library/concurrent.futures.html#processpoolexecutor
MAX_PROCESSES_WINDOWS = 61


def replace_extension(file, new_extension, check_leading_period=True):
"""
Expand Down Expand Up @@ -132,35 +136,29 @@ def get_num_processes(
:return: Number of processes to
"""
logging.debug("Determining the maximum number of CPU cores to use")
try:
os.environ["SLURM_JOB_ID"]
n_cpu_cores = (
slurmio.SlurmJobParameters().allocated_cores - min_free_cpu_cores
)
except KeyError:
n_cpu_cores = psutil.cpu_count() - min_free_cpu_cores

n_cpu_cores = get_cores_available()
n_cpu_cores = n_cpu_cores - min_free_cpu_cores

logging.debug(f"Number of CPU cores available is: {n_cpu_cores}")

if ram_needed_per_process is not None:
cores_w_sufficient_ram = how_many_cores_with_sufficient_ram(
n_processes = limit_cores_based_on_memory(

Check warning on line 146 in brainglobe_utils/general/system.py

View check run for this annotation

Codecov / codecov/patch

brainglobe_utils/general/system.py#L146

Added line #L146 was not covered by tests
n_cpu_cores,
ram_needed_per_process,
fraction_free_ram=fraction_free_ram,
max_ram_usage=max_ram_usage,
)
n_processes = min(n_cpu_cores, cores_w_sufficient_ram)
logging.debug(
f"Based on memory requirements, up to {cores_w_sufficient_ram} "
f"cores could be used. Therefore setting the number of "
f"processes to {n_processes}."
fraction_free_ram,
max_ram_usage,
)
else:
n_processes = n_cpu_cores

if platform.system() == "Windows":
n_max_processes = min(n_max_processes, MAX_PROCESSES_WINDOWS)

Check warning on line 156 in brainglobe_utils/general/system.py

View check run for this annotation

Codecov / codecov/patch

brainglobe_utils/general/system.py#L156

Added line #L156 was not covered by tests

if n_max_processes is not None:
if n_max_processes < n_processes:
logging.debug(
f"Forcing the number of processes to {n_max_processes} based"
f"Limiting the number of processes to {n_max_processes} based"
f" on other considerations."
)
n_processes = min(n_processes, n_max_processes)
Expand All @@ -174,6 +172,33 @@ def get_num_processes(
return int(n_processes)


def get_cores_available():
try:
os.environ["SLURM_JOB_ID"]
n_cpu_cores = slurmio.SlurmJobParameters().allocated_cores

Check warning on line 178 in brainglobe_utils/general/system.py

View check run for this annotation

Codecov / codecov/patch

brainglobe_utils/general/system.py#L178

Added line #L178 was not covered by tests
except KeyError:
n_cpu_cores = psutil.cpu_count()

return n_cpu_cores


def limit_cores_based_on_memory(
n_cpu_cores, ram_needed_per_process, fraction_free_ram, max_ram_usage
):
cores_w_sufficient_ram = how_many_cores_with_sufficient_ram(

Check warning on line 188 in brainglobe_utils/general/system.py

View check run for this annotation

Codecov / codecov/patch

brainglobe_utils/general/system.py#L188

Added line #L188 was not covered by tests
ram_needed_per_process,
fraction_free_ram=fraction_free_ram,
max_ram_usage=max_ram_usage,
)
n_processes = min(n_cpu_cores, cores_w_sufficient_ram)
logging.debug(

Check warning on line 194 in brainglobe_utils/general/system.py

View check run for this annotation

Codecov / codecov/patch

brainglobe_utils/general/system.py#L193-L194

Added lines #L193 - L194 were not covered by tests
f"Based on memory requirements, up to {cores_w_sufficient_ram} "
f"cores could be used. Therefore setting the number of "
f"processes to {n_processes}."
)
return n_processes

Check warning on line 199 in brainglobe_utils/general/system.py

View check run for this annotation

Codecov / codecov/patch

brainglobe_utils/general/system.py#L199

Added line #L199 was not covered by tests


def how_many_cores_with_sufficient_ram(
ram_needed_per_cpu, fraction_free_ram=0.1, max_ram_usage=None
):
Expand Down

0 comments on commit 9bac2b7

Please sign in to comment.