ipython с кластеризацией MPI с использованием машинного файла

Я успешно настроил mpi с поддержкой mpi4py на трех узлах в соответствии с тестированием сценария hellowworld.py в демонстрационном каталоге mpi4py:

gms@host:~/development/mpi$ mpiexec -f machinefile -n 10 python ~/development/mpi4py/demo/helloworld.py

Hello, World! I am process 3 of 10 on host.
Hello, World! I am process 1 of 10 on worker1.
Hello, World! I am process 6 of 10 on host.
Hello, World! I am process 2 of 10 on worker2.
Hello, World! I am process 4 of 10 on worker1.
Hello, World! I am process 9 of 10 on host.
Hello, World! I am process 5 of 10 on worker2.
Hello, World! I am process 7 of 10 on worker1.
Hello, World! I am process 8 of 10 on worker2.
Hello, World! I am process 0 of 10 on host.

Теперь я пытаюсь заставить это работать в ipython и добавил свой машинный файл в мой файл $IPYTHON_DIR/profile_mpi/ipcluster_config.py следующим образом:

c.MPILauncher.mpi_args = ["-machinefile", "/home/gms/development/mpi/machinefile"]

Затем я запускаю блокнот iPython на головном узле с помощью команды: ipython notebook --profile=mpi --ip=* --port=9999 --no-browser &

и, вуаля, я могу получить к нему доступ с другого устройства в моей локальной сети. Однако, когда я запускаю helloworld.py из блокнота iPython, я получаю ответ только от головного узла: Hello, World! I am process 0 of 10 on host.

Я начал mpi с iPython с 10 движками, но...

Я дополнительно настроил эти параметры, на всякий случай

в $IPYTHON_DIR/profile_mpi/ipcluster_config.py

c.IPClusterEngines.engine_launcher_class = 'MPIEngineSetLauncher'

в $IPYTHON_DIR/profile_mpi/ipengine_config.py

c.MPI.use = 'mpi4py'

в $IPYTHON_DIR/profile_mpi/ipcontroller_config.py

c.HubFactory.ip = '*'

Однако и они не помогли.

Что мне не хватает, чтобы заставить это работать правильно?

ИЗМЕНИТЬ ОБНОВЛЕНИЕ 1

Теперь у меня есть смонтированные каталоги NFS на моих рабочих узлах, и, таким образом, я выполняю требование «В настоящее время ipcluster требует, чтобы каталог IPYTHONDIR/profile_/security находился в общей файловой системе, которую видят как контроллер, так и механизмы». чтобы иметь возможность использовать ipcluster для запуска моего контроллера и двигателей с помощью команды ipcluster start --profile=mpi -n 6 &.

Итак, я выдаю это на своем головном узле, а затем получаю:

2016-03-04 20:31:26.280 [IPClusterStart] Starting ipcluster with [daemon=False] 2016-03-04 20:31:26.283 [IPClusterStart] Creating pid file: /home/gms/.config/ipython/profile_mpi/pid/ipcluster.pid 2016-03-04 20:31:26.284 [IPClusterStart] Starting Controller with LocalControllerLauncher 2016-03-04 20:31:27.282 [IPClusterStart] Starting 6 Engines with MPIEngineSetLauncher 2016-03-04 20:31:57.301 [IPClusterStart] Engines appear to have started successfully

Затем выполните ту же команду для запуска двигателей на других узлах, но я получаю:

2016-03-04 20:31:33.092 [IPClusterStart] Removing pid file: /home/gms/.config/ipython/profile_mpi/pid/ipcluster.pid 2016-03-04 20:31:33.095 [IPClusterStart] Starting ipcluster with [daemon=False] 2016-03-04 20:31:33.100 [IPClusterStart] Creating pid file: /home/gms/.config/ipython/profile_mpi/pid/ipcluster.pid 2016-03-04 20:31:33.111 [IPClusterStart] Starting Controller with LocalControllerLauncher 2016-03-04 20:31:34.098 [IPClusterStart] Starting 6 Engines with MPIEngineSetLauncher [1]+ Stopped ipcluster start --profile=mpi -n 6

без подтверждения того, что Engines appear to have started successfully ...

Еще больше сбивает с толку то, что когда я делаю ps au на рабочих узлах, я получаю:

gms       3862  0.1  2.5  38684 23740 pts/0    T    20:31   0:01 /usr/bin/python /usr/bin/ipcluster start --profile=mpi -n 6
gms       3874  0.1  1.7  21428 16772 pts/0    T    20:31   0:01 /usr/bin/python -c from IPython.parallel.apps.ipcontrollerapp import launch_new_instance; launch_new_instance() --profile-dir /home/gms/.co
gms       3875  0.0  0.2   4768  2288 pts/0    T    20:31   0:00 mpiexec -n 6 -machinefile /home/gms/development/mpi/machinefile /usr/bin/python -c from IPython.parallel.apps.ipengineapp import launch_new
gms       3876  0.0  0.4   5732  4132 pts/0    T    20:31   0:00 /usr/bin/ssh -x 192.168.1.1 "/usr/bin/hydra_pmi_proxy" --control-port 192.168.1.200:36753 --rmk user --launcher ssh --demux poll --pgid 0 -
gms       3877  0.0  0.1   4816  1204 pts/0    T    20:31   0:00 /usr/bin/hydra_pmi_proxy --control-port 192.168.1.200:36753 --rmk user --launcher ssh --demux poll --pgid 0 --retries 10 --proxy-id 1
gms       3878  0.0  0.4   5732  4028 pts/0    T    20:31   0:00 /usr/bin/ssh -x 192.168.1.201 "/usr/bin/hydra_pmi_proxy" --control-port 192.168.1.200:36753 --rmk user --launcher ssh --demux poll --pgid 0
gms       3879  0.0  0.6   8944  6008 pts/0    T    20:31   0:00 /usr/bin/python -c from IPython.parallel.apps.ipengineapp import launch_new_instance; launch_new_instance() --profile-dir /home/gms/.config
gms       3880  0.0  0.6   8944  6108 pts/0    T    20:31   0:00 /usr/bin/python -c from IPython.parallel.apps.ipengineapp import launch_new_instance; launch_new_instance() --profile-dir /home/gms/.config

Где IP-адреса в процессах 3376 и 3378 принадлежат другим хостам в кластере. Но...

Когда я запускаю аналогичный тест напрямую с помощью ipython, все, что я получаю, это ответ от локального хоста (хотя, за исключением ipython, это работает напрямую с mpi и mpi4py, как указано в моем исходном посте):

gms@head:~/development/mpi$ ipython test.py
head[3834]: 0/1

gms@head:~/development/mpi$ mpiexec -f machinefile -n 10 ipython test.py
worker1[3961]: 4/10
worker1[3962]: 7/10
head[3946]: 6/10
head[3944]: 0/10
worker2[4054]: 5/10
worker2[4055]: 8/10
head[3947]: 9/10
worker1[3960]: 1/10
worker2[4053]: 2/10
head[3945]: 3/10

Кажется, я все еще упускаю что-то очевидное, хотя я убежден, что моя конфигурация теперь верна. Одна вещь, которая всплывает, это когда я запускаю ipcluster на своих рабочих узлах, я получаю это: 2016-03-04 20:31:33.092 [IPClusterStart] Removing pid file: /home/gms/.config/ipython/profile_mpi/pid/ipcluster.pid

ИЗМЕНИТЬ ОБНОВЛЕНИЕ 2

Это больше для документирования того, что происходит, и, надеюсь, в конечном итоге, что заставляет это работать:

Я очистил файлы журнала и перевыпустил ipcluster start --profile=mpi -n 6 &

А теперь смотрите 6 лог-файлов для моих движков и 1 для моего контроллера:

drwxr-xr-x 2 gms gms 12288 Mar  6 03:28 .
drwxr-xr-x 7 gms gms  4096 Mar  6 03:31 ..
-rw-r--r-- 1 gms gms  1313 Mar  6 03:28 ipcontroller-15664.log
-rw-r--r-- 1 gms gms   598 Mar  6 03:28 ipengine-15669.log
-rw-r--r-- 1 gms gms   598 Mar  6 03:28 ipengine-15670.log
-rw-r--r-- 1 gms gms   499 Mar  6 03:28 ipengine-4405.log
-rw-r--r-- 1 gms gms   499 Mar  6 03:28 ipengine-4406.log
-rw-r--r-- 1 gms gms   499 Mar  6 03:28 ipengine-4628.log
-rw-r--r-- 1 gms gms   499 Mar  6 03:28 ipengine-4629.log 

Глядя в журнал для ipcontroller, похоже, что зарегистрирован только один движок:

2016-03-06 03:28:12.469 [IPControllerApp] Hub listening on tcp://*:34540 for registration.
2016-03-06 03:28:12.480 [IPControllerApp] Hub using DB backend: 'NoDB'
2016-03-06 03:28:12.749 [IPControllerApp] hub::created hub
2016-03-06 03:28:12.751 [IPControllerApp] writing connection info to /home/gms/.config/ipython/profile_mpi/security/ipcontroller-client.json
2016-03-06 03:28:12.754 [IPControllerApp] writing connection info to /home/gms/.config/ipython/profile_mpi/security/ipcontroller-engine.json
2016-03-06 03:28:12.758 [IPControllerApp] task::using Python leastload Task scheduler
2016-03-06 03:28:12.760 [IPControllerApp] Heartmonitor started
2016-03-06 03:28:12.808 [IPControllerApp] Creating pid file: /home/gms/.config/ipython/profile_mpi/pid/ipcontroller.pid
2016-03-06 03:28:14.792 [IPControllerApp] client::client 'a8441250-d3d7-4a0b-8210-dae327665450' requested 'registration_request'
2016-03-06 03:28:14.800 [IPControllerApp] client::client '12fd0bcc-24e9-4ad0-8154-fcf1c7a0e295' requested 'registration_request'
2016-03-06 03:28:18.764 [IPControllerApp] registration::finished registering engine 1:'12fd0bcc-24e9-4ad0-8154-fcf1c7a0e295'
2016-03-06 03:28:18.768 [IPControllerApp] engine::Engine Connected: 1
2016-03-06 03:28:20.800 [IPControllerApp] registration::purging stalled registration: 0

Разве каждый из 6 двигателей не должен быть зарегистрирован?

2 журнала движка выглядят нормально:

2016-03-06 03:28:13.746 [IPEngineApp] Initializing MPI:
2016-03-06 03:28:13.746 [IPEngineApp] from mpi4py import MPI as mpi
mpi.size = mpi.COMM_WORLD.Get_size()
mpi.rank = mpi.COMM_WORLD.Get_rank()

2016-03-06 03:28:14.735 [IPEngineApp] Loading url_file     u'/home/gms/.config/ipython/profile_mpi/security/ipcontroller-engine.json'
2016-03-06 03:28:14.780 [IPEngineApp] Registering with controller at tcp://127.0.0.1:34540
2016-03-06 03:28:15.282 [IPEngineApp] Using existing profile dir:    
u'/home/gms/.config/ipython/profile_mpi'
2016-03-06 03:28:15.286 [IPEngineApp] Completed registration with id 1

в то время как другой зарегистрирован с id 0

Но остальные 4 двигателя выдали ошибку тайм-аута:

2016-03-06 03:28:14.676 [IPEngineApp] Initializing MPI:
2016-03-06 03:28:14.689 [IPEngineApp] from mpi4py import MPI as mpi
mpi.size = mpi.COMM_WORLD.Get_size()
mpi.rank = mpi.COMM_WORLD.Get_rank()

2016-03-06 03:28:14.733 [IPEngineApp] Loading url_file u'/home/gms/.config/ipython/profile_mpi/security/ipcontroller-engine.json'
2016-03-06 03:28:14.805 [IPEngineApp] Registering with controller at tcp://127.0.0.1:34540
2016-03-06 03:28:16.807 [IPEngineApp] Registration timed out after 2.0 seconds

Хммм... Я думаю, я могу попробовать переустановить ipython завтра.

ИЗМЕНИТЬ ОБНОВЛЕНИЕ 3

Были установлены конфликтующие версии ipython (похоже через apt-get и pip). Удаление и повторная установка с помощью pip install ipython[all]...

ИЗМЕНИТЬ ОБНОВЛЕНИЕ 4

Я надеюсь, что кто-то найдет это полезным, И я надеюсь, что кто-то может в какой-то момент внести свой вклад, чтобы помочь прояснить некоторые вещи.

Во всяком случае, я установил virtualenv, чтобы изолировать свою среду, и, я думаю, это похоже на некоторый успех. Я запустил «ipcluster start -n 4 --profile=mpi» на каждом из своих узлов, затем ssh вернулся к головному узлу и запустил тестовый скрипт, который сначала вызывает ipcluster. Следующий вывод: signs of parallelism Итак, выполняются параллельные вычисления.

Однако, когда я запускаю свой тестовый скрипт, который запрашивает все узлы, я просто получаю головной узел:

здесь нет параллелизма

Но, опять же, если я просто запущу команду mpiexec, все будет отлично.

Чтобы добавить путаницы, если я смотрю на процессы на узлах, я вижу всевозможное поведение, указывающее на то, что они работают вместе: монитор процессов

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

# test_mpi.py
import os
import socket
from mpi4py import MPI

MPI = MPI.COMM_WORLD

print("{host}[{pid}]: {rank}/{size}".format(
    host=socket.gethostname(),
    pid=os.getpid(),
    rank=MPI.rank,
    size=MPI.size,
))

person horcle_buzz    schedule 27.02.2016    source источник
comment
Ноутбук не запускает автоматически какие-либо параллельные вычислительные механизмы, и если вы не используете ipcluster, файл конфигурации ipcluster_config.py, вероятно, ничего не делает.   -  person Thomas K    schedule 29.02.2016
comment
Да, я понял это после дальнейшего изучения проблемы... Мне нужно установить NFS на свои хосты и заставить работать ipcluster. Кажется, это наименее безболезненный путь.   -  person horcle_buzz    schedule 01.03.2016


Ответы (1)


Не знаю почему, но я воссоздал свой файл ipcluster_config.py и снова добавил к нему c.MPILauncher.mpi_args = ["-machinefile", "path_to_file/machinefile"] и на этот раз это сработало - по какой-то странной причине. Я мог бы поклясться, что у меня это было раньше, но, увы...

person horcle_buzz    schedule 26.03.2016