Я пытаюсь запустить 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, чтобы многопроцессорность распределяла процессы соответствующим образом для максимальной производительности? Спасибо за ваше время.