Использование многопроцессорного модуля для кластерных вычислений - PullRequest
51 голосов
/ 03 марта 2011

Меня интересует запуск программы на Python с использованием компьютерного кластера.В прошлом я использовал интерфейсы Python MPI, но из-за трудностей с их компиляцией / установкой я бы предпочел решения, использующие встроенные модули, такие как многопроцессорный модуль Python .

Что я действительно хотел бы сделать, так это просто настроить экземпляр multiprocessing.Pool, который будет охватывать весь компьютерный кластер, и запустить Pool.map(...).Это что-то, что можно / легко сделать?

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

Ответы [ 4 ]

44 голосов
/ 03 марта 2011

Если под кластерными вычислениями вы имеете в виду системы с распределенной памятью (несколько узлов, а не SMP), то многопроцессорная обработка Python может оказаться неподходящим выбором.Он может порождать несколько процессов, но они по-прежнему будут связаны внутри одного узла.

Вам понадобится инфраструктура, которая обрабатывает процессы процессов на нескольких узлах и предоставляет механизм для связи между процессорами.(в значительной степени то, что делает MPI).

См. страницу Параллельная обработка на вики-сайте Python для получения списка структур, которые помогут в кластерных вычислениях.

Из списка pp , кувшин , пиро и сельдерей выглядят как разумные варианты, хотя я не могулично за любые ручаюсь, так как у меня нет опыта работы с любым из них (я использую в основном MPI).

Если важна простота установки / использования, я бы начал с изучения jug.Он прост в установке , поддерживает обычные системы пакетного кластера и выглядит хорошо документированным .

13 голосов
/ 03 марта 2011

В прошлом я использовал Pyro , чтобы сделать это довольно успешно.Если вы включите мобильный код, он автоматически отправит по проводам необходимые модули, которых у узлов еще нет.Довольно изящный.

1 голос
/ 25 мая 2018

Мне повезло, используя SCOOP в качестве альтернативы многопроцессорности для использования на одном или нескольких компьютерах, и получал выгоду от передачи заданий для кластеров, а также многих других функций, таких как вложенные карты и минимальные изменения кода, чтобы получить работа с картой ().

Источник доступен на Github. быстрый пример показывает, насколько простой может быть реализация!

0 голосов
/ 07 февраля 2019

Если вы готовы установить пакет с открытым исходным кодом, вам следует подумать о Ray , который из кластерных структур Python, вероятно, является вариантом, наиболее близким к однопоточному Python.Это позволяет вам распараллеливать как функции (как задачи), так и классы с состоянием (как акторы), и автоматически выполняет всю доставку и сериализацию данных, а также распространение сообщений об исключениях.Он также обеспечивает гибкость, аналогичную обычному Python (акторы могут передаваться, задачи могут вызывать другие задачи, могут быть произвольные зависимости данных и т. Д.).Подробнее об этом в документации .

В качестве примера, вот как вы бы сделали свой пример многопроцессорной карты в Ray:

import ray
ray.init()

@ray.remote
def mapping_function(input):
    return input + 1

results = ray.get([mapping_function.remote(i) for i in range(100)])

API немногонемного отличается от многопроцессорного API Python, но должен быть проще в использовании.Существует пошаговое руководство по , в котором описывается обработка зависимостей от данных, акторов и т. Д.

Вы можете установить Ray с помощью "pip install ray", а затем выполнить приведенный выше код наотдельный узел, или также легко настроить кластер, см. Поддержка облаков и Поддержка кластеров

Отказ от ответственности: я один из разработчиков Ray.

...