Кластер MPI у нас получился случайно. Изначально мы собирали кластер на 32-битных старых машинах. Но задача оказалась непростой, и в качестве учебной цели мы собрали MPI-кластер на 64-битных машинах. Т.к. русскоязычной инструкции в Сети почему-то не нашлось, мы восполняем этот пробел.
Инструкция по созданию MPI-кластера
Инструкция описывает создание MPI-кластера из двух компьютеров – сервера и клиента. Дальнейшее расширение кластера достигается добавлением дополнительных клиентов.
Основным условием успешного создания кластера является идентичность операционных систем узлов, версий библиотек и т.д. Важно чтобы все узлы имели одного пользователя, например mpiuser
Данная инструкция написана летом 2020 года в процессе создания кластера, который заработал и показывается на видео в конце.
В качестве операционной системы был использован MX Linux 19.2 64-битный на обеих машинах. Компьютеры соединены обычным роутером ethernet. IP-адреса приведены такие, какие им выдал роутер. Для постоянного использования следует компьютерам придавать статические IP, либо прописать в роутере, чтобы он сам давал машинам постоянные адреса.
Для создания кластера производятся настройки сначала на сервере, потом на клиенте, потом опять на сервере. Эта инструкция будет дополняться и расширяться по возможности. Комментарии приветствуются.
На сервере
Обновляем систему
sudo su
apt update
apt upgrade
Ставим все необходимые пакеты
apt install mpich openmpi-bin openmpi-common libopenmpi-dev libgtk2.0-dev openssh-server nfs-kernel-server -y
Сервер должен иметь постоянный ip-адрес, который будет использоваться в дальнейших настройках.
Вносим изменения в файл hosts
sudo geany /etc/hosts
добавляем строки:
(в нашем случае ip сервера был 19.16.1.113)
19.16.1.113 GridServer
Сохраняем файл.
Далее создаем серверную папку nfs:
mkdir /home/mpiuser/cloud
Для публикации папки cloud необходимо внести в файл /etc/exports строку:
/home/mpiuser/cloud *(rw,sync,no_root_squash,no_subtree_check)
Далее команда
sudo exportfs -a
В папке cloud необходимо создать файл hostfile со списком допустимых участников nfs.
Пока вносим название сервера:
GridServer
Добавляем в папку cloud исполняемый файл mpi_sample.c (мы скачали c GitHub)
Проверяем работоспособность mpich
mpicc -o mpi_sample mpi_sample.c
mpirun -np 4 ./mpi_sample
4 – кол-во ядер в сервере. Скрип уже должен запускаться. Например, можно скачать скрипт, который посылает Hello World с каждого ядра.
На клиенте
Обновляем пакеты
sudo su
apt update
apt upgrade
Вносим изменения в файл hosts
sudo geany /etc/hosts
(в нашем случае ip сервера был 19.16.1.113)
19.16.1.113 GridServer
19.16.1.117 client001
Ставим пакеты:
apt install mpich openmpi-bin openmpi-common libopenmpi-dev libgtk2.0-dev openssh-server nfs-common -y
Создаем папку для nfs системы
mkdir /home/mpiuser/cloud
Привязываем к ней папку на сервере
sudo mount -t nfs GridServer:/home/mpiuser/cloud /home/mpiuser/cloud
В данный момент в папке cloud уже должны появиться файлы с сервера
Далее
sudo geany /etc/fstab
добавляем строку
GridServer:/home/mpiuser/cloud /home/mpiuser/cloud nfs
в hostfile (который подгрузился с сервера) добавляем имя клиента
GridServer
client001
На сервере
Теперь настраиваем ssh-доступ между машинами
Добавляем в /etc/hosts
19.16.1.117 client001
ssh-keygen -t rsa
ssh-copy-id client001
после этого должно логиниться по команде
ssh client001
И скрипт должен запускаться уже на двух машинах:
mpirun -np 8 ‐‐hostfile hostfile ./mpi_sample
И выдавать что-то типа:
Hello world! from processor 1
Hello world! from processor 2
…
8 — общее кол-во ядер у двух компьютеров, имена которых берутся из hostfile
Всем привет!
Видео тестов кластера собранного в феврале с небольшим рассказом про проект:
Доброго времени суток. Все это конечно здорово. Но как я понимаю, распараллеливаться будут только определенные программы, исходный код которых включает в себя инструкции mpi. Допустим к примеру есть большая софтинка, которую переписать будет достаточно проблемматично. Но чтобы заставить ее выполняться на mpi-кластере, необходимо изменять исходный код и переписывать его с использованием mpi, что не совсем эффективно в плане времени разработки и возможно качества. Или же она вовсе написана не на С и С++, а на других языках. Если я не прав, поправьте пожалуйста 🙂
Так вот, не смотрели ли вы в сторону mosix? Если смотрели и отказались от применения, может расскажете причины? И если вдруг вы находили другие решения, другие возможности, был бы благодарен, если поделитесь знаниями.
Да, верное замечание. Мы пока этим занимаемся исключительно ради спортивного интереса.
Задача состояла именно в оживлении старых 32-х битных машин хоть как-то. Пока сделали на 64-битных. Но вот уже приступили к созданию кластера на 32-битных машинах.
В технологии MPI в реализации MPICH, которую мы используем, можно распараллеливать программы на C, C++, Fortran. И действительно нужно вписывать туда синтаксис MPI.
MOSIX мы не пробовали, но почему бы и нет? 😉
Ещё одно направление, которое мы сейчас хотим опробовать это создание BOINC-кластера.
Интересно, если на Raspberry PI попробовать, взлетит?
Должен по идее. Raspbian — разновидность Debian-а все библиотеки должны подходить.
На старничке Github open-mpi написано, что поддерживаются arm v6 и v7, нужно смотреть по архитектуре конкретной raspberry pi.
вы собрали кластер на 32-х битных машинах? или только на 64-х ? была бы интересна инструкция по кластеру на 32-х битных машинах… и какие то практические примеры применения. спасибо за вашу работу!
На 32-х битных машинах мы кластер пока не собрали. Решили заморозить это направление. Инструкция там такая же, просто накатываете соответственно 32-х битные системы (правда их поддержка со временем постепенно прекращается).
Основная проблема — не удалось найти достаточное кол-во IDE-жестких дисков, которые бы устойчиво работали. Оказалось, что диски очень недолговечные устройства. Материнских плат много, а дисков нет (((
Интересно продумать альтернативный вариант — использование образов систем на флешках и запуск машины с флешки с образом пригодным для работы кластера.
Пока это представляется единственным адекватным решением для использования старых плат и процессоров.