Высокопроизводительные вычисления (HPC) на прерываемых виртуальных машинах
HPC-кластеры используются в вычислительных целях, в частности в научных исследованиях и расчетных задачах. Вычислительный кластер представляет собой массив серверов (вычислительных узлов), объединенных сетью. Каждый вычислительный узел имеет несколько многоядерных процессоров, свою оперативную память и работает под управлением независимой операционной системы. Наиболее распространено использование однородных кластеров, где все узлы одинаковы по своей архитектуре и производительности.
По этой инструкции вы создадите кластер прерываемых виртуальных машин, которые будут решать общую вычислительную задачу. Примером вычислительной задачи будет решение системы линейных алгебраических уравнений с помощью метода Якоби.
Для создания кластера и запуска вычислительной задачи:
- Подготовьте облако к работе.
- Подготовьте основную виртуальную машину в облаке.
- Подготовьте кластер виртуальных машин.
- Создайте кластер.
- Подготовьте задачу для вычислений в кластере.
- Запустите и проанализируйте вычисления.
- Как удалить созданные ресурсы.
Подготовьте облако к работе
Перед работой нужно зарегистрироваться в Yandex.Cloud и создать платежный аккаунт:
- Перейдите в консоль управления, затем войдите в Yandex.Cloud или зарегистрируйтесь, если вы еще не зарегистрированы.
- На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша виртуальная машина, на странице облака.
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки серверов входит:
- плата за несколько запущенных виртуальных машин (см. тарифы Yandex Compute Cloud);
- плата за использование динамического или статического внешнего IP-адреса (см. тарифы Yandex Virtual Private Cloud);
Подготовьте основную виртуальную машину в облаке
Создайте виртуальную машину
Для того, чтобы создать виртуальную машину:
-
На странице каталога в консоли управления нажмите кнопку Создать ресурс и выберите пункт Виртуальная машина.
-
В поле Имя введите имя виртуальной машины. Для наглядности примера укажите
master-node
. -
Выберите зону доступности, в которой должна находиться виртуальная машина.
-
В блоке Образы из Cloud Marketplace выберите образ Ubuntu.
-
В блоке Диски выберите жесткий диск размером 13 ГБ. Тип диска выберите SSD, поскольку он будет использоваться для сетевого доступа другими виртуальными машинами.
-
В блоке Вычислительные ресурсы:
- Выберите платформу виртуальной машины.
- Для решения текущих вычислительных задач укажите конфигурацию:
- Платформа — Intel Cascade Lake.
- Гарантированная доля vCPU — 100%.
- vCPU — 4.
- RAM — 4 ГБ.
- Дополнительно — «Прерываемая».
-
В блоке Сетевые настройки:
- Выберите Сеть и Подсеть, к которым нужно подключить виртуальную машину. Если нужной сети или подсети еще нет, вы можете создать их прямо на странице создания ВМ.
- В поле Публичный адрес оставьте значение Автоматически, чтобы назначить виртуальной машине случайный внешний IP-адрес из пула Yandex.Cloud, или выберите статический адрес из списка, если вы зарезервировали его заранее.
-
В блоке Доступ укажите данные для доступа к виртуальной машине:
- В поле Логин введите предпочтительное имя пользователя, который будет создан на виртуальной машине.
- В поле SSH-ключ скопируйте ваш открытый SSH-ключ. Пару ключей для подключения по SSH необходимо создать самостоятельно, см. раздел о подключении к виртуальным машинам по SSH.
-
Нажмите кнопку Создать ВМ.
Настройте виртуальную машину
-
Зайдите по SSH на виртуальную машину и перейдите в режим администратора в консоли:
$ sudo -i
-
Выполните обновление репозитория и поставьте требуемые утилиты:
$ apt update $ apt install -y net-tools htop libopenmpi-dev nfs-common
-
Выйдите из режима администратора и сгенерируйте RSA-ключи для доступа между виртуальными машинами:
$ exit $ ssh-keygen
-
Добавьте сгенерированный ключ в список разрешенных:
$ cd ~/.ssh $ cat id_rsa.pub >> authorized_keys
Подготовьте кластер виртуальных машин
Создайте кластер
- В консоли управления перейдите в раздел Диски и нажмите Создать снимок у диска ВМ
master-node
. Задайте имяmaster-node-snapshot
. После того, как снимок будет создан, он появится в разделе Снимки дисков. - Перейдите в раздел Группы виртуальных машин и нажмите Создать группу.
- Создайте группу виртуальных машин:
- В поле Имя укажите имя будущей группы, например
compute-group
. - В поле Сервисный аккаунт добавьте сервисный аккаунт к данной группе. Если у вас нет сервисного аккаунта, нажмите Создать новый, укажите его имя и нажмите на кнопку Создать.
- Выберите ту же Зону доступности в которой находится ВМ
master-node
. Зона должна совпадать у виртуальных машин, чтобы минимизировать задержки при их взаимодействии. - В блоке Шаблон виртуальной машины нажмите кнопку Задать. Откроется экран создания шаблона.
-
В блоке Диски выберите Добавить диск. В открывшемся окне укажите:
- Назначение диска — загрузочный.
- Тип диска — SSD.
- Наполнение — из созданного снимка
master-node-snapshot
.
-
В блоке Вычислительные ресурсы задайте конфигурацию, аналогичную конфигурации основной виртуальной машины:
- Платформа — Intel Cascade Lake.
- Гарантированная доля vCPU — 100%.
- vCPU — 4.
- RAM — 4 ГБ.
- Дополнительно — «Прерываемая».
-
В блоке Сетевые настройки укажите те же сеть и подсеть, что и у основной машины. Тип адреса оставьте Автоматически.
-
В блоке Доступ укажите данные для доступа к виртуальной машине:
- В поле Логин введите предпочтительное имя пользователя, который будет создан на виртуальной машине.
- В поле SSH-ключ скопируйте ваш открытый SSH-ключ. Пару ключей для подключения по SSH необходимо создать самостоятельно, см. раздел о подключении к виртуальным машинам по SSH.
-
Нажмите кнопку Добавить. Вы вернетесь на экран создания группы ВМ.
-
- В поле Имя укажите имя будущей группы, например
- В блоке Масштабирование выберите количество создаваемых виртуальным машин. Укажите 3 виртуальные машины.
- Нажмите кнопку Создать.
Проверьте работу кластера
Зайдите по SSH на каждую из виртуальных машин в группе compute-group
и убедитесь, что с них есть доступ к ВМ master-node
по SSH.
$ ping master-node
$ ssh master-node
Настройте NFS
Чтобы виртуальные машины могли использовать одни и те же исходные файлы, создайте общую сетевую директорию с помощью протокола сетевого доступа NFS:
-
Зайдите на ВМ
master-node
по SSH и установите NFS-сервер:$ ssh <Публичный IP-адрес ВМ master-node> $ sudo apt install nfs-kernel-server
-
Создайте директорию
shared
, которая будет общей для всех виртуальных машин:$ mkdir ~/shared
-
Откройте файл
/etc/exports
любым текстовым редактором, например,nano
:$ sudo nano /etc/exports
-
Добавьте запись для доступа к директории
shared
в файл:/home/<имя пользователя>/shared *(rw,sync,no_root_squash,no_subtree_check)
Сохраните файл.
-
Примените настройки и перезагрузите сервис:
$ sudo exportfs -a $ sudo service nfs-kernel-server restart
Смонтируйте директории на ВМ из группы
На каждой ВМ из группы compute-group
смонтируйте созданную директорию:
-
Создайте директорию
shared
и смонтируйте туда директорию с ВМmaster-node
:$ mkdir ~/shared $ sudo mount -t nfs master-node:/home/<имя пользователя>/shared ~/shared
-
Убедитесь, что директория была успешно смонтирована:
$ df -h Filesystem Size Used Avail Use% Mounted on ... master-node:/home/<имя пользователя>/shared 13G 1.8G 11G 15% /home/<имя пользователя>/shared
Подготовьте задачу для вычислений в кластере
-
Зайдите по SSH на ВМ
master-node
, перейдите в директориюshared
и скачайте исходный файлtask.c
с вычислительной задачей:$ cd ~/shared $ wget https://raw.githubusercontent.com/cloud-docs-writer/examples/master/hpc-on-preemptible/task.c
Этот код решает систему линейных алгебраических уравнений с помощью метода Якоби. Задача имеет одну из распределенных реализаций с помощью MPI.
-
Скомпилируйте исходный файл в исполняемый:
$ mpicc task.c -o task
В директории
shared
должен был появиться исполняемый файлtask
.
Запустите и проанализируйте вычисления
Совет
Для проверки загрузки ядер виртуальных машин можно выполнять команду htop
в отдельной SSH-сессии на каждой виртуальной машине.
-
Запустите выполнение задачи на 2 ядрах, используя ресурсы только ВМ
master-node
:$ mpirun -np 2 task
После выполнения задачи программа выведет затраченное на решение время:
JAC1 STARTED 1: Time of task=45.104153 0: Time of task=45.103931
-
Запустите выполнение задачи на 4 ядрах, используя ресурсы только ВМ
master-node
и получите соответствующие результаты:$ mpirun -np 4 task JAC1 STARTED 1: Time of task=36.562328 2: Time of task=36.562291 3: Time of task=36.561989 0: Time of task=36.561695
-
Запустите выполнение задачи на 4 ядрах, используя ресурсы двух виртуальных машин, по 2 ядра на каждой машине. Для этого запустите выполнение задачи с ключом
-host
, который принимает параметры вида<IP-адрес ВМ>:<количество ядер>[,<ip>:<cores>[,...]]
. После вычисления задачи программа выведет результат:$ mpirun -np 4 -host localhost:2,<IP-адрес ВМ>:2 task JAC1 STARTED 0: Time of task=24.539981 1: Time of task=24.540288 3: Time of task=24.540619 2: Time of task=24.540781
-
По аналогии можно продолжать увеличивать число используемых виртуальных машин и ядер и убедиться, что распределенные вычисления позволяют значительно увеличивать скорость выполнения задачи.
Как удалить созданные ресурсы
Чтобы перестать платить за развернутый сервер и группу виртуальных машин, достаточно удалить ВМ master-node
и группу compute-group
.
Если вы зарезервировали статический публичный IP-адрес специально для этой ВМ:
- Откройте сервис Virtual Private Cloud в вашем каталоге.
- Перейдите на вкладку IP-адреса.
- Найдите нужный адрес, нажмите значок и выберите пункт Удалить.