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

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

Если вы готовы установить пакет с открытым исходным кодом, вам следует подумать о 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.