2015-11-20 5 views
1

Я следующий код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?

+0

Является ли ваш процесс привязанным к процессору? Из того, что вы пишете («только кажется, что используется между 10-15 процессорами»), он может быть привязан к IO, и если у вас есть SSD на рабочем столе, а в кластере есть NAS (NFS), и вы работаете над ним, то он будет медленнее на кластере – damienfrancois

+0

'do_some_stuff_and_save_a_file' пишет блочное устройство? похоже, что это не может быть хорошо контролируется между двумя испытаниями. –

+0

Каждый вызов 'funct' читает и пишет разные файлы на основе' name', поэтому разные вызовы не будут мешать друг другу за пределами блокировки ввода-вывода (что оказалось проблемой). – Minirogue

ответ

1

funct проверял диск на определенный файл, затем загружал файл, затем работал, а затем сохранял файл. Это привело к тому, что мои отдельные процессы ожидали операций ввода-вывода вместо работы. Поэтому я загрузил все исходные данные, прежде чем передавать их в пул, и добавил Process от multiprocessing, посвященный сохранению файлов из Queue, в результате чего процессы объединения пускают свой вывод, поэтому только один процесс пытается сохранить.