У меня есть функция, которую я хотел бы оценивать по нескольким узлам кластера. Я получил простые примеры для запуска в нашем кластере с использованием MPI4py
, но надеялся найти пакет python, который делает вещи более удобными для пользователя (например, использование функции map
multiprocessing
), но также имеет немного больше контроля над тем, сколько процессов порождать и на каком из узлов. Я видел несколько пакетов, которые реализуют 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
и делать то, что я ищу?