Странное поведение многопроцессорного модуля Python при запуске из Slurm - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь запустить Emcee в локальном кластере, используя модуль многопоточности Python. Я замечаю странное поведение, которого не понимаю. Мой пакетный скрипт выглядит следующим образом:

#!/bin/bash    

#SBATCH --nodes=1                                                                  
#SBATCH --ntasks=<number_of_tasks>                                                                 
#SBATCH --cpus-per-task=<number_of_cpus>                                                         
#SBATCH --time=00:01:00                                                            
#SBATCH --partition=<name_of_partition>                                                  
#SBATCH --output=<my_output_file>

conda activate anaconda_environment

srun python3 my_script.py

Схема my_script.py выглядит следующим образом:

"""
Import various packages
"""

from multiprocessing import Pool

"""
Initialize a few things, print out parameters
"""

with Pool() as pool:

   """
   Run Emcee using the pool object
   """

Хорошо, здесь все немного запутывается. Если я позволю cpus-per-task = 24 и ntasks = 1, то эта программа будет работать со скоростью ~ 15,9 it / s. Если я позволю cpus-per-task = 12 и ntasks = 2, тогда программа (ну, программа (ы), потому что ntasks = 2) будет работать со скоростью ~ 27 it / s. Наконец, если я позволю cpus-per-task = 12 и ntasks = 1, то программа будет работать со скоростью ~ 13,5 it / s.

Я предполагал, что Pool позаботится о распределении процессов по ядрам, запрошенным от Slurm (24, 12, 12 соответственно) для каждой задачи. Поскольку проблема легко распараллеливается, я решил, что увеличение числа процессоров резко повысит производительность кода; Однако мой четырехъядерный ноутбук даже способен запускать код со скоростью ~ 8 бит / с, а запрос 24 ядер в кластере только удваивает производительность. Еще более странно то, что происходит, когда я делю количество процессоров на задачу пополам и увеличиваю количество задач до 2, при этом производительность увеличивается до ~ 27 it / s.

Есть что-то, в чем я очень наивен? Есть ли другой способ, которым я должен запрашивать ЦП у Slurm, чтобы многопроцессорность распределяла процессы соответствующим образом для максимальной производительности? Спасибо за ваше время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...