Я следующий кодPython многопроцессорная работает быстрее локально чем на кластере (Слерма)
import multiprocessing as mp
import os
def funct(name):
if nameisvalid:
do_some_stuff_and_save_a_file
return 1
else:
return 0
num_proc = 20 #or a call to slurm/mp for number of processors
pool = mp.Pool(processes=num_proc)
results = pool.map_async(makeminofname, [n for n in nameindex])
pool.close()
pool.join()
я запускаю это на моем рабочем столе с 6-ядерным процессором с num_proc=mp.cpu_count()
а и он работает отлично и быстро, но когда Я пытаюсь запустить этот скрипт в сценарии sbatch в нашем кластере обработки, с -N 1 -n 20 (наши узлы имеют 24 процессора), или любое количество процессоров, оно работает невероятно медленно и, по-видимому, использует от 10 -15 процессоров. Есть ли способ оптимизировать многопроцессорную обработку для работы с slurm?
Является ли ваш процесс привязанным к процессору? Из того, что вы пишете («только кажется, что используется между 10-15 процессорами»), он может быть привязан к IO, и если у вас есть SSD на рабочем столе, а в кластере есть NAS (NFS), и вы работаете над ним, то он будет медленнее на кластере – damienfrancois
'do_some_stuff_and_save_a_file' пишет блочное устройство? похоже, что это не может быть хорошо контролируется между двумя испытаниями. –
Каждый вызов 'funct' читает и пишет разные файлы на основе' name', поэтому разные вызовы не будут мешать друг другу за пределами блокировки ввода-вывода (что оказалось проблемой). – Minirogue