Создание кластера для расчета в OpenFOAM
В статье я расскажу, как можно (при необходимости) быстро и дешево собрать кластер Beowulf на основе домашних компьютеров. Выполню я это с помощью компьютеров находящихся в аудитории университета, используя существующую локальную сеть. Используемые программные инструменты: средства численного моделирования механики сплошных сред OpenFOAM, сетевого протокола прикладного уровня SSH и распределенного протокола файловой системы NFS. Все выполнялось под управлением операционной системы ubuntu 20.04.
Предисловие
Я студент, и мне в прошлом полугодии необходимо было произвести расчет аэродинамики крайне сложного аэродинамического изделия. Мой стационарный компьютер справился с этой задачей весьма долго, в связи с чем потребовалось объединение вычислительных мощностей нескольких компьютеров. Так что в этой статье будет рассмотрены только создание и тестовый запуск расчетов без визуализации массива данных с помощью программы ParaView.
Тут будет написана инструкция туториал для тех кто хочет повторить. По учебной деятельности я являюсь конструктором, в результате чего при описании команд могут возникать неточности.
Введение
Определение кластера
Кластер – группа компьютеров, объединенных в локальную вычислительную сеть (ЛВС) и способных работать в качестве единого вычислительного ресурса.
Предполагается, что для кластера обеспечивается более высокая надежность и эффективность, нежели для ЛВС, и существенно более низкая стоимость в сравнении с другими типами параллельных вычислительных систем (за счет использования типовых аппаратных и программных решений).
Кластер Beowulf
В настоящее время под кластером типа Beowulf понимается система, которая состоит из одного серверного узла и одного или более клиентских узлов, соединенных при помощи Ethernet или некоторой другой сети. Это система, построенная из готовых серийно выпускающихся промышленных компонентов, на которых может работать ОС Linux, стандартных адаптеров Ethernet и коммутаторов. Она не содержит специфических аппаратных компонентов и легко воспроизводима. Серверный узел управляет всем кластером и является файл-сервером для клиентских узлов. Он также является консолью кластера и шлюзом во внешнюю сеть. Большие системы Beowulf могут иметь более одного серверного узла, а также, возможно, специализированные узлы, например консоли или станции мониторинга. Они конфигурируются и управляются серверными узлами и выполняют только то, что предписано серверным узлом.
Вычислительная среда OpenFOAM
OpenFOAM - это бесплатное программное обеспечение CFD с открытым исходным кодом, разработанное, в основном, компанией OpenCFD Ltd с 2004 года. Оно имеет большую базу пользователей в большинстве областей техники и науки, как коммерческих, так и академических организаций. OpenFOAM имеет широкий набор функций для решения любых задач - от сложных потоков жидкости, включающих химические реакции, турбулентность и теплопередачу, до акустики, механики твердого тела и электромагнитных систем.
Настройка рабочей среды
Физическое соединение устройств
Два и более компьютера нужно соединить друг с другом. Самый простой способ это сделать - задействовать коммутатор и соединить их с помощью витой пары.
Выбор операционной системы
Решено использовать систему Linux, конкретный дистрибутив - Ubuntu 20.04, десктопной и серверной версии соответственно.
Это связано с тем, что по состоянию на 2022 год среда вычисления OpenFOAM, выбранная для расчётов, стабильно работает именно на этом дистрибутиве именно этой версии. Также система Linux, будучи системой с распространяемыми исходными кодами, является основой для кластера Beowulf.
Десктоп-версия
Десктоп-версия - это версия системы, имеющая графический интерфейс. Он нужен будет для удобного взаимодействия с файлами, а также для просмотра результатов расчёта. Десктоп-версия будет стоять на главном компьютере.
После того, как вы с загрузочного диска запустите установщик, следуйте серии шагов:
Выберите язык (предпочтителен English);
Нажимаем install ubuntu;
Выберите язык (предпочтителен English);
Не изменяем предустановленные программы;
Не изменяем типы инсталляторов;
Выбираем время системы;
Введите имя пользователя (в данном случае используется pisi), а также пароль. Пароли и имена серверов должны быть абсолютно одинаковы для всех компьютеров, связанных с кластером.
После перезагрузите систему (вам предложит это сделать система)
Серверная версия
Серверная же версия будет стоять на всех остальных компьютерах. На них не потребуется работать с файлами, или просматривать результаты. Все остальные компьютеры нужны исключительно, как дополнительные ресурсы для вычислений, и поэтому для них достаточно самой компактной системы с самым малым набором функций.
После того, как вы с загрузочного диска запустите установщик, следуйте серии шагов:
Выберите язык (предпочтителен English);
Не обновляйте установщик;
Не изменяйте настройки клавиатуры;
Не изменяйте настройки сети;
Используйте весь диск для установки и подтвердите его перезапись, если потребуется;
Не изменяйте настройки зеркала;
Не изменяйте настройки файловой системы;
Введите имя пользователя, сервера, а также пароль. Пароли и имена серверов должны быть абсолютно одинаковы для всех компьютеров, связанных с кластером.
Установите OpenSSH-сервер;
Server Snaps оставьте без изменений;
После окончания установки извлеките загрузочный диск и перезагрузите компьютер.
Завершения установки
В обоих случаях, вам надо завершить установку, зайдя в директорию Home /home/<user>/, и создать папку OpenFOAM mkdir/OpenFOAM. Должен получиться путь: /home/<user>/OpenFOAM. <user> — это заданное вами имя пользователя (на изображениях в данном документе можно заметить имя «pisi»).
Наличие подкаталогов в текущем каталоге можно проверить с помощью команды ls.
Установка OpenFOAM
Установка OpenFOAM состоит так же из двух этапах и должна производиться всех компьютерах участвующих в объединении, это связано с тем, что OpenFOAM это не программа, а набор библиотек необходимых для произведения расчетов системы.
Для того чтобы установить OpenFOAM необходимо в терминале прописать следующую команду что представлена ниже.
curl -s https://dl.openfoam.com/add-debian-repo.sh | sudo bash
Кратко опишем функционал команды.
curl — команда взаимодействия с интернетом.
-s –- сохранение скачанных фалов в систему.
url — ссылка на скачиваемый файл.
bash — дает возможность создания скриптов.
Примечание: если по каким то причинам не оказалось команды curl, то введите следующую команду в терминал: sudo apt install curl и убедиться что установлена правильная версия системы.
Далее необходимо распаковать и скомпилировать выше установленный набор библиотек. Для этого необходимо выполнить команду, приведенную ниже.
sudo apt-get install openfoam2006-default
Примечания: так как это набор библиотек, то нет практического способа проверить правильность действий, то необходимо проверить их наличие в файловой системе операционной системы.
Для этого необходимо выполнить следующую команду в терминале.
cd /usr/lid/openfoam2006/
Кратко опишем функционал команды.
cd — это переход в папку по пути.
далее идет путь.
Если в результате выполнения команды не появилось ошибок, то все действия выполнены правильно, в противном случае выполните последовательность действий начиная с скачивания OpenFOAM.
Если проверка прошла успешно, то выполняем команду cd.
Установка и настройка SSH
SSH — это защищенный протокол для удаленного управления операционной системой. Он пригодится для безопасного соединения компьютеров друг с другом.
Десктоп-версия
Десктоп-версия по-умолчанию не имеет встроенного SSH, поэтому его нужно установить, это продемонстрировано на примере ниже.
sudo apt install openssh-server
Других отличий нет. Выполняйте все те шаги, что описаны ниже, для серверной версии.
Серверная версия
В отличие от версии с графическим интерфейсом, серверная версия по-умолчанию имеет в себе предустановленный пакет OpenSSH (точнее, эту опцию можно выбрать при установке), и здесь этап установки не требуется. В противном же случае повторите действия, предназначенные для десктоп-версии.
Следом выполните следующие шаги.
Команда | Описание |
mkdir ~/.ssh | Создаёт директорию SSH. Может выдать ошибку, если директория уже есть. |
chmod 700 ~/.ssh | Назначает права полного доступа для этой директории. Может потребоваться ввести вместе с sudo. |
ssh-keygen | Создаёт новый ключ. Оставьте все поля по-умолчанию. |
ssh-copy-id -i /home/<user>/.ssh/id_rsa.pub <user>@<ip> | Копирует ваш ключ на другой компьютер по IP-адресу. Это позволит вам позже входить на этот компьютер без пароля. <user> — это имя вашего пользователя. <ip> — это IP-адрес компьютера, куда вы передаёте ключ. |
ssh <user>@<ip> | Проверка подключения (должна быть без пароля). |
Настройте так все компьютеры. Ключи должны быть переданы каждому сателлиту от сервера, и наоборот.
Примечание: для проверки работоспособности SSH соединение необходимо проверить несколько условий:
Соединение должно работать от каждого устройства к каждому.
Все устройства должны производить соединения без пароля за исключением первого раза.
Главное, чтобы главный компьютер мог подключиться к серверу и наоборот без пароля.
Установка и настройка NFS
Установка NFS для Десктоп-версии
В командной строке необходимо прописать команду установки утилиты для создания общей сетевой папки среди всех компьютерах кластера.
Примечание: предварительно необходимо иметь папку в домашнем каталоге, если этого нет, то просмотрите пункт "Завершения установки".
Чтобы установить NFS, необходимо скачать его. Для этого пропишем в терминале следующую команду.
sudo apt install nfs-kernell-server
После установки системной утилиты необходимо указать права доступа к папке, которую необходимо синхронизировать. Для этого в терминале нужно прописать следующий набор команд.
sudo chown nobody:nogroup /home/{name}/OpenFOAM/
Кратко опишем функционал команды.
chown - это изменение владельца файла или папки
nobody:nogroup - сообщает системе что папка не принадлежит не одному владельцу и группе
Предоставим права доступа для папки.
sudo chown 777 /home/{name}/OpenFOAM/
Кратко опишем функционал команды:
777 — это теговое значение прав доступа к последующей папке.
После необходимо внести изменения в файл exports, указав узлы связи, которые вы хотите подключить к ранее приписываемой папке.
sudo nano /etc/exports
Кратко опишем функционал команды:
nano — это встроенный редактор текста, основные команды которого являются: Ctrl+S (сохранение файла) и Ctrl+X (выход из редактора).
В самом редакторе необходимо в конце прописать следующую строку.
/home/{name}/OpenFOAM {IP-адрес узлов сервера}(rw, sync,no_subtree_check)
После вписывания в файл следующей команды, повторяем её со всеми компьютерами серверной версии операционной системы.
Примечание: для того чтобы узнать IP-адрес компьютера, в командной строке введите команду ip address, там вы сможете узнать узнать адрес конкретной системы.
После всех вышеописанных действий необходимо произвести монтирование сервера. Для этого пропишем в терминале команду.
sudo exportfs -a
Кратко опишем функционал команды:
exportfs — это изменяемый файл.
-a — то применения изменений к нему.
Следующим шагом необходимо произвести перезагрузку сервера с настроенными параметрами сетевой папки. Для этого пропишем команду в терминале, представленную ниже.
sudo systemctl restart nfs-kernel-server.service
Кратко опишем функционал команды:
systemctl — системный диспетчер.
restart — рестарт сервера.
nfs-kernel-server.service — файл сервера .
Настройка утилиты NFS для серверной версии
Для этого необходимо произвести закачку программного пакета на устройства. Воспользуемся командной, вводимой в терминале.
sudo apt install nfs-common
После, по аналогии с десктоп-версией, необходимо изменить файлы настройки сетевой папки. Для этого воспользуемся командой.
sudo nano /efc/fstab
После введем в редакторе кода одну строчку, относящуюся к десктоп-версии системы.
{ip - десктоп версии}:/home/{name}/OpenFOAM nfs defoults 0 1
Примечание: Ctrl+S (сохранение файла) и Ctrl+X (выход из редактора).
Далее смонтируем точку для того, чтобы сообщить десктоп-версии, что сервер готов к общению.
sudo mount —all
Примечание: Тут могут возникнуть проблемы, это нормально, значит вы что то сделали не так, как было указано в инструкции, это связано с тем что в Ubuntu нет фиксации ошибок. Для этого необходимо произвести ряд проверок, чтобы определить где произошла ошибка.
Проверьте настройку SSH, произведя подключения со всех устройств ко всем командой: ssh {name}@{ip}.
Проверьте отсутствие запрашиваемого пароля при SSH-соединение..
Проверьте правильность файлов, где прописываются IP-адреса.
Проверьте, чтобы не изменились IP-адреса во время настройки (такой случай возможен).
Проверьте опечатки местоположения синхронизируемой папки.
Проверьте одинаковость названий синхронизируемой папки.
Если все вышеперечисленные проверки прошли верно, однако система все равно не заработала, то сделайте все шаги заново, так как старые файлы не удаляются, есть шанс что вы случайно исправите ошибку (на практике это часто срабатывало).
Начало вычислений
Тест проверки ядер
Перед началом работы непосредственно с OpenFOAM стоит разработать программу, которая смогла бы проверить, отзываются ли ядра у всех компьютеров, которые надо будет использовать для последующих вычислений.
Программа написана на языке С. Исходный код этой программы компилируется в исполняемый файл, именуемый «mpi_hello» (тестовое наименование, наподобие «Hello World!»). Команда компиляции в терминале следующая.
mpicc mpi_hello.c -o mpi_hello ./mpi_hello
Кратко опишем функционал команды:
mpicc — команда запуска компиляции.
mpi_hello.c — файл с исходным кодом.
-o mpi_hello — выходной файл.
Полный исходный код этой программы приведен в приложении 1, здесь описаны основные моменты её работы.
int comm_sz;
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
char hostname[MPI_MAX_PROCESSOR_NAME];
int name_sz;
MPI_Get_processor_name(hostname, &name_sz);
Данный фрагмент кода последовательно получает три параметра: количество ядер, ранг текущего процесса, и имя хоста. Затем эти данные выводятся в терминал.
printf("Hello from %s, rank %d (of %d).\n", hostname, rank, comm_sz);
Программу можно запустить с помощью команды, представленной ниже.
mpirun ./mpi_hello
Кратко опишем функционал команды:
mpirun — запуск исполняемого файла.
./mpi_hello — исполняемый файл.
Результат выводится в консоль.
Проверка работы программы на нескольких ядрах
Следующий этап — указание количества ядер. Для mpirun это возможно сделать с помощью аргумента «np».
mpirun -np 2 ./mpi_hello
Кратко опишем функционал команды:
-np — указания количества ядер.
Результат работы представлен ниже.
Проверка работы на нескольких компьютерах
С помощью команды “mpirun” в терминале можно также послать скомпилированную программу на несколько компьютеров.
mpirun -np <кол-во процессоров> --hostfile <имя_файла> ./mpi_hello
Количество процессоров –- общее для всех компьютеров, а имя файла — это имя файла, где перечислены IP-адреса и количество ядер, которое будет у него использоваться.
127.0.0.1 slots=4
192.168.0.1 slots=4
192.168.0.105 slots=4
Параметр slots отвечает за количество ядер.
Первый адрес, 127.0.0.1, — это локальный адрес компьютера (localhost), с него всегда начинается основная работа. Другие IP-адреса — это IP-адреса других компьютеров.
Примечание. Данную команду не надо выполнять на компьютере-сателлите, так как локальный адрес будет совпадать с одним из ниже перечисленных, что приведёт к путанице с распределением и последующей ошибке.
Проверка концепции ускорения (уменьшение времени) скорости вычислений общей задачи. Для этого воспользуемся стандартной задачей предложенной openfoam на головной странице. Так что первоначально копируем пример из домашней директории OpenFOAM в папку, синхронизируемую ранее (сетевую папку).
cp /usr/lid/openfoam2006/tutorials/incompressible/simplefoam/motorBike /home/{name}/OpenFOAM/{name}-v2006/
Примечание: предварительно необходимо создать папку {name}-v2006 в папке синхронизируемой системы. Это можно сделать в ручном режиме, если вы создаёте его в десктоп-версии.
Далее, после того, как в соответствующий каталог скопируются файлы, необходимо будет запустить утилиту создания служебных файлов, находясь в импортированной папке.
./Allrun
После необходимо распаковать файл геометрии мотоцикла, для этого воспользуемся командой, описанной ниже, при использовании встроенного разархиватора.
cp $FOAM_TUTORIALS/resources/geometry/motorBike.obj.gz constant/triSurface/
Далее необходимо создать сетку на компьютере, так как необходимые файлы были экспортированы и распакованы выше. Для того, чтобы выполнить расчет сетки, необходимо прописать в консоли команду.
blockMesh
Примечание: этот процесс занимает крайне много времени и требует большой объем оперативной памяти. В нашем случае — около 80 ГБ на 3 компьютера. Чтобы не устанавливать дорогостоящую память в компьютер, необходимо увеличить файл подкачки на SSD-диске. Для этого необходимо выполнить команду.
sudo swapoff /swapfile
sudo fallocate -l {Количество дополнительной памяти}G /swapfile
Примечание: все промежуточные значения прописываются в файле log ,и если что то пошло не так, то подробности можно узнать там.
Далее, после просчета сетки, можно приступить к запуску самого расчета задачи. Для этого вставим в командную строку текст.
foamJob -p snappyHexMesh
ЗАКЛЮЧЕНИЕ
В результате проведения стресс тестов кластера на расчет были выявлены закономерности, приведенные в таблицах ниже с выводами. Так же приводятся казусы, которые не решились, или частично были решены в ходе выполнения работы.
Примечание: точность выводов основана на субъективной оценке в связи с невозможностью составления прогноза работы и скорости вычислений.
Мы провели два теста, на машине из 4-х ядер и одном компьютере и машине из 12 ядер и трех компьютеров. Расчет времени выполнения производился автоматически с записью в файл log, это нужно было для отладки работоспособности кластера, но этот процесс занимает определенное время, которое посчитать не удалось. Однако, так как геометрия была одинаковой и файлы log аналогичные, следовательно приобретенное время в двух тестах было одинаковым и в сравнении друг с другом не будут вносить ошибку. Далее приведена таблица с характеристиками двух тестов, которые мы посчитали уместным.
Свойство | 1 тест | 2 тест |
Количество компьютеров | 1 | 3 |
Операционные системы | Ubuntu desktop | Ubuntu desktop Ubuntu server Ubuntu server |
Ядра | 4 | 12 |
Размер сетки | 800, 200, 200 | 800, 200, 200 |
Время моделирования | 5000 | 5000 |
Время расчетов | 119.89 сек | 13.56 сек |
Пояснения:
Отсылка данных кластеру
Обработка кластером данных
Возврат данных головному устройству
Трудности и особенности работы с кластером:
В результате работы кластера были замечены особенности его использования.
Расчет сетки производится силам одного компьютера и составляет существенно больше времени относительно затраченного времени расчетов самой задачи.
Размер сетки выбран не случайно и составляет максимум возможности одной машины для составлении сетки. При этом у данной машины основные ограничения связаны с оперативной памятью (нехватка её количества), но сама машина обладала 80 ГБ оперативной памяти.
Смотря на график, можно сделать вывод, что время на передачу данных внутри локальной сети, кластер затратил примерно равное с времени самого решения задачи.
Если при добавление SWAP оставить мало памяти то после завершения расчетов создастся log файл, который может не поместиться в основную память компьютера и он зависнет намертво. После перезагрузки не будет грузится рабочий стол, однако SSH останется работать. Так что можно принудительно изменить размеры SWAP подключившись к машине через ранее созданный SSH сателлитов.
Приложение 1. Листинг исходного кода тестовой программы
#include <mpi.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
MPI_Init(NULL, NULL);
int comm_sz;
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
char hostname[MPI_MAX_PROCESSOR_NAME];
int name_sz;
MPI_Get_processor_name(hostname, &name_sz);
printf("Это %s, ядро %d (of %d).\n", hostname, rank, comm_sz);
MPI_Finalize();
return 0;
}
Приложение 2. Таблица последовательности введения команд
Главный | Сателлит |
sudo apt install neofetch | sudo apt install neofetch |
neofetch | neofetch |
curl -s https://dl.openfoam.com/add-debian-repo.sh | sudo bash | curl -s https://dl.openfoam.com/add-debian-repo.sh | sudo bash |
sudo apt-get install openfoam2006-default | sudo apt-get install openfoam2006-default |
sudo apt install openssh-server | |
mkdir ~/.ssh | mkdir ~/.ssh |
chmod 700 ~/.ssh | chmod 700 ~/.ssh |
ssh-keygen | ssh-keygen |
ssh-copy-id -i /home/<user>/.ssh/id_rsa.pub <user>@<ip> | ssh-copy-id -i /home/<user>/.ssh/id_rsa.pub <user>@<ip> |
ssh <user>@<ip> | ssh <user>@<ip> |
mkdir OpenFOAM | mkdir OpenFOAM |
sudo apt install nfs-kernell-server | sudo apt install nfs-common |
sudo chown nobody:nogroup /home/{name}/OpenFOAM/ | |
sudo chown 777 /home/{name}/OpenFOAM/ | |
sudo nano /etc/exports | sudo nano /efc/fstab |
/home/{name}/OpenFOAM {IP-адрес узлов сервера}(rw, sync,no_subtree_check) | {ip}:/home/pisi/OpenFOAM nfs defoults 0 1 |
sudo exportfs -a | |
sudo systemctl restart nfs-kernel-server.service | |
sudo ufw status | |
sudo mount –all |