Невозможно запустить OpenMPI на более чем двух компьютерах
При попытке запустить первый пример в руководстве boost::mpi я не смог запустить более двух машин. В частности, это, кажется, работает нормально:
mpirun -hostfile hostnames -np 4 boost1
с каждым именем хоста в именах хостов как <node_name> slots=2 max_slots=2
, Но когда я увеличиваю количество процессов до 5, он просто зависает. Я уменьшил количество slots
/max_slots
до 1 с тем же результатом, когда я превышаю 2 машины. На узлах это отображается в списке заданий:
<user> Ss orted --daemonize -mca ess env -mca orte_ess_jobid 388497408 \
-mca orte_ess_vpid 2 -mca orte_ess_num_procs 3 -hnp-uri \
388497408.0;tcp://<node_ip>:48823
Кроме того, когда я убиваю это, я получаю это сообщение:
node2- daemon did not report back when launched
node3- daemon did not report back when launched
Кластер настроен с mpi
а также boost
libs доступны на смонтированном диске NFS. Я захожу в тупик с NFS? Или что-то еще происходит?
Обновление: чтобы быть ясно, программа повышения, которую я запускаю,
#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <iostream>
namespace mpi = boost::mpi;
int main(int argc, char* argv[])
{
mpi::environment env(argc, argv);
mpi::communicator world;
std::cout << "I am process " << world.rank() << " of " << world.size()
<< "." << std::endl;
return 0;
}
Из рекомендаций@Dirk Eddelbuettel я скомпилировал и запустил пример mpi hello_c.c
, следующее
#include <stdio.h>
#include "mpi.h"
int main(int argc, char* argv[])
{
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
printf("Hello, world, I am %d of %d\n", rank, size);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
return 0;
}
Он отлично работает на одной машине с несколькими процессами, включая sshing на любом из узлов и работает. Каждый вычислительный узел идентичен рабочему и mpi / boost каталогам, смонтированным с удаленного компьютера через NFS. При запуске программы boost с файлового сервера (идентичного узлу, кроме boost / mpi локального), я могу работать на двух удаленных узлах. Для "Привет, мир", однако, запустить команду mpirun -H node1,node2 -np 12 ./hello
я получил
[<node name>][[2771,1],<process #>] \
[btl_tcp_endpoint.c:638:mca_btl_tcp_endpoint_complete_connect] \
connect() to <node-ip> failed: No route to host (113)
в то время как все "Hello World's" напечатаны, и он висит в конце. Однако поведение при запуске с вычислительного узла на удаленном узле отличается.
И "Hello world", и код повышения просто зависают с mpirun -H node1 -np 12 ./hello
при запуске с узла 2 и наоборот. (Повесьте в том же смысле, что и выше: orted работает на удаленной машине, но не общается обратно.)
Тот факт, что поведение отличается от работы на файловом сервере, где библиотеки mpi являются локальными, а не на вычислительном узле, говорит о том, что я могу столкнуться с тупиком NFS. Это разумный вывод? Предполагая, что это так, как я могу настроить mpi, чтобы я мог статически связать его? Кроме того, я не знаю, что делать с ошибкой, которую я получаю при запуске с файлового сервера, какие-либо мысли?
3 ответа
Ответ оказался простым: открыть mpi, прошедший аутентификацию через ssh, а затем открыть сокеты tcp / ip между узлами. Брандмауэры на вычислительных узлах были настроены на прием только ssh-соединений друг от друга, а не произвольных соединений. Итак, после обновления iptables hello world работает как чемпион по всем узлам.
Изменить: Следует отметить, что брандмауэр файлового сервера допускает произвольные подключения, поэтому запуск программы на нем MPI будет вести себя иначе, чем просто запуск на вычислительных узлах.
Попробуйте использовать параметр --mca btl_tcp_if_include eth0, чтобы узлы использовали только интерфейс eth0 и не позволяли OpenMPI определить, какая сеть была лучшей. Существует также --mca btl_tcp_if_exclude eth0 Не забудьте заменить eth0 для вашего конкретного интерфейса.
Мой /etc/hosts содержал такие строки:
10.1.2.13 узел13
...
10.1.3.13 node13-ib
Когда я запустил mpirun, была выбрана сеть TCP, и узлы использовали сеть TCP, однако через некоторое время (20 секунд) OpenMPI обнаружил IP-адреса 10.1.3.XXX и попытался использовать их, что вызвало сообщение об ошибке.
Я надеюсь, что это помогает
Моей первой рекомендацией будет упрощение:
- Можете ли вы построить стандартный пример MPI "Привет, мир"?
- Вы можете запустить его несколько раз на локальном хосте?
- Вы можете выполнить на другом хосте через
ssh
- путь идентичен
и если так, то
mpirun -H host1,host2,host3 -n 12 ./helloworld
должен путешествовать через. Как только вы разберетесь с этими основами, попробуйте учебник по Boost... и убедитесь, что у вас есть библиотеки Boost и MPI на всех хостах, на которых вы планируете работать.