2014-09-18 1 views
2

У меня есть функция, которую я хотел бы оценивать по нескольким узлам кластера. Я получил простые примеры для запуска в нашем кластере с использованием MPI4py, но надеялся найти пакет python, который делает вещи более удобными для пользователя (например, использование функции mapmultiprocessing), но также имеет немного больше контроля над тем, сколько процессов порождать и на каком из узлов. Я видел несколько пакетов, которые реализуют map, но не контролируют, сколько процессов генерируется на каждом узле.Отправка процесса на разные узлы с помощью mpi4py

Следующий код приближается к иллюстрации того, что я имею в виду. Однако, вместо того, чтобы писать его обычным способом, вы должны были бы с MPI4py. Я написал его так же, как и с функцией map. Я написал это так, потому что это в конечном итоге то, как я хотел бы реализовать код (с модулем, который эмулирует map), и потому что я не совсем уверен, как бы я написал его с помощью MPI для достижения того, что я хочу делать.

from numpy import * 
from multiprocessing import Pool 

def foo(n): 
    random.seed(n) 
    a = random.randn(1000,1000) 
    b = random.randn(1000,1000) 
    c = dot(a, b) 
    return c.mean() 


if __name__ == '__main__': 
    pool = Pool(processes=4) 
    results = pool.map(foo, range(4)) 
    print results 

Причина, почему я хочу, чтобы контролировать количество процессов, направленных на каждый узел является то, что некоторые из инструкций внутри из foo может быть многопоточной (например, dot, который также будет связан с библиотеками MKL).

Если у меня есть кластер из 12 компьютеров с 2 ядрами, я хотел бы просто отправить одно задание каждому из 12 узлов, где он будет неявно использовать оба ядра. Я не хочу создавать 24 задания (по одному для каждого ядра), потому что меня беспокоит возможное прерывание потока, когда оба процесса пытаются использовать оба ядра. Я также не могу просто порождать 12 процессов, потому что я не могу быть уверен, что он отправит их каждому узлу, а не 2 первым 6 узлам.

Прежде всего, должно ли это быть серьезной проблемой? Сколько из эффекта будет работать 24 процесса вместо 12 на производительность?

Если это будет иметь значение, есть ли пакет python, который будет накладываться поверх MPI4py и делать то, что я ищу?

ответ

1

Я хотел то же самое, поэтому я написал proof of concept, который отслеживает, сколько рабочих процессов простаивает на каждом хосте. Если у вас есть задание, которое будет использовать два потока, то он ждет, пока у хоста не будет два бездельных рабочих, назначит задание одному из этих работников и оставит другого рабочего бездействия до завершения задания.

Чтобы указать, сколько процессов запускается на каждом хосте, вы используете a hostfile.

Ключ для корневого процесса, чтобы получать сообщения от любого другого процесса:

source_host, worker_rank, result = MPI.COMM_WORLD.recv(source=MPI.ANY_SOURCE) 

Таким образом, он узнает, как только каждая работа закончена. Затем, когда он будет готов, он посылает задание к определенному рабочим:

comm.send(row, dest=worker_rank) 

В конце концов, он говорит всем рабочим, чтобы закрыть, отправив None сообщений:

comm.send(None, dest=worker_rank) 

После того как я написал , Я нашел jbornschein's mpi4py task pull example. Он не обрабатывает количество потоков для каждого задания, но мне нравится, как он использует теги для разных типов сообщений.

Смежные вопросы