[Документация Yandex Cloud](../../index.md) > [Yandex Compute Cloud](../index.md) > [Практические руководства](index.md) > Высокопроизводительные вычисления (HPC) на прерываемых ВМ

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

[HPC-кластеры](https://ru.wikipedia.org/wiki/Кластер_(группа_компьютеров)) используются в вычислительных целях, в частности в научных исследованиях и расчетных задачах. Вычислительный кластер представляет собой массив серверов (вычислительных узлов), объединенных сетью. Каждый вычислительный узел имеет несколько многоядерных процессоров, свою оперативную память и работает под управлением независимой операционной системы. Наиболее распространено использование однородных кластеров, где все узлы одинаковы по своей архитектуре и производительности.

По этой инструкции вы создадите кластер [прерываемых ВМ](../concepts/preemptible-vm.md), которые будут решать общую вычислительную задачу. Примером вычислительной задачи будет решение системы линейных алгебраических уравнений с помощью [метода Якоби](https://ru.wikipedia.org/wiki/Метод_Якоби).

Для создания кластера и запуска вычислительной задачи:
1. [Подготовьте облако к работе](#before-you-begin).
1. [Подготовьте основную ВМ в облаке](#create-master-vm).
1. [Подготовьте кластер ВМ](#prepare-cluster).
1. [Создайте кластер](#create-cluster).
1. [Подготовьте задачу для вычислений в кластере](#config-hpc).
1. [Запустите и проанализируйте вычисления](#start-hpc).
1. [Удалите созданные ресурсы](#clear-out).

## Подготовьте облако к работе {#before-you-begin}

Зарегистрируйтесь в Yandex Cloud и создайте [платежный аккаунт](../../billing/concepts/billing-account.md):
1. Перейдите в [консоль управления](https://kz.console.yandex.cloud), затем войдите в Yandex Cloud или зарегистрируйтесь.
1. На странице **[Yandex Cloud Billing](https://kz.console.yandex.cloud/billing)** убедитесь, что у вас подключен платежный аккаунт, и он находится в [статусе](../../billing/concepts/billing-account-statuses.md) `ACTIVE` или `TRIAL_ACTIVE`. Если платежного аккаунта нет, [создайте его](../../billing/quickstart/index.md) и [привяжите](../../billing/operations/pin-cloud.md) к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать [каталог](../../resource-manager/concepts/resources-hierarchy.md#folder), в котором будет работать ваша инфраструктура, на [странице облака](https://kz.console.yandex.cloud/cloud).

[Подробнее об облаках и каталогах](../../resource-manager/concepts/resources-hierarchy.md).

### Необходимые платные ресурсы {#paid-resources}

В стоимость поддержки серверов входит:
* Плата за несколько запущенных [ВМ](../concepts/vm.md) ([тарифы Yandex Compute Cloud](../pricing.md)).
* Плата за использование динамического или статического [публичного IP-адреса](../../vpc/concepts/address.md#public-addresses) ([тарифы Yandex Virtual Private Cloud](../../vpc/pricing.md)).

## Подготовьте основную ВМ в облаке {#create-master-vm}

### Создайте ВМ {#create-vm}

Чтобы создать ВМ:

1. В [консоли управления](https://kz.console.yandex.cloud) выберите [каталог](../../resource-manager/concepts/resources-hierarchy.md#folder), в котором будет создана ВМ.
1. Перейдите в сервис **Compute Cloud**.
1. На панели слева выберите ![image](../../_assets/console-icons/server.svg) **Виртуальные машины**.
1. Нажмите кнопку **Создать виртуальную машину**.
1. В блоке **Образ загрузочного диска** выберите образ [Ubuntu](https://yandex.cloud/ru-kz/marketplace?tab=software&search=Ubuntu&categories=os).
1. В блоке **Расположение** выберите [зону доступности](../../overview/concepts/geo-scope.md), в которой будет находиться ВМ.
1. В блоке **Диски и файловые хранилища** выберите тип загрузочного [диска](../concepts/disk.md) `SSD`.
1. В блоке **Вычислительные ресурсы** перейдите на вкладку **Своя конфигурация** и укажите параметры для решения текущих вычислительных задач:

    * **Платформа** — `Intel Ice Lake`.
    * **vCPU** — `4`.
    * **Гарантированная доля vCPU** — `100%`.
    * **RAM** — `4 ГБ`.
    * **Дополнительно** — `Прерываемая`.

1. В блоке **Сетевые настройки**:

    * В поле **Подсеть** укажите идентификатор подсети в зоне доступности создаваемой ВМ или выберите [облачную сеть](../../vpc/concepts/network.md#network) из списка.

        * У каждой сети должна быть как минимум одна [подсеть](../../vpc/concepts/network.md#subnet). Если подсети нет, создайте ее, выбрав **Создать подсеть**.
        * Если сети нет, нажмите **Создать сеть** и создайте ее:

            * В открывшемся окне укажите имя сети и выберите каталог, в котором она будет создана.
            * (Опционально) Выберите опцию **Создать подсети**, чтобы автоматически создать подсети во всех зонах доступности.
            * Нажмите **Создать сеть**.

    * В поле **Публичный IP-адрес** выберите `Автоматически`, чтобы назначить виртуальной машине случайный внешний IP-адрес из пула Yandex Cloud, или выберите статический адрес из списка, если вы зарезервировали его заранее.

1. В блоке **Доступ** выберите **SSH-ключ** и укажите данные для доступа к ВМ:

    * В поле **Логин** введите имя пользователя, который будет создан на виртуальной машине, например `ubuntu`.

      {% note alert %}

      Не используйте логин `root` или другие имена, зарезервированные операционной системой. Для выполнения операций, требующих прав суперпользователя, используйте команду `sudo`.

      {% endnote %}

    * В поле **SSH-ключ** выберите SSH-ключ, сохраненный в вашем профиле [пользователя организации](../../organization/concepts/membership.md).
      
      Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
      
      1. Нажмите кнопку **Добавить ключ**.
      1. Задайте имя SSH-ключа.
      1. Выберите вариант:
      
          * `Ввести вручную` — вставьте содержимое открытого [SSH](../../glossary/ssh-keygen.md)-ключа. Пару SSH-ключей необходимо [создать](../operations/vm-connect/ssh.md#creating-ssh-keys) самостоятельно.
          * `Загрузить из файла` — загрузите открытую часть SSH-ключа. Пару SSH-ключей необходимо создать самостоятельно.
          * `Сгенерировать ключ` — автоматическое создание пары SSH-ключей.
          
            При добавлении сгенерированного SSH-ключа будет создан и загружен архив с парой ключей. В ОС на базе Linux или macOS распакуйте архив в папку `/home/<имя_пользователя>/.ssh`. В ОС Windows распакуйте архив в папку `C:\Users\<имя_пользователя>/.ssh`. Дополнительно вводить открытый ключ в консоли управления не требуется.
      
      1. Нажмите кнопку **Добавить**.
      
      SSH-ключ будет добавлен в ваш профиль пользователя организации. Если в организации [отключена](../../organization/operations/os-login-access.md) возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя внутри создаваемого ресурса.

1. В блоке **Общая информация** задайте имя ВМ. Для наглядности примера укажите `master-node`.
1. Нажмите **Создать ВМ**.

### Настройте ВМ {#setup-vm}

1. [Зайдите по SSH](../operations/vm-connect/ssh.md) на ВМ и перейдите в режим администратора в консоли:

   ```bash
   sudo -i
   ```

1. Выполните обновление репозитория и поставьте требуемые утилиты:

   ```bash
   apt update
   apt install -y net-tools htop libopenmpi-dev nfs-common
   ```

1. Выйдите из режима администратора и сгенерируйте SSH-ключи для доступа между ВМ:

   ```bash
   exit
   ssh-keygen -t ed25519
   ```

1. Добавьте сгенерированный ключ в список разрешенных:

   ```bash
   cd ~/.ssh
   cat id_ed25519.pub >> authorized_keys
   ```

## Подготовьте кластер ВМ {#prepare-cluster}

### Создайте кластер {#create-cluster}

1. В [консоли управления](https://kz.console.yandex.cloud) перейдите в раздел **Диски**.
1. Справа от диска ВМ `master-node` нажмите ![image](../../_assets/options.svg) и выберите **Создать снимок**. Задайте имя `master-node-snapshot`. После того как снимок будет создан, он появится в разделе **Снимки дисков**.
1. Перейдите в раздел **Группы виртуальных машин** и нажмите **Создать группу виртуальных машин**.
1. Создайте [группу ВМ](../concepts/instance-groups/index.md):
   * В поле **Имя** укажите имя будущей группы ВМ, например `compute-group`.
   * В поле **Сервисный аккаунт** добавьте [сервисный аккаунт](../concepts/instance-groups/access.md) к данной группе ВМ. Если у вас нет сервисного аккаунта, нажмите **Создать**, укажите его имя и нажмите на кнопку **Создать**.

     Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе, назначьте сервисному аккаунту роль [compute.editor](../security/index.md#compute-editor). По умолчанию все операции в Instance Groups выполняются от имени сервисного аккаунта.

   * В поле **Зона доступности** выберите зону, в которой находится ВМ `master-node`. Зоны доступности должны совпадать, чтобы минимизировать задержки при взаимодействии ВМ.
   * В блоке **Шаблон виртуальной машины** нажмите кнопку **Задать**. Откроется экран создания [шаблона](../concepts/instance-groups/instance-template.md).
     * В блоке **Диски и файловые хранилища** выберите **Добавить диск**. В открывшемся окне укажите:
       * **Тип** — [SSD](../concepts/disk.md#disks-types).
       * **Наполнение** — из созданного [снимка](../concepts/snapshot.md) `master-node-snapshot`.
     * В блоке **Вычислительные ресурсы** задайте конфигурацию, аналогичную конфигурации основной ВМ:
       * **Платформа** — `Intel Ice Lake`.
       * **vCPU** — `4`.
       * **Гарантированная доля vCPU** — `100%`.
       * **RAM** — `4 ГБ`.
       * **Дополнительно** — `Прерываемая`.
     * В блоке **Сетевые настройки** укажите те же сеть и подсеть, что и у основной ВМ. Тип IP-адреса оставьте **Автоматически**.
     * В блоке **Доступ** укажите данные для доступа к ВМ:
       * В поле **Логин** введите предпочтительное имя пользователя, который будет создан на ВМ.
       * В поле **SSH-ключ** скопируйте ваш открытый SSH-ключ. Пару ключей для подключения по SSH необходимо [создать самостоятельно](../operations/vm-connect/ssh.md).
     * Нажмите кнопку **Сохранить**. Вы вернетесь на экран создания группы ВМ.
1. В блоке **Масштабирование** выберите количество создаваемых ВМ. Укажите 3 ВМ.
1. Нажмите кнопку **Создать**.

### Проверьте работу кластера {#test-cluster}

[Зайдите по SSH](../operations/vm-connect/ssh.md) на каждую из ВМ в группе `compute-group` и убедитесь, что с них есть доступ к ВМ `master-node` по SSH:

```bash
ping master-node
ssh master-node
```

### Настройте NFS {#configure-nfs}

Чтобы ВМ могли использовать одни и те же исходные файлы, создайте общую сетевую директорию с помощью протокола сетевого доступа [NFS](https://ru.wikipedia.org/wiki/Network_File_System):
1. Зайдите на ВМ `master-node` по SSH и установите NFS-сервер:

   ```bash
   ssh <публичный IP-адрес ВМ master-node>
   sudo apt install nfs-kernel-server
   ```

1. Создайте директорию `shared`, которая будет общей для всех ВМ:

   ```bash
   mkdir ~/shared
   ```

1. Откройте файл `/etc/exports` любым текстовым редактором, например, `nano`:
   
   ```bash
   sudo nano /etc/exports
   ```

1. Добавьте запись для доступа к директории `shared` в файл:

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

   Сохраните файл.
1. Примените настройки и перезагрузите сервис:

   ```bash
   sudo exportfs -a
   sudo service nfs-kernel-server restart
   ```

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

На каждой ВМ из группы `compute-group` смонтируйте созданную директорию:
1. Создайте директорию `shared` и смонтируйте туда директорию с ВМ `master-node`:

   ```bash
   mkdir ~/shared
   sudo mount -t nfs master-node:/home/<имя пользователя>/shared ~/shared
   ```

1. Убедитесь, что директория была успешно смонтирована:

   ```bash
   df -h
   ```

   Результат:

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

## Подготовьте задачу для вычислений в кластере {#config-hpc}

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

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

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

   ```bash
   mpicc task.c -o task
   ```

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

## Запустите и проанализируйте вычисления {#start-hpc}

{% note tip %}

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

{% endnote %}

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

   ```bash
   mpirun -np 2 task
   ```

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

   ```text
   JAC1 STARTED
   1: Time of task=45.104153
   0: Time of task=45.103931
   ```

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

   ```bash
   mpirun -np 4 task
   ```

   Результат:

   ```text
   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
   ```

1. Запустите выполнение задачи на 4 ядрах, используя ресурсы двух ВМ, по 2 ядра на каждой ВМ. Для этого запустите выполнение задачи с ключом `-host`, который принимает параметры вида `<IP-адрес ВМ>:<количество ядер>[,<ip>:<cores>[,...]]`:

   ```bash
   mpirun -np 4 -host localhost:2,<IP-адрес ВМ>:2 task
   ```

   Результат:

   ```bash
   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
   ```

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

## Удалите созданные ресурсы {#clear-out}

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

Если вы зарезервировали статический публичный IP-адрес специально для этой ВМ:
1. Перейдите в сервис **Virtual Private Cloud** из вашего каталога.
1. Перейдите на вкладку **Публичные IP-адреса**.
1. Найдите нужный IP-адрес, нажмите значок ![ellipsis](../../_assets/options.svg) и выберите пункт **Удалить**.