Высокопроизводительные вычисления (HPC) на прерываемых виртуальных машинах
HPC-кластеры
По этой инструкции вы создадите кластер прерываемых ВМ, которые будут решать общую вычислительную задачу. Примером вычислительной задачи будет решение системы линейных алгебраических уравнений с помощью метода Якоби
Для создания кластера и запуска вычислительной задачи:
- Подготовьте облако к работе.
- Подготовьте основную ВМ в облаке.
- Подготовьте кластер ВМ.
- Создайте кластер.
- Подготовьте задачу для вычислений в кластере.
- Запустите и проанализируйте вычисления.
- Удалите созданные ресурсы.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки серверов входит:
- Плата за несколько запущенных ВМ (см. тарифы Yandex Compute Cloud).
- Плата за использование динамического или статического публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud).
Подготовьте основную ВМ в облаке
Создайте ВМ
Чтобы создать ВМ:
-
В консоли управления
выберите каталог, в котором будет создана ВМ. -
В списке сервисов выберите Compute Cloud.
-
На панели слева выберите
Виртуальные машины. -
Нажмите кнопку Создать виртуальную машину.
-
В блоке Образ загрузочного диска выберите образ Ubuntu.
-
В блоке Расположение выберите зону доступности, в которой будет находиться ВМ.
-
В блоке Диски и файловые хранилища выберите тип загрузочного диска
SSD
. -
В блоке Вычислительные ресурсы перейдите на вкладку Своя конфигурация и укажите параметры для решения текущих вычислительных задач:
- Платформа —
Intel Ice Lake
. - vCPU —
4
. - Гарантированная доля vCPU —
100%
. - RAM —
4 ГБ
. - Дополнительно —
Прерываемая
.
- Платформа —
-
В блоке Сетевые настройки:
-
В поле Подсеть укажите идентификатор подсети в зоне доступности создаваемой ВМ или выберите облачную сеть из списка.
-
У каждой сети должна быть как минимум одна подсеть. Если подсети нет, создайте ее, выбрав Создать подсеть.
-
Если сети нет, нажмите Создать сеть и создайте ее:
- В открывшемся окне укажите имя сети и выберите каталог, в котором она будет создана.
- (Опционально) Выберите опцию Создать подсети, чтобы автоматически создать подсети во всех зонах доступности.
- Нажмите Создать сеть.
-
-
В поле Публичный адрес выберите
Автоматически
, чтобы назначить виртуальной машине случайный внешний IP-адрес из пула Yandex Cloud, или выберите статический адрес из списка, если вы зарезервировали его заранее.
-
-
В блоке Доступ выберите SSH-ключ и укажите данные для доступа к ВМ:
-
В поле Логин введите имя пользователя, который будет создан на виртуальной машине, например
ubuntu
.Внимание
Не используйте логин
root
или другие имена, зарезервированные операционной системой. Для выполнения операций, требующих прав суперпользователя, используйте командуsudo
. -
В поле SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.
Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
- Нажмите кнопку Добавить ключ.
- Задайте имя SSH-ключа.
- Загрузите или вставьте содержимое открытого SSH-ключа. Пару SSH-ключей для подключения к ВМ по SSH необходимо создать самостоятельно.
- Нажмите кнопку Добавить.
SSH-ключ будет добавлен в ваш профиль пользователя организации.
Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя создаваемой виртуальной машины.
-
-
В блоке Общая информация задайте имя ВМ. Для наглядности примера укажите
master-node
. -
Нажмите Создать ВМ.
Настройте ВМ
-
Зайдите по SSH на ВМ и перейдите в режим администратора в консоли:
sudo -i
-
Выполните обновление репозитория и поставьте требуемые утилиты:
apt update apt install -y net-tools htop libopenmpi-dev nfs-common
-
Выйдите из режима администратора и сгенерируйте SSH-ключи для доступа между ВМ:
exit ssh-keygen -t ed25519
-
Добавьте сгенерированный ключ в список разрешенных:
cd ~/.ssh cat id_ed25519.pub >> authorized_keys
Подготовьте кластер ВМ
Создайте кластер
- В консоли управления
перейдите в раздел Диски. - Справа от диска ВМ
master-node
нажмите и выберите Создать снимок. Задайте имяmaster-node-snapshot
. После того как снимок будет создан, он появится в разделе Снимки дисков. - Перейдите в раздел Группы виртуальных машин и нажмите Создать группу виртуальных машин.
- Создайте группу ВМ:
-
В поле Имя укажите имя будущей группы ВМ, например
compute-group
. -
В поле Сервисный аккаунт добавьте сервисный аккаунт к данной группе ВМ. Если у вас нет сервисного аккаунта, нажмите Создать новый, укажите его имя и нажмите на кнопку Создать.
Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе, назначьте сервисному аккаунту роль compute.editor. По умолчанию все операции в Instance Groups выполняются от имени сервисного аккаунта.
-
В поле Зона доступности выберите зону, в которой находится ВМ
master-node
. Зоны доступности должны совпадать, чтобы минимизировать задержки при взаимодействии ВМ. -
В блоке Шаблон виртуальной машины нажмите кнопку Задать. Откроется экран создания шаблона.
- В блоке Диски и файловые хранилища выберите Добавить диск. В открывшемся окне укажите:
- В блоке Вычислительные ресурсы задайте конфигурацию, аналогичную конфигурации основной ВМ:
- Платформа —
Intel Ice Lake
. - vCPU —
4
. - Гарантированная доля vCPU —
100%
. - RAM —
4 ГБ
. - Дополнительно —
Прерываемая
.
- Платформа —
- В блоке Сетевые настройки укажите те же сеть и подсеть, что и у основной ВМ. Тип IP-адреса оставьте Автоматически.
- В блоке Доступ укажите данные для доступа к ВМ:
- В поле Логин введите предпочтительное имя пользователя, который будет создан на ВМ.
- В поле 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-адреса.
- Найдите нужный IP-адрес, нажмите значок
и выберите пункт Удалить.