Высокопроизводительные вычисления (HPC) на прерываемых виртуальных машинах

HPC-кластеры используются в вычислительных целях, в частности в научных исследованиях и расчетных задачах. Вычислительный кластер представляет собой массив серверов (вычислительных узлов), объединенных сетью. Каждый вычислительный узел имеет несколько многоядерных процессоров, свою оперативную память и работает под управлением независимой операционной системы. Наиболее распространено использование однородных кластеров, где все узлы одинаковы по своей архитектуре и производительности.

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

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

  1. Подготовьте облако к работе.
  2. Подготовьте основную виртуальную машину в облаке.
    1. Создайте виртуальную машину.
    2. Настройте виртуальную машину.
  3. Подготовьте кластер виртуальных машин.
  4. Создайте кластер.
    1. Проверьте работу кластера.
    2. Настройте NFS.
    3. Смонтируйте директории на ВМ из группы.
  5. Подготовьте задачу для вычислений в кластере.
  6. Запустите и проанализируйте вычисления.
  7. Как удалить созданные ресурсы.

Подготовьте облако к работе

Перед работой нужно зарегистрироваться в Облаке и создать платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Облако или зарегистрируйтесь, если вы еще не зарегистрированы.
  2. На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его.

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

Подробнее об облаках и каталогах.

Необходимые платные ресурсы

В стоимость поддержки серверов входит:

Подготовьте основную виртуальную машину в облаке

Создайте виртуальную машину

Для того, чтобы создать виртуальную машину:

  1. На странице каталога в консоли управления нажмите кнопку Создать ресурс и выберите пункт Виртуальная машина.

  2. В поле Имя введите имя виртуальной машины. Для наглядности примера укажите master-node.

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

  4. В блоке Публичные образы выберите образ Ubuntu.

  5. В блоке Диски выберите жесткий диск размером 13 ГБ. Тип диска выберите SSD, поскольку он будет использоваться для сетевого доступа другими виртуальными машинами.

  6. В блоке Вычислительные ресурсы:

    • Выберите платформу виртуальной машины.
    • Для решения текущих вычислительных задач укажите конфигурацию:
    • Платформа — Intel Cascade Lake.
    • Гарантированная доля vCPU — 100%.
    • vCPU — 4.
    • RAM — 4 ГБ.
    • Дополнительно — «Прерываемая».
  7. В блоке Сетевые настройки:

    • Выберите Сеть и Подсеть, к которым нужно подключить виртуальную машину. Если нужной сети или подсети еще нет, вы можете создать их прямо на странице создания ВМ.
    • В поле Публичный адрес оставьте значение Автоматически, чтобы назначить виртуальной машине случайный внешний IP-адрес из пула Яндекс.Облака, или выберите статический адрес из списка, если вы зарезервировали его заранее.
  8. В блоке Доступ укажите данные для доступа к виртуальной машине:

    • В поле Логин введите предпочтительное имя пользователя, который будет создан на виртуальной машине.
    • В поле SSH-ключ скопируйте ваш открытый SSH-ключ. Пару ключей для подключения по SSH необходимо создать самостоятельно, см. раздел о подключении к виртуальным машинам по SSH.
  9. Нажмите кнопку Создать ВМ.

Настройте виртуальную машину

  1. Зайдите по SSH на виртуальную машину и перейдите в режим администратора в консоли:

    $ sudo -i
    
  2. Выполните обновление репозитория и поставьте требуемые утилиты:

    $ apt update
    $ apt install -y net-tools htop libopenmpi-dev nfs-common
    
  3. Выйдите из режима администратора и сгенерируйте RSA-ключи для доступа между виртуальными машинами:

    $ exit
    $ ssh-keygen
    
  4. Добавьте сгенерированный ключ в список разрешенных:

    $ cd ~/.ssh
    $ cat id_rsa.pub >> authorized_keys
    

Подготовьте кластер виртуальных машин

Создайте кластер

  1. В консоли управления перейдите в раздел Диски и нажмите Создать снимок у диска ВМ master-node. Задайте имя master-node-snapshot. После того, как снимок будет создан, он появится в разделе Снимки дисков.
  2. Перейдите в раздел Группы виртуальных машин и нажмите Создать группу.
  3. Создайте группу виртуальных машин:
    • В поле Имя укажите имя будущей группы, например compute-group.
    • В поле Сервисный аккаунт добавьте сервисный аккаунт к данной группе. Если у вас нет сервисного аккаунта, нажмите Создать новый, укажите его имя и нажмите на кнопку Создать.
    • Выберите ту же Зону доступности в которой находится ВМ master-node. Зона должна совпадать у виртуальных машин, чтобы минимизировать задержки при их взаимодействии.
    • В блоке Шаблон виртуальной машины нажмите кнопку Задать. Откроется экран создания шаблона.
      • В блоке Диски выберите Добавить диск. В открывшемся окне укажите:

        • Назначение диска — загрузочный.
        • Тип диска — SSD.
        • Наполнение — из созданного снимка master-node-snapshot.
      • В блоке Вычислительные ресурсы задайте конфигурацию, аналогичную конфигурации основной виртуальной машины:

        • Платформа — Intel Cascade Lake.
        • Гарантированная доля vCPU — 100%.
        • vCPU — 4.
        • RAM — 4 ГБ.
        • Дополнительно — «Прерываемая».
      • В блоке Сетевые настройки укажите те же сеть и подсеть, что и у основной машины. Тип адреса оставьте Автоматически.

      • В блоке Доступ укажите данные для доступа к виртуальной машине:

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

  4. В блоке Масштабирование выберите количество создаваемых виртуальным машин. Укажите 3 виртуальные машины.
  5. Нажмите кнопку Создать.

Проверьте работу кластера

Зайдите по SSH на каждую из виртуальных машин в группе compute-group и убедитесь, что с них есть доступ к ВМ master-node по SSH.

$ ping master-node
$ ssh master-node

Настройте NFS

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

  1. Зайдите на ВМ master-node по SSH и установите NFS-сервер:

    $ ssh <Публичный IP-адрес ВМ master-node>
    $ sudo apt install nfs-kernel-server
    
  2. Создайте директорию shared, которая будет общей для всех виртуальных машин:

    $ mkdir ~/shared
    
  3. Откройте файл /etc/exports любым текстовым редактором, например, nano:

    $ sudo nano /etc/exports
    
  4. Добавьте запись для доступа к директории shared в файл:

    /home/<имя пользователя>/shared *(rw,sync,no_root_squash,no_subtree_check)
    

    Сохраните файл.

  5. Примените настройки и перезагрузите сервис:

    $ sudo exportfs -a
    $ sudo service nfs-kernel-server restart
    

Смонтируйте директории на ВМ из группы

На каждой ВМ из группы compute-group смонтируйте созданную директорию:

  1. Создайте директорию shared и смонтируйте туда директорию с ВМ master-node:

    $ mkdir ~/shared
    $ sudo mount -t nfs master-node:/home/<имя пользователя>/shared ~/shared
    
  2. Убедитесь, что директория была успешно смонтирована:

    $ df -h
    Filesystem                            Size  Used Avail Use% Mounted on
    ...
    master-node:/home/<имя пользователя>/shared   13G  1.8G   11G  15% /home/<имя пользователя>/shared
    

Подготовьте задачу для вычислений в кластере

  1. Зайдите по SSH на ВМ master-node, перейдите в директорию shared и скачайте исходный файл task.c с вычислительной задачей:

    $ cd ~/shared
    $ wget https://raw.githubusercontent.com/cloud-docs-writer/examples/master/hpc-on-preemptible/task.c
    

    Этот код решает систему линейных алгебраических уравнений с помощью метода Якоби. Задача имеет одну из распределенных реализаций с помощью MPI.

  2. Скомпилируйте исходный файл в исполняемый:

    $ mpicc task.c -o task
    

    В директории shared должен был появиться исполняемый файл task.

Запустите и проанализируйте вычисления

Совет

Для проверки загрузки ядер виртуальных машин можно выполнять команду htop в отдельной SSH-сессии на каждой виртуальной машине.

  1. Запустите выполнение задачи на 2 ядрах, используя ресурсы только ВМ master-node:

    $ mpirun -np 2 task
    

    После выполнения задачи программа выведет затраченное на решение время:

    JAC1 STARTED
    1: Time of task=45.104153
    0: Time of task=45.103931
    
  2. Запустите выполнение задачи на 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
    
  3. Запустите выполнение задачи на 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
    
  4. По аналогии можно продолжать увеличивать число используемых виртуальных машин и ядер и убедиться, что распределенные вычисления позволяют значительно увеличивать скорость выполнения задачи.

Как удалить созданные ресурсы

Чтобы перестать платить за развернутый сервер и группу виртуальных машин, достаточно удалить ВМ master-node и группу compute-group.

Если вы зарезервировали статический публичный IP-адрес специально для этой ВМ:

  1. Откройте сервис Virtual Private Cloud в вашем каталоге.
  2. Перейдите на вкладку IP-адреса.
  3. Найдите нужный адрес, нажмите значок ellipsis и выберите пункт Удалить.