Вычислительный кластер в домашних условиях


dagget - Posted on 03 Июнь 2012

Вычислительные кластеры (Beowulf) используются в вычислительных целях: их применение позволяет уменьшить время расчетов по сравнению с персональным компьютером разбиением задачи на параллельно выполняющиеся подзадачи, обменивающиеся данными по сети. Конфигурация такого кластера проста и относительно недорога – связанные сетью персоналки с операционной системой линукс на борту.

В данной статье будут рассмотрены основы создание высокопроизводительного вычислительного кластера на основе операционной системы Debian GNU/Linux. Кому это может быть полезно? Если Вы занимаетесь параллельными вычислениями, используете библиотеки MPI в своих программах или моделях, то непременно Вам.

Стоит отметить, что, если Вы не используете уже отлаженные параллельные версии программ или моделей, а собираетесь писать свои, то, не имея навыков параллельного программирования, велика вероятность не получить ожидаемое быстродействие на вычислительном кластере.

Статья разбита на четыре части, в первой из которых речь пойдет об установке и настройке самой операционной системы Debian и подготовке ее к последующим манипуляциям. В остальных частях будут рассмотрены основы установки и насткойки различных дистрибутивов параллельной среды MPI, системы локального управления ресурсами Torque и системного монитора Ganglia.

Установка и настройка операционной системы Debian
Установка операционной системы
Конфигурация сетевых интерфейсов
Настройка получения обновлений для вычислительных узлов
Установка необходимого программного обеспечения
Синхронизация времени
Пользователи и группы. Ограничение количества ресурсов
Сетевая файловая система
Беспарольный доступ по SSH
Параллельная среда MPI
Пара слов о MPI
Использование компиляторов Intel
Установка и инициализания среды OpenMPI
Установка и инициализания среды Mpich2
Установка и инициализания среды Intel MPI
Система локального управления ресурсами Torque
Пара слов о системах локального управления ресурсами
Установка PBS-клиентов на вычислительные узлы
Настройка PBS-сервера на консоли кластера
Проверка работоспособности среды
Основы написания PBS-скриптов
Системный монитор Ganglia
Установка gmetad на консоль кластера
Установка ganglia-monitor на вычислительные узлы
Часть 1. Установка и настройка операционной системы Debian
Установка операционной системы

Образы установочных дисков можно взять на официальном сайте дистрибутива. Я использовал стабильный релиз Debian Lenny для архитектуры amd64, но на момент написания этой статьи уже существует стабильная версия Debian Squeeze.

Вцелом, установка интуитивно понятна и не должна вызывать никаких затруднений, однако, стоит сказать пару слов о создании разделов файловой системы. В простейшем случае Вы можете выбрать автоматическое разбиение диска, в результате чего будет создан один раздел журналируемой файловой системы ext3 и раздел подкачки swap. Данный вариант является приемлемым, если пользователей у кластера будет мало, но подобное решение нарушает физическую безопасность кластера. Поэтому, я рекомендую создать отдельные разделы ext3 для каталогов, в которые обычные пользователи будут имеют возможность записи (/home и /tmp), и каталогов, в которые Вы будете устанавливать стороннее программное обеспечение (/usr/local и /opt).

Конфигурация сетевых интерфейсов

* Стоит сразу оговориться, что если Вы сталкиваетесь с линуксом впервые, то такие действия, как редактирование системных конфигурационных файлов, перезапуск системных служб и т.п., необходимо выполнять пользователем root, либо любым другим с помощью утилиты sudo.

На вычислительном кластере должен быть как минимум один управляющий узел – консоль кластера. В идеале, этот узел должен иметь доступ в интернет. Прочие узлы именуются вычислительными. Консоль может не использоваться в качестве вычислительного узла, обычно это машина на порядок слабее, но это совсем не обязательно.

На консоли должны присутствовать две сетевые карточки, для каждой из которых будут настроены свои сетевые интерфейсы. Через первый будет организован доступ в интернет, а с помощью второго – реализована подсеть кластера, для которой консоль будет шлюзом и, по желанию, dns-сервером.

В Debian конфигурирование сетевых интерфейсов достаточно просто осуществляется по средствам редактирования файла /etc/network/interfaces. Для этого можно использовать любой текстовый редактор. Лично я отдаю предпочтение vim, однако, для новичков могу посоветовать использовать редактор попроще, например nano:

$ nano /etc/network/interfaces

После того, как файл будет должным образом отредактирован, следует перезагрузить соответствующий сервис:

$ /etc/init.d/networking restart

* Если во время установки дистрибутива Вы выбрали пукнт «Окружение рабочего стола» (по умолчанию – Gnome), то в системе будет запущен демон network-manager. Я рекомендую его удалить, поскольку с каждым запуском системы, он будет переконфигурировать сетевые настройки на свой лад:

$ aptitude purge network-manager

В зависимости от того, как консоль получает интернет, возможны 2 варианта конфигурации файла interfaces.

Вариант номер раз – для выхода в интернет используются статические настройки соединения. В этом случае файл interfaces на консоли должен быть примерно таким:

# /etc/network/interfaces
 
# виртуальный сетевой интерфейс
 
auto lo
 
iface lo inet loopback
 
 
# сетевой интерфейс первой сетевой карточки (интернет)
 
auto eth0
iface eth0 inet static
	address 10.18.5.169		# ip консоли
	netmask 255.255.248.0		# маска
	gateway 10.18.1.1		# шлюз
	dns-nameservers 10.100.10.1	# ip сервера днс
 
# сетевой интерфейс второй сетевой карточки (подсеть кластера)
auto eth1
iface eth1 inet static
	address 192.168.1.1		# ip консоли в подсети кластера
	netmask 255.255.255.0
	network 192.168.1.0
	broadcast 192.168.1.255

* При конфигурировании eth0 были выбраны произвольные статические настройки подключения, замените их на Ваши собственные. Настройки eth1 можете оставить как есть.

Вариант номер два – консоль получает настройки динамически (по dhcp). В этом случае файл interfaces на консоли должен быть таким:

# /etc/network/interfaces

# виртуальный сетевой интерфейс
auto lo
iface lo inet loopback
 
# сетевой интерфейс первой сетевой карточки (интернет)
auto eth0
iface eth0 inet dhcp
 
# сетевой интерфейс второй сетевой карточки (подсеть кластера)
auto eth1
iface eth1 inet static
	address 192.168.1.1		# ip консоли в подсети кластера
	netmask 255.255.255.0
	network 192.168.1.0
	broadcast 192.168.1.255

Конфигурация файлов /etc/network/interfaces на вычислительных узлах будет «однородной». Иными словами, отличаться будут только ip самого узла:

# /etc/network/interfaces

auto lo
iface lo inet loopback
 
auto eth0
iface eth0 inet static
	address 192.168.1.i		# ip текущего узла, i ∈ (1; 255)
	netmask 255.255.255.0
	network 192.168.1.0
	broadcast 192.168.2.255
	gateway 192.168.1.1		# в качестве шлюза - ip консоли
	dns-nameservers 192.168.1.1	# в качестве сервера днс - ip консоли

* Последняя строка имеет смысл в том случае, если на консоли установлен и настроен dns-сервер, однако, это совсем не обязательно. Вы можете вписать в строку [11] ip-адрес dns-сервера самой консоли. В случае получения сетевых настроек консолью по dhcp узнать его можно, к примеру, так:

nslookup dagget.org.ua | grep Server
Server: 10.100.10.1
Поскольку в дальнейшем на кластер будут установлены параллельная среда MPI и система локального управления ресурсами Torque, удобнее будет работать с host-именами узлом, нежели с ip-адресами, поэтому редактируем файл /etc/hosts на консоли:

# /etc/hosts

127.0.0.1 		localhost
10.18.5.169		console		# ip консоли кластера
192.168.1.2		node-01		# ip 1-го вычислительного узла
192.168.1.3		node-02
192.168.1.4		node-03
192.168.1.5		node-04

и тот же файл на вычислительных узлах:

# /etc/hosts

127.0.0.1 		localhost
192.168.1.1		console		# ip консоли кластера
192.168.1.2		node-01		# ip 1-го вычислительного узла
192.168.1.3		node-02
192.168.1.4		node-03
192.168.1.5		node-04

* Обратите внимание, что host-имя «console» в первом случае соответствует ip-адресу сетевого интерфейса соединения консоли с интернетом, а в случае вычислительных узлов – ip-адресу консоли в подсети кластера. Эта разница обусловленна требованиями системы локального управления ресурсами Torque.

Настройка получения обновлений для вычислительных узлов

Построение подсети кластера было необходимо прежде всего для обмена сообщениями параллельно выполняющихся подзадач Ваших будущих программ либо моделей. Помимо этого, наличие этой подсети позволит обновлять вычислительные узлы через консоль.

Теперь, необходимо решить – как вычислительные узлы будут получать обновления.

Вариант номер раз – вычислителные узлы будут иметь полный дотуп в интернет. Для этого устанавливаем на консоли dns-сервер, включаем форвардинг ipv4 и вносим изменения в межсетевой экран iptables:

# aptitude install bind9
# sysctl -w net.ipv4.ip_forward=1
# echo "1" > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING --source 192.168.1.0/24 -o eth1 -j MASQUERADE

В результате проделанного на вычислительных узлах появится доступ в интернет.

* Чтобы настройки не сбросились после перезагрузки, последние две команды можно дабавить в файл /etc/rc.local.

Вариант номер два – загрузка пакетов через консоль при помощи кэширующего прокси сервера. В этом случае вычислительным узлам не потрбуется прямой выход в интернет, что в принципе не страшно. Устанавливаем на консоли apt-cacher-ng:

# aptitude install apt-cacher-ng

после чего на вычислительных узлах проделываем следующее:

# echo "Acquire::http { Proxy \"http://192.168.1.1:3142\"; };" > /etc/apt/apt.conf.d/01proxy
# aptitude update

* Здесь 192.168.1.1 – это ip-адрес узла, на котором установлен apt-cacher-ng (в нашем случае консоль кластера).

Установка необходимого программного обеспечения

Закончив настройку сети, установим необходимые пакеты. Добавляем репозитории в /etc/apt/sources.list:

# echo "deb http://ftp.ua.debian.org/debian/ stable main contrib" >> /etc/apt/sources.list # пакеты из стабильной ветки

и обновляем список доступных пакетов:

# aptitude update

* Проделываем то же самое на вычислительных узлах, если не использовали apt-cacher-ng для загрузки пакетов через прокси.

Далее, устанавливаем на все узлы нужные нам пакеты:

# aptitude install make # для сборки исходников
# aptitude install g++-multilib gfortran # компиляторы gnu
# aptitude install fort77 # компилятор Фортрана 77 (если нужен)
# aptitude install openssh-server # ssh-сервер
# aptitude install nfs-kernel-server nfs-common portmap # nfs-сервер
# aptitude install ia32-libs libc6-dev-i386 libstdc++5 sun-java6-bin # пакеты, необходимые для работы компиляторов Intel на 64-х битной архитектуре (если последние будут использоваться)

Синхронизация времени

Забегая вперед, отмечу, что некоторые параллельные модели критичны к идентичности локального времени на вычислительных узлах, а именно – если Вы запустите в дальшейшем команду:

# mpirun -machinefile machinefile date

то увидите, что время на разных узлах отличается (не существенно, но все же). Подобное может сказаться на корректности вывода результатов Ваших моделей. Чтобы этого избежать, устанавливаем на всех узлах пакет ntp:

# aptitude install ntp

и добавляем в файл /etc/ntp.conf на консоли строки:

# /etc/ntp.conf

server ntp.time.in.ua
server ntp2.time.in.ua

* В данном примере ntp.time.in.ua и ntp2.time.in.ua – сервера точного времени в Украине. Вместо них напишите сервера точного времени Вашего региона. Остальные строки, начинающиеся со слова server закомментируйте.

На вычислительных узлах в файле /etc/ntp.conf в качестве сервера точного времени укажите консоль кластера:

# /etc/ntp.conf

server console

После этого на всем кластере, начиная с консоли, перезапустите соответствующий сервис:

# /etc/init.d/ntp restart

Пользователи и группы. Ограничение количества ресурсов

Под root-ом, из соображений безопасности, сидеть не следует. Для mpi-вычислений лучше всего создать отдельную группу и пользователей внутри нее. Если пользователей планируется много, то наличие отдельной группы облегчит администрирование системы:

# groupadd mpiusers
# adduser mpiuser -ingroup mpiusers
# adduser mpiuser2 -ingroup mpiusers

* Это необходимо проделать на каждом узле.

Также, Вы можете наделить своего mpi-пользователя правами администратора системы с помощью утилиты sudo.

Стоит отметить, что, если не ограничивать пользователей по количеству предоставляемых ресурсов, они могут нанести вред кластеру. К примеру, пользователи, не имеющие ограничений по количеству процессов могут «повесить» кластер вот таким нехитрым способом. Защититься от подобного можно при помощи подключаемых модулей аутентификации – PAM. Приведу пример ограничения группы mpiusers по количеству процессов, файлов и максимального количества одновременных подключений к кластеру по средствам редактирования файла /etc/security/limits.conf:

# /etc/security/limits.conf

@mpiusers	soft	nproc		40
@mpiusers	hard	nproc		50
@mpiusers	hard	core		100000
@mpiusers	-	maxlogins	5

Сетевая файловая система

Для того, чтобы параллельная программа запускалась на кластере, ее копия должна находится на каждом его узле (путь к ней, естественно, так же должен совпадать). Этого можно добиться двумя способами. Первый – «тупое» копирование программы на каждый узел, что достаточно неудобно. Второй – использование сетевой файловой системы NFS.

Суть состоит в том, что на консоли кластера создается и экспортируется отдельный каталог (например, /mpi), после чего он монтируется на вычислительных узлах. После этого права на него передаются mpi-пользователю и, в конечном итоге, параллельный запуск программ, находящихся в /mpi, не будет требовать копирование их на каждый узел отдельно.

Итак, на консоли кластера выполняем:

# mkdir /mpi
# chown mpiuser:mpiusers /mpi
# echo "/mpi 192.168.1.1/24(rw,async,no_subtree_check,no_root_squash)" >> /etc/exports
# /etc/init.d/nfs-kernel-server restart # перезапускаем nfs сервер
# showmount -e # проверяем экспортированные каталога

Далее, на вычислительных узлах монтируем /mpi:

# mkdir /mpi
# chown mpiuser:mpiusers /mpi
# echo "192.168.1.1:/mpi/ /mpi nfs rw 0 0" >> /etc/fstab
# mount -a

* Если планируется, что на кластере кроме Вас будут работать другие пользователи, можно экспортировать с консоли на вычислительные узлы каталог /home. В этом случае /mpi не понадобится, однако, стоит помнить, что при монтировании каталога /home, uid пользователей на каждом вычислительном узле кластера, должны совпадать с uid пользователей на консоли, иначе возникнут проблемы с правами доступа. Проверить идентичность uid можно сравнив файлы /etc/passwd (1-й параметр в строке – имя пользователя, 3-й параметр – его uid).

Беспарольный доступ по SSH

Для того, чтобы программа по средствам MPI смогла запуститься на вычислительных узлах, к ним с консоли должен быть организован беспарольных доступ. Для этого логинимся c консоли на саму себя (вводим пароль пользователя mpiuser):

$ ssh -o 'StrictHostKeyChecking no' mpiuser@console

генерируем ключи (можно ничего не заполнять, достаточно нажать ввод 3 раза):

$ ssh-keygen -t rsa

копируем открытый ключ:

$ cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys2

Файл authorized_keys2 копируем на вычислительные узлы:

$ for i in node-01 node-02 node-03 node-04 ; do scp -o 'StrictHostKeyChecking no' ~/.ssh/authorized_keys2 mpiuser@${i}:~/.ssh/ ; done

Теперь, если все сделано правильно, при заходе на console, node-01, ... , node-04, вводить пароль не потребуется.

Помните, что проделанное обеспечивает беспарольный доступ только пользователя mpiuser и только с консоли на остальные узлы.

* Если Вы решили экспортировать каталог /home на вычислительные узлы, то копировать authorized_keys2 на них нет необходимости, достаточно по разу залогиниться на каждый узел.

Также, в случае, если у консоли «белый» ip, из соображений безопасности я рекомендую поменять ее ssh-порт. Для этого необходимо изменить значение в строке «Port 22» файла /etc/ssh/sshd_config на любое другое (например, 4021) и перезапустить ssh-сервер:

/etc/init.d/ssh restart
Проверим, что порт действительно сменился:

# ssh localhost
ssh: connect to host localhost port 22: Connection refused

Теперь, чтобы попасть на кластер с автономного ПК, необходимо в явном виде указывать порт:

$ ssh -p 4021 mpiuser@console

* Это распространяется на все ssh-клиенты (putty, WinSCP и т.д.).

Важно!!! О смене порта консоли необходимо будет сообщить установленной в далльнейшем системе локального управления ресурсами Torque. Для этого в файлы /etc/ssh/ssh_config вычислительных узлов и самой консоли нужно добавить:

# /etc/ssh/ssh_config

Host 192.168.1.1 console
Hostname 192.168.1.1
Port 4021

* Смена ssh-порта не защитит кластер от перебора паролей в полной мере, однако снизит количество попыток подобных атак.

Часть 2. Параллельная среда MPI
Пара слов о MPI

Существует огромное количество всевозможной литературы о Message Passing Interface, поэтому я не буду заниматься «копипастом», скажу лишь, что суть заключается в предоставлении возможности обмена сообщениями между процессами.

Дистрибутивов MPI, в том числе бесплатных, достаточно много. К общедоступным относятся: Mpich, Mpich2, LamMPI, OpenMPI (не путать с OpenMP) и некоммерческий Intel MPI.

Помимо всего прочего, дистрибутивы отличаются подходом к инициализации параллельной среды, а именно – необходимостью использования программ-мониторов – mpd. Использование mpd подразумевает создание файла со списком узлов кластера – mpd.hosts и запуска команды, инициализирующей среду MPI – mpdboot. К таким дистрибутивам относятся Intel MPI и версии Mpich2 ≤ 1.2.

К дистрибутивам, не требующим запуска программ-мониторов, относятся OpenMPI и новые версии Mpich2 ≥ 1.3 . В этом случае, команде запуска Вашей параллельной программы – mpirun(mpiexec) нужно будет передать файл со списком узлов кластера через ключ «-machinefile».

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

Стоит отметить, что желательно не использовать готовые пакеты MPI, имеющиеся в репозиториях Debian, поскольку настраивать их сложнее, а качество сборки останется неизвестным.

Использование компиляторов Intel

Обычно, MPI собирается и отлично работает с GNU компиляторами (gcc, g++, gfortran), обеспечивающими достаточную точность вещественных типов данных. Однако, может получится так, что Вашей параллельной модели либо программе этой точности будет недостаточно. На этот случай существуют компиляторы корпорации Intel, обеспечивающие повышенную точность вещественных типов данных.

Скачать компиляторы можно с официального сайта в разделе «Compilers and Libraries», указав адрес Вашей электронной почты и запомнив выданный 12-ти символьный код. Последний понадобится при установке.

На момент написания статьи доступна версия 12.0.

Установка начинается запуском скрипта install.sh с правами root-а. Для того, чтобы она прошла успешно на 64-х битной архитектуре, должны быть установлены следующие пакеты:

# aptitude install ia32-libs libc6-dev-i386 libstdc++5 sun-java6-bin

Если при установке Вы не меняли пути, то извлеченные файлы можно найти в /opt/intel/. В /opt/intel/bin/ находится файл с переменными окружения – compilervars.sh. Его необходимо добавить в файл ~/.bashrc mpi-пользователей.

# echo "/opt/intel/bin/compilervars.sh intel64" >> ~/.bashrc

* У меня скрипт выдал пару ошибок, исправлять которые ни желания ни времени не было, поэтому альтернативой является «тупое» добавление путей в /etc/profile или в ~/.profile mpi-пользователей:

# /etc/profile

INTEL="/opt/intel/bin"
export PATH=$PATH:$INTEL
INTEL_LIB="/opt/intel/lib/intel64"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$INTEL_LIB

Чтобы пути обновились, необходимо перелогиниться, после чего будут доступны команды ifort, icc, icpc:

$ ifort -V

Собирать компиляторы на каждом узле не обязательно, достаточно экспортировать с консоли папку /opt на вычислительные узлы по средствам сетевой файловой системы NFS и править профайлы каждого узла как показано выше.

Установка и инициализания среды OpenMPI

OpenMPI достаточно приятный дистрибутив в плане простоты использования. На момент написания статьи существует стабильная версия 1.4.3.

Скачиваем с официального сайта проекта архив, распаковываем, переходим в установочную директорию:

$ wget http://www.open-mpi.org/software/ompi/v1.4/downloads/openmpi-1.4.3.tar.gz
$ tar -xvf openmpi-1.4.3.tar.gz
# cd openmpi-1.4.3/

Далее конфигурируем сборку с необходимыми параметрами. Если Вы не используете компиляторы Intel, то:

$ ./configure --prefix=/usr/local/openmpi CC=gcc CXX=g++ F77=fort77 FC=gfortran

иначе:

$ ./configure --prefix=/usr/local/openmpi CC=icc CXX=icpc F77=ifort FC=ifort

Используемые значения ключей: «--prefix» – каталог, в который будет установлен дистрибутив, «CC», «CXX», «F77» и «FC» – какие компиляторы языков Си, Си++ и фортранов будут использованы, соответственно. Если сконфигурировалось без ошибок, то переходим к сборке:

# make && make install

Далее, добавляем пути в /etc/profile:

# /etc/profile

MPI="/usr/local/openmpi/bin"
export PATH=$PATH:$MPI
MPI_LIB="/usr/local/openmpi/lib/"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MPI_LIB

* Если в качестве аргумента «--prefix» использовать /usr, то править /etc/profile необходимости нет, однако в этом случае, если Вы захотите поменять OpenMPI на другой дистрибутив, то по-человечески удалить его можно будет только из установочной директории:

# make uninstall

Что касается инициализации среды OpenMPI, то тут все предельно просто. Все что нужно сделать – создать файл со списком узлов кластера – machinefile:

# /opt/machinefile

node-01
node-02 slots=4
node-03 slots=2
node-04

В данном примере slots указывает, что количество ядер на узле node-02 равно 4, а на node-03 – 2.Также, вместо локальных имен можно использовать ip-адреса и доменные имена узлов:

# ~/machinefile

node-01
node-02.cluster-domain.org slots=4
192.168.1.3 slots=2
node-04.cluster-domain.org

Проверим работоспособность среды. В качестве запускаемой программы для наглядности возьмем hostname, выводящую имя узла, на котором запущена. Для описанного выше machinefile вывод будет следующий:

$ mpirun -machinefile machinefile hostname
node-01
node-02
node-02
node-02
node-02
node-03
node-03
node-04

Также, можно запускать программы на определенном узле или узлах через ключ «-H»:

$ mpirun -H node-01 -H node-02 hostname

Установка и инициализания среды Mpich2

В Mpich2, как и в его предшественнике Mpich1, обмен сообщениями происходит через некое абстрактное устройство device. В Mpich1 при сборке было необходимо явно указывать, какое устройство будет использованно (в большинстве случаев это было ch_p4, позволяющее обмениваться сообщениями по протоколу TCP/IP). В Mpich2 же этого делать не нужно, поскольку в нем по умолчанию используется устройство с3, аналогичное ch_p4. Еще одним отличием Mpich2 от своего предшественника является необходимость явно включать поддержку компиляторов Си++ и фортранов ключами: «--enable-cxx», «--enable-f77» и «--enable-fc», соответственно.

На момент написания статьи существует стабильная версия 1.3.2p1.

Скачиваем с официального сайта проекта архив, распаковываем, переходим в установочную директорию:

Конфигурируем сборку. Если Вы не используете компиляторы Intel, то:

$ ./configure --prefix=/usr/local/mpich2 CC=gcc CXX=g++ FC=gfortran --enable-cxx --enable-fc

иначе:

$ ./configure --prefix=/usrlocal/mpich2 CC=icc CXX=icpc FC=ifort --enable-cxx --enable-fc

Если сконфигурировалось без ошибок – собираем:

# make && make install

и добавляем пути в /etc/profile:

# /etc/profile

MPI="/usr/local/mpich2/bin"
export PATH=$PATH:$MPI
MPI_LIB="/usr/local/mpich2/lib/"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MPI_LIB

Что касается инициализации среды Mpich2, то, если Вы используете версии дистрибутива ≥ 1.3 – конфигурация будет аналогична OpenMPI. Отличие в том, что в machinefile многопроцессорность узла отмечается иначе, а именно, если в OpenMPI:

# ~/machinefile

node-01 slots=n # n – количество ядер узла node-01

то в Mpich2:

# /opt/machinefile

node-01:n # n – количество ядер узла node-01

Если же Вы, по какой-то причине, используете старые версии Mpich2, то для начала необходимо создать файл с ограниченными правами .mpd.conf в каталоге mpi-пользователя и записать в него строку secretword=pass, где pass – некий пароль (это не пароль mpi-пользователя в системе):

$ echo "secretword=qwerty" > ~/.mpd.conf
$ chmod 600 .mpd.conf

Там же создаем файл mpd.hosts со списком узлов (заполняется аналогично machinefile) и запускаем программу-монитор находясь в директории с mpd.hosts:

# mpdboot -n $NP

где $NP – количество узлов.

Посмотреть узлы, находящиеся в кольце, можно командой mpdtrace.

В случае старых версий Mpich2, запуск пользовательских программ осуществляется без ключа -machinefile:

# mpiexec -np $NP hostname

Запускать программы на определенных узлах можно через ключ «-host»:

# mpiexec -host 192.168.1.3 -host node-05 -np 2 hostname

Установка и инициализания среды Intel MPI

Установка Intel MPI на Debian не так тривиальна, как установка тех же Intel компиляторов.

На момент написания статьи я не нашел на официальном сайте новой некоммерческой версии Intel MPI, но у меня завалялась старая 4.0.0.025. Извлекаем файлы, переходим в директорию rpm и смотрим содержимое:

# tar -xvf l_mpi-rt_p_4.0.0.025.tgz
# cd l_mpi-rt_p_4.0.0.025/rpm
# ls -a
.
..
intel-mpi-rt-em64t-4.0.0p-025.x86_64.rpm
intel-mpi-rt-ia32-4.0.0p-025.i486.rpm

Необходимо rpm-пакеты сконвертировать в deb-пакеты, для чего устанавливаем alien:

aptitude install alien
alien intel-mpi-rt-em64t-4.0.0p-025.x86_64.rpm
В результате получаем deb-пакет, который и устанавливаем в систему:

dpkg -i intel-mpi-rt-em64t_4.0.0p-26_amd64.deb
В конечном итоге будет создана папка /opt/intel/impi/4.0.0.025. Добавляем пути в /etc/profile:

# /etc/profile

INTELMPI="/opt/intel/impi/4.0.0.025/bin64"
export PATH=$PATH:$INTELMPI
INTELMPI_LIB="/opt/intel/impi/4.0.0.025/lib64"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$INTELMPI_LIB

Основой Intel MPI является Mpich2, поэтому инициализация практически такая же как у версий Mpich2 ≤ 1.2: тот же файл ~/.mpd.conf с секретным словом и ограниченными правами доступа, тот же файл со списком узлов – ~/mpd.hosts.

Однако, есть небольшие отличия: перед запуском программы-монитора рекомендуется выполнить mpdallexit, чтобы «убить» существующие mpi-кольца. Далее, Intel MPI по умолчанию использует rsh, поэтому mpdboot будет нужно запускать с ключем «-r»:

# mpdboot -n $NP -r ssh # $NP – количество узлов

Запуск пользовательских программ – аналогично Mpich2.

Чтобы удалить Intel MPI из системы, ищем его в установленных пакетах:

# dpkg -l | grep intel-mpi
ii	intel-mpi-rt-em64t	4.0.0p-26	Intel(R) MPI Library, Runtime Environment for Linux* OS

Собственно, 2-й параметр – имя пакета, его и удаляем:

# dpkg -r intel-mpi-rt-em64t

Часть 3. Система локального управления ресурсами Torque
Пара слов о системах локального управления ресурсами

Torque – это менеджер ресурсов семейства PBS, предоставляющий обширный фукционал, включающий управление запуском программ, временем их выполения, постановку задач в очередь и многое другое.

Если Вы единственный пользователь Вашего вычислительного кластера, то подобным менеджером ресурсов можно обойтись, составляя очереди для счета mpi-программ с помощью планировщика cron или системы управления заданиями jobs, предоставляющейся командным интерпретатором bash.

А вот если пользователей хватает, то представьте, что произойдет, если пара-тройка из них поставит в одно и тоже время считаться на кластере каждый свою mpi-модель на продолжительное время. Кластер попросту начнет «лагать» и ни о каком быстродействии не может идти речи. От таких ситуаций спасет либо жесткое квотирование, либо менеджер ресурсов, который поместит задачи в очередь и будет запускать их по мере освобождения ресурсов.

Аналогичная ситуация может произойти, если группе пользователей нужны только несколько узлов кластера. Обычно пользователи попросту идут по machinefile, используя первые узлы. Если в подобной ситуации использовать менеджер ресурсов, то он будет предоставлять каждому следующему пользователю свободные вычислительные узлы.

Установка PBS-клиентов на вычислительные узлы

Собственно, оригинал документации по установке можно почитать на официальном сайте проекта и там же скачать установочные файлы. На момент написания статьи существует стабильная версия 3.0.0. Скачиваем на консоль кластера:

$ wget http://www.clusterresources.com/downloads/torque/torque-3.0.0.tar.gz
$ tar -xvf torque-3.0.0.tar.gz
$ cd torque-3.0.0/

Конфигурируем и собираем:

$ ./configure --prefix=/usr
# make && make install
# make packages

В результате проделанного, получаем скрипты, из которых нас будут интересовать torque-package-mom-linux-x86_64.sh и torque-package-clients-linux-x86_64.sh. Оба этих скрипта необходимо запустить на каждом вычислительном узле кластера:

# ./torque-package-mom-linux-x86_64.sh --install
# ./torque-package-clients-linux-x86_64.sh --install

Помимо этого, нужно добавить pbs_mom в автозагрузку также на каждом узле. Для этого в установочной директории находим файл contrib/init.d/debian.pbs_mom (проверьте, чтобы путь, указанный в строке DAEMON этого файла, совпадал с реальным расположением pbs_mom – в приведенном примере это /usr/bin) и копируем его в /etc/init.d/:

# cp contrib/init.d/debian.pbs_mom /etc/init.d/pbs_mom

после чего:

# update-rc.d pbs_mom defaults

Проверяем чтобы в /var/spool/torque/server_name каждого вычислительно узла было host-имя консоли, после чего запускаем на них PBS-клиент:

# pbs_mom

Настройка PBS-сервера на консоли кластера

В установочной директории инициализируем файлы серверной базы данных:

# ./torque.setup root

В файл /var/spool/torque/server_priv/nodes записываем построчно вычислительные узлы кластера в формате:

# /var/spool/torque/server_priv/nodes

node-01 np=N

где N – количество ядер на узле node-01.

Перез запуском PBS-сервера рекомендуют сделать:

qterm -t quick
Запускаем сам сервер и планировщик заданий на консоли кластера:

pbs_server
pbs_sched
Если сразу посмотреть на состояние узлов командой pbsnodes, то их статус будет – «down». Через несколько секунд он сменится на «free» и узлы можно будет использовать.

Сам сервер pbs_server и планировщик pbs_sched также можно добавить в автозагрузку на консоли кластера, аналогично pbs_mom (проверьте, чтобы путь, указанный в строках DAEMON этих файлов, совпадал с реальным расположением pbs_server и pbs_sched – в приведенном примере это /usr/bin). Для этого из установочной директории:

cp contrib/init.d/debian.pbs_server /etc/init.d/pbs_server
update-rc.d pbs_server defaults
cp contrib/init.d/debian.pbs_sched /etc/init.d/pbs_sched
update-rc.d pbs_sched defaults
Посмотреть информацию о PBS-сервере можно следующим образом:

# qmgr -c 'p s'

* По умолчанию, клиентские команды (qsub, qdel и т.п.) можно использовать только на том узле, где установлен PBS-сервер (в нашем случае – это консоль кластера). Если возникнет необходимость использовать эти команды на определенных вычислительных узлах, добавьте последние в файл /etc/hosts.equiv на консоли.

Проверка работоспособности среды

Посмотреть текущее состояние очередей можно командой qstat:

# qstat

В выводе пусто, поскольку в очередь еще ничего не ставили. Пока мы не умеем писать PBS-скрипты, проверяем работоспособность Torque следующим образом:

# echo "sleep 30" | qsub

после чего в выводе qstat видим:

# qstat
Job id                    Name             User            Time Use S Queue
------------------------- ---------------- --------------- -------- - -----
0.node-01                 STDIN            mpiuser                0 R batch

где аргументы, соответственно: номер задания, его имя, запустивший задание пользователь, время выполнения, статус и название очереди. Собственно статус «R» означает, что задание выполняется, «Q» – стоит в очереди, «C» – выполнено. Если через какое-то время вновь запустим qstat, то увидим, что статус задания поменялся на «C».

Основы написания PBS-скриптов

Чтобы поставить Вашу параллельную модель считаться в очередь Torque, должно быть сформировано соответствующее задание. Задание формируется в виде скрипта, пример которого приведен ниже:

# ~/host_test.pbs

#!/bin/sh
#PBS -N host_test		# имя задания в очереди
#PBS -l nodes=3:ppn=4		# запрашиваемые узлы
#PBS -l mem=100mb		# запрашиваемое количество оперативной памяти
#PBS -l walltime=00:05:00	# запрашиваемое время на выполнения задачи
mpiexec hostname		# программа, которая будет выполняться

Стоит уделить внимание строке «#PBS -l nodes». В данном примере мы запрашиваем 3 4-хпроцессорных узла. Эквивалентов у этой записи много, например:

# ~/host_test.pbs

#PBS -l nodes=3:ppn=4

# ~/host_test.pbs

#PBS -l nodes=node-01:ppn=4+2:ppn=4

# ~/host_test.pbs

#PBS -l nodes=node-01:ppn=4+node-02:ppn=4+node-03:ppn=4

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

Задание, описанное в скрипте host_test.pbs, ставим в очередь следующим образом:

# qsub host_test.pbs

Вывод получим в файле host_test.oN, а ошибки – в host_test.eN, где N – номер задания в очереди. Если в скрипте задать парамерт:

# ~/host_test.pbs

#PBS -j oe

то вывод ошибок будет перенаправлен в host_test.oN. При необходимости, через параметры «-o» и «-e» можно, соответственно, задать имена файлам вывода и вывода ошибок.

Часть 4. Системный монитор Ganglia
После того, как Вы настроили параллельную среду и систему локального управления ресурсами, фактически, кластер готов к эксплуатации. Самый простой способ узнать, что с ним происходить – заходить на узлы и проверять текущее ресурсопотребление командами top, uptime, df и т.п., что при большом количестве узлов достаточно неудобно. Было бы неплохо иметь утилиты, оперативно предоставляющие необходимую информацию. Одной из таких утилит является Ganglia.

Установка gmetad на консоль кластера

Основано на данной статье.

Помимо всего прочего, на консоли должен быть установлен веб-сервер:

# aptitude install apache2 # собственно, сам сервер
# aptitude install libapache2-mod-php5 # PHP
# aptitude install mysql-server-5.0 php5-mysql # база данных MySQL

и разрешено внешнее изменение php-переменных. Для этого в файле /etc/php5/apache2/php.ini должна быть разкомментированна строка:

# /etc/php5/apache2/php.ini

register_globals = On

После редактирования php.ini перезапустите веб-сервер:

# /etc/init.d/apache2 restart

Теперь установим пакеты, без которых не сможем собрать gangliа из исходников:

# aptitude install libapr1-dev libconfuse-dev libpcre3-dev

далее – пакеты, без которых сервисы ganglia не будут работать:

# aptitude install rrdtool librrds-perl librrd2-dev php5-gd

и, наконец, – ganglia-monitor, предоставляющий данные, и gmetad, собирающий их:

# aptitude install ganglia-monitor gmetad

Далее, скачиваем с sourceforge.net исходники gangliа. На момент написания статьи существует стабильная версия 3.1.7. Скачиваем, распаковываем, переходим в установочную директорию:

# wget http://downloads.sourceforge.net/ganglia/ganglia-3.1.7.tar.gz?modtime=1204128965&big_mirror=0
# tar -xvzf ganglia-3.1.7.tar.gz*
# cd ganglia-3.1.7/

Конфигурируем и собираем:

# ./configure --prefix=/opt/ganglia --enable-gexec --with-gmetad --sysconfdir=/etc/ganglia
# make && make install

Теперь в папке web текущего каталога находятся веб-файлы системного монитора. Копируем их в каталог веб-сервера:

# cp -a web/ /var/www/ganglia

Пройдя по адресу http://localhost/ganglia/, попадаем на страницу нашего системного монитора.

В файле /etc/ganglia/gmetad.conf находятся настройки соответствующего сервиса. Можете в них ничего не менять, однако, если поменяли – перезапустите gmetad:

# /etc/init.d/gmetad restart

Установка ganglia-monitor на вычислительные узлы

Собственно, ставим:

# aptitude install ganglia-monitor

Далее редактируем конфигурационный файл /etc/ganglia/gmond.conf (для всех узлов он будет идентичным). Приводим строки udp_send_channel и udp_recv_channel к виду:

# /etc/ganglia/gmond.conf

udp_send_channel {
	mcast_join = 192.168.1.1
	port = 8649
	ttl = 1
}
 
udp_recv_channel {
	port = 8649
}

где 192.168.1.1 – ip консоли в подсети кластера (либо того узла, на котором установлен gmetad). После изменений файла gmond.conf перезапускаем сервис ganglia-monitor на вычислительных узлах:

# /etc/init.d/ganglia-monitor restart

в следствие чего, они начнут появляться на http://localhost/ganglia/.

От автора
В данной статье не были затронуты вопросы о конфигурации оборудования и обеспечении достататочной физической и сетевой безопасности кластера. Возможно, в дальнейшем я об этом напишу. Однако, описанное выше является фундаментом создания вычислительных кластеров – тем минимумом, который необходим для нормального счета распараллеленных программ и моделей и получения роста производительности вычислений. Успехов всяческих тем, кто прочел эту статью, и кому прочитанное оказалось полезным.

Приложение A. Ссылки на программное обеспечение

http://loveawake.ru - Вход на сайт - Знакомства на Loveawake.Ru

Уже не в первый раз сталкиваюсь с проблемой при настройке.
Почему-то bash на debian говорит на команду: mpirun -machinefile mpi.hosts -np 4 hostname
bash: orted: команда не найдена
bash: orted: команда не найдена
и т.д.

При этом если написать просто orted, то всё будет найдено.

Если попробовать указать влоб ноды, то вот так отвечает

mpirun -H claster-m claster-1 hostname
--------------------------------------------------------------------------
mpirun was unable to find the specified executable file, and therefore
did not launch the job. This error was first reported for process
rank 0; it may have occurred for other processes as well.

NOTE: A common cause for this error is misspelling a mpirun command
line parameter option (remember that mpirun interprets the first
unrecognized command line token as the executable).

Node: claster-main
Executable: claster-1

Что делать ума не приложу. Может кто подсказать?

значит всем всё ясно или никто ничего не понял.. ;)

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

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.