Развертывание кластера HPC с автоматическим масштабированием с помощью Slurm

1. Обзор

Добро пожаловать в Google Codelab для запуска кластера Slurm на Google Cloud Platform! К концу этой лабораторной работы вы должны иметь четкое представление о простоте подготовки и эксплуатации автоматически масштабируемого кластера Slurm.

c16fa310c142ac6f.png

Google Cloud объединилась с SchedMD , чтобы выпустить набор инструментов, которые упрощают запуск диспетчера рабочей нагрузки Slurm в Compute Engine и динамически расширяют существующий кластер, когда вам нужны дополнительные ресурсы. Эта интеграция была построена экспертами SchedMD в соответствии с лучшими практиками Slurm.

Если вы планируете использовать Slurm для интеграции с Google Cloud Platform или у вас есть какие-либо вопросы, рассмотрите возможность присоединиться к нашей дискуссионной группе сообщества Google Cloud & Slurm !

О Слерме

a739730a41acff0a.png

Базовая архитектурная схема автономного кластера Slurm в Google Cloud Platform.

Slurm — один из ведущих менеджеров рабочих нагрузок для кластеров HPC по всему миру. Slurm предоставляет отказоустойчивую и масштабируемую систему управления рабочей нагрузкой и планирования заданий с открытым исходным кодом для малых и больших кластеров Linux. Slurm не требует никаких модификаций ядра для своей работы и является относительно автономным. Как менеджер рабочей нагрузки кластера, Slurm выполняет три ключевые функции:

  1. Он предоставляет пользователям эксклюзивный или неисключительный доступ к ресурсам (вычислительным узлам) на определенный период времени, чтобы они могли выполнять работу.
  2. Он обеспечивает основу для запуска, выполнения и мониторинга работы (обычно параллельной работы) на наборе выделенных узлов.
  3. Он разрешает конкуренцию за ресурсы, управляя очередью ожидающих работ.

Что вы узнаете

  • Как настроить кластер Slurm с помощью Terraform
  • Как запустить задание с помощью SLURM
  • Как запрашивать информацию о кластере и отслеживать выполнение заданий в SLURM
  • Как автоматически масштабировать узлы для соответствия конкретным параметрам и требованиям задания
  • Где найти помощь по Slurm

Предварительные условия

  • Аккаунт Google Cloud Platform и проект с выставлением счетов
  • Базовый опыт работы с Linux

2. Настройка

Самостоятельная настройка среды

Создать проект

Если у вас еще нет учетной записи Google (Gmail или G Suite), вам необходимо ее создать . Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и откройте страницу «Управление ресурсами» :

359c06e07e6d699f.png

Нажмите Создать проект.

25c23d651abb837b.png

Введите название проекта. Запомните идентификатор проекта (выделен красным на скриншоте выше). Идентификатор проекта должен быть уникальным именем для всех проектов Google Cloud. Если имя вашего проекта не уникально, Google Cloud сгенерирует случайный идентификатор проекта на основе имени проекта.

Далее вам необходимо включить выставление счетов в консоли разработчика, чтобы использовать ресурсы Google Cloud.

Работа с этой кодовой лабораторией не должна стоить вам больше нескольких долларов, но она может стоить больше, если вы решите использовать больше ресурсов или оставите их включенными (см. раздел «Вывод» в конце этого документа). Калькулятор цен Google Cloud Platform доступен здесь .

Новые пользователи Google Cloud Platform имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Google Cloud Shell

Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этой лаборатории мы будем использовать Google Cloud Shell , среду командной строки, работающую в облаке.

Запустите Google Cloud Shell

В консоли GCP щелкните значок Cloud Shell на верхней правой панели инструментов:

dbad104cef962719.png

Затем нажмите «Запустить Cloud Shell» :

4e50db320508ac88.png

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

20b0aa80492144d.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и упрощает аутентификацию. Большую часть, если не всю, работу в этой лаборатории можно выполнить с помощью простого веб-браузера или Google Chromebook.

После подключения к облачной оболочке вы должны увидеть, что вы уже прошли аутентификацию и что для проекта уже установлен ваш PROJECT_ID :

$ gcloud auth list

Вывод команды:

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
$ gcloud config list project

Вывод команды:

[core]
project = <PROJECT_ID>

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

$ gcloud config set project <PROJECT_ID>

Вывод команды:

Updated property [core/project].

3. Подготовьте и проверьте конфигурацию Slurm Terraform.

Загрузите конфигурацию Slurm Terraform

В сеансе Cloud Shell выполните следующую команду, чтобы клонировать (загрузить) репозиторий Git, содержащий файлы Slurm для Google Cloud Platform Terraform:

git clone https://github.com/SchedMD/slurm-gcp.git

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

cd slurm-gcp

Настройка tfvars Slurm Terraform

В файле Basic.tfvars.example подробно описана конфигурация развертывания, включая сеть, экземпляры и хранилище для развертывания. Скопируйте его в новый файл, который мы назовем «файл tfvars», а затем отредактируйте по мере необходимости.

cd tf/example/basic
cp basic.tfvars.example basic.tfvars

В сеансе Cloud Shell откройте файл tfvars basic.tfvars . Вы можете использовать предпочитаемый вами редактор командной строки (vi, nano, emacs и т. д.) или использовать редактор кода Cloud Console для просмотра содержимого файла:

214f43bba6c917aa.png

Просмотрите содержимое файла tfvars.

cluster_name = "g1"
project      = "<project>"
zone         = "us-west1-b"

# network_name            = "<existing network name>"
# subnetwork_name         = "<existing subnetwork name>"
# shared_vpc_host_project = "<vpc host project>"

# disable_controller_public_ips = true
# disable_login_public_ips      = true
# disable_compute_public_ips    = true

# suspend_time  = 300

controller_machine_type = "n1-standard-2"
controller_image        = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
controller_disk_type    = "pd-standard"
controller_disk_size_gb = 50
# controller_labels = {
#   key1 = "val1"
#   key2 = "val2"
# }
# controller_service_account = "default"
# controller_scopes          = ["https://www.googleapis.com/auth/cloud-platform"]
# cloudsql = {
#   server_ip = "<cloudsql ip>"
#   user      = "slurm"
#   password  = "verysecure"
#   db_name   = "slurm_accounting"
# }
# controller_secondary_disk      = false
# controller_secondary_disk_size = 100
# controller_secondary_disk_type = "pd-ssd"
#
# When specifying an instance template, specified controller fields will
# override the template properites.
# controller_instance_template = null

login_machine_type = "n1-standard-2"
login_image        = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
login_disk_type    = "pd-standard"
login_disk_size_gb = 20
# login_labels = {
#   key1 = "val1"
#   key2 = "val2"
# }
# login_node_count = 1
# login_node_service_account = "default"
# login_node_scopes          = [
#   "https://www.googleapis.com/auth/monitoring.write",
#   "https://www.googleapis.com/auth/logging.write"
# ]
#
# When specifying an instance template, specified login fields will
# override the template properties.
# login_instance_template = null

# Optional network storage fields
# network_storage is mounted on all instances
# login_network_storage is mounted on controller and login instances
# network_storage = [{
#   server_ip     = "<storage host>"
#   remote_mount  = "/home"
#   local_mount   = "/home"
#   fs_type       = "nfs"
#   mount_options = null
# }]
#
# login_network_storage = [{
#   server_ip     = "<storage host>"
#   remote_mount  = "/net_storage"
#   local_mount   = "/shared"
#   fs_type       = "nfs"
#   mount_options = null
# }]

# compute_node_service_account = "default"
# compute_node_scopes          = [
#   "https://www.googleapis.com/auth/monitoring.write",
#   "https://www.googleapis.com/auth/logging.write"
# ]

partitions = [
  { name                 = "debug"
    machine_type         = "n1-standard-2"
    static_node_count    = 0
    max_node_count       = 10
    zone                 = "us-west1-b"
    image                ="projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
    image_hyperthreads   = false
    compute_disk_type    = "pd-standard"
    compute_disk_size_gb = 20
    compute_labels       = {}
    cpu_platform         = null
    gpu_count            = 0
    gpu_type             = null
    network_storage      = []
    preemptible_bursting = false
    vpc_subnet           = null
    exclusive            = false
    enable_placement     = false
    regional_capacity    = false
    regional_policy      = {}
    instance_template    = null
  },
  #  { name                 = "partition2"
  #    machine_type         = "n1-standard-16"
  #    static_node_count    = 0
  #    max_node_count       = 20
  #    zone                 = "us-west1-b"
  #    image                = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
  #    image_hyperthreads   = false
  #
  #    compute_disk_type    = "pd-ssd"
  #    compute_disk_size_gb = 20
  #    compute_labels       = {
  #      key1 = "val1"
  #      key2 = "val2"
  #    }
  #    cpu_platform         = "Intel Skylake"
  #    gpu_count            = 8
  #    gpu_type             = "nvidia-tesla-v100"
  #    network_storage      = [{
  #      server_ip     = "none"
  #      remote_mount  = "<gcs bucket name>"
  #      local_mount   = "/data"
  #      fs_type       = "gcsfuse"
  #      mount_options = "file_mode=664,dir_mode=775,allow_other"
  #    }]
  #    preemptible_bursting = true
  #    vpc_subnet           = null
  #    exclusive            = false
  #    enable_placement     = false
  #
  #    ### NOTE ####
  #    # regional_capacity is under development. You may see slowness in
  #    # deleting lots of instances.
  #    #
  #    # With regional_capacity : True, the region can be specified in the zone.
  #    # Otherwise the region will be inferred from the zone.
  #    zone = "us-west1"
  #    regional_capacity    = True
  #    # Optional
  #    regional_policy      = {
  #        locations = {
  #            "zones/us-west1-a" = {
  #                preference = "DENY"
  #            }
  #        }
  #    }
  #
  #    When specifying an instance template, specified compute fields will
  #    override the template properties.
  #    instance_template = "my-template"
]

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

  • имя_кластера: Имя кластера Slurm.
  • проект: идентификатор проекта Google Cloud, где будут развернуты ресурсы.
  • зона: зона Google Cloud, которая будет содержать экземпляры контроллера и входа в систему этого кластера. Дополнительная информация
  • network_name: сеть виртуального частного облака для развертывания кластера Slurm.
  • subnetwork_name: подсеть виртуального частного облака для развертывания кластера Slurm.
  • shared_vpc_host_project: общая сеть VPC для развертывания кластера Slurm.
  • Disable_controller_public_ips: Назначить внешний IP-адрес контроллеру Slurm?
  • Disable_login_public_ips: Назначить внешний IP-адрес узлу входа в Slurm?
  • Disable_compute_login_ips: Назначить внешний IP-адрес узлу входа в Slurm?
  • suspend_time: время ожидания после простоя узла перед его приостановкой.
  • Controller_machine_type: Тип экземпляра узла контроллера
  • Controller_image: изображение GCP, используемое для создания экземпляра контроллера Slurm.
  • Controller_disk_type: Тип загрузочного диска экземпляра контроллера.
  • Controller_disk_size_gb: Размер загрузочного диска экземпляра контроллера.
  • Controller_labels: Метки для прикрепления к экземпляру контроллера.
  • Controller_service_account: учетная запись службы , которая будет использоваться на экземпляре контроллера.
  • Controller_scopes: область доступа экземпляра контроллера.
  • cloudsql: сервер Google CloudSQL для использования в качестве базы данных Slurm вместо размещения базы данных на экземпляре контроллера.
  • server_ip: IP-адрес сервера CloudSQL.
  • пользователь: имя пользователя CloudSQL
  • пароль: пароль CloudSQL
  • db_name: имя базы данных CloudSQL.
  • контроллер_вторичный_диск: Добавить дополнительный диск для хранилища NFS-сервера?
  • контроллер_вторичный_диск_тип: тип вторичного диска контроллера.
  • контроллер_вторичный_диск_размер_гб: размер вторичного диска контроллера.
  • Controller_instance_template: шаблон экземпляра GCP, который будет использоваться для экземпляра контроллера. Любые указанные вычислительные поля переопределяют свойства шаблона. Например. если указан контроллер_image, изображение в шаблоне экземпляра будет перезаписано.
  • login_machine_type: тип экземпляра узла входа (доступный по SSH).
  • login_image: изображение GCP, используемое для создания экземпляра входа в систему Slurm.
  • login_disk_type: Тип загрузочного диска экземпляра входа.
  • login_disk_size_gb: Размер загрузочного диска экземпляра входа.
  • login_labels: Метки для прикрепления к экземпляру входа в систему.
  • login_node_count: количество создаваемых узлов входа.
  • login_node_service_account: учетная запись службы , которая будет использоваться в экземплярах входа в систему.
  • login_node_scopes: область доступа экземпляра входа в систему.
  • login_instance_template: шаблон экземпляра GCP, который будет использоваться для экземпляра входа в систему. Любые указанные вычислительные поля переопределяют свойства шаблона. Например. если указан login_image, изображение в шаблоне экземпляра будет перезаписано.
  • network_storage: сетевое хранилище для подключения на всех узлах. Поля будут добавлены непосредственно в fstab. Можно повторить для дополнительных креплений.
  • server_ip: IP-адрес сервера хранения.
  • Remote_mount: имя монтирования хранилища (имя файловой системы)
  • local_mount: локальный каталог монтирования
  • fs_type: тип файловой системы (NFS, CIFS, Lustre, GCSFuse устанавливаются автоматически)
  • mount_options: параметры монтирования (т.е. значения по умолчанию,_netdev)
  • login_network_storage: сетевое хранилище для подключения к узлам входа и контроллера. NFS, CIFS, Lustre и GCSFuse будут установлены автоматически. Можно повторить для дополнительных креплений.
  • server_ip: IP-адрес сервера хранения.
  • Remote_mount: имя монтирования хранилища (имя файловой системы)
  • local_mount: локальный каталог монтирования
  • fs_type: тип файловой системы (NFS, CIFS, Lustre, GCSFuse устанавливаются автоматически)
  • mount_options: параметры монтирования (т.е. значения по умолчанию,_netdev)
  • Compute_node_service_account: учетная запись службы , которая будет использоваться в вычислительных экземплярах.
  • Compute_node_scopes: область доступа вычислительных экземпляров.
  • разделы: конфигурация разделов Slurm. Можно повторить для дополнительных разделов.
  • имя: Имя раздела
  • Machine_type: Тип экземпляра вычислительного узла(ов)
  • static_node_count: количество постоянно работающих вычислительных узлов.
  • max_node_count: Максимально допустимое общее количество вычислительных узлов — максимум 64 КБ.
  • зона: зона Google Cloud, которая будет содержать ресурсы этого раздела. Дополнительная информация.
  • image: Тип машины узла вычислительного образа.
  • image_hyperthreads: включить или отключить гиперпоточность на экземпляре.
  • Compute_disk_type : тип загрузочного диска вычислительного экземпляра (pd-standard, pd-ssd).
  • Compute_disk_size_gb: Размер загрузочного диска вычислительного экземпляра.
  • Compute_labels: Метки для прикрепления к экземпляру вычислений.
  • cpu_platform: минимальная платформа ЦП, необходимая для всех вычислительных узлов.
  • gpu_count: количество графических процессоров, подключаемых к каждому экземпляру в разделе.
  • gpu_type: тип графического процессора для прикрепления к экземплярам раздела.
  • network_storage: сетевое хранилище для подключения на всех вычислительных узлах в разделе. Поля будут добавлены непосредственно в fstab. Можно повторить для дополнительных креплений.
  • server_ip: IP-адрес сервера хранения.
  • Remote_mount: имя монтирования хранилища (имя файловой системы)
  • local_mount: локальный каталог монтирования
  • fs_type: тип файловой системы (NFS, CIFS, Lustre, GCSFuse устанавливаются автоматически)
  • mount_options: опция монтирования
  • preemptible_bursting: Будут ли экземпляры вытесняемыми?
  • vpc_subnet: подсеть виртуального частного облака для развертывания раздела Slurm.
  • эксклюзивно: включите Slurm для выделения целых узлов для заданий.
  • Enable_placement: Включить политику размещения , при которой экземпляры будут располагаться близко друг к другу, чтобы обеспечить низкую задержку в сети между экземплярами.
  • Regional_capacity: Разрешить размещение экземпляра в любой зоне региона в зависимости от доступности.
  • Regional_policy: Если региональная_емкость имеет значение true, эта политика определяет, какой регион использовать, а какие зоны в этом регионе не использовать.
  • Instance_template: шаблон экземпляра GCP , используемый для вычислительных экземпляров. Любые указанные вычислительные поля переопределяют свойства шаблона. Например. если указано изображение, оно перезапишет изображение в шаблоне экземпляра.

Расширенная конфигурация

При желании вы можете установить дополнительные пакеты и программное обеспечение в рамках процесса развертывания кластера. Вы можете установить программное обеспечение в свой кластер Slurm несколькими способами, описанными в нашей статье «Установка приложений в кластер Slurm на Compute Engine» , или настроив образ, развернутый Slurm. В настоящее время Slurm развертывает предоставленный SchedMD образ виртуальной машины, основанный на образе виртуальной машины Google Cloud HPC , поверх которого устанавливается Slurm.

Чтобы использовать собственный образ, создайте образ с собственной конфигурацией на основе общедоступного образа виртуальной машины SchedMD, указанного в файле tfvars. Затем замените URI изображения, указанный в файле tfvars, на свое собственное изображение и протестируйте изменение.

Поиск неисправностей

В ходе этой лабораторной работы обращайтесь к разделу «Устранение неполадок» в файле ReadMe репозитория Slurm-GCP.

Наиболее распространенными проблемами являются ошибки при настройке файла tfvars и ограничения квот. Эта кодовая лаборатория предназначена для работы в рамках стандартной квоты нового пользователя и в рамках бесплатного кредита в размере 300 долларов США, который получает новый пользователь. Если попытка создания виртуальных машин не удалась, проверьте файл /var/log/slurm/resume.log на узле контроллера, чтобы проверить наличие ошибок API.

4. Развертывание и проверка конфигурации.

Развертывание конфигурации

В сеансе Cloud Shell выполните следующую команду из папки slurm-gcp/tf/example :

terraform init
terraform apply -var-file=basic.tfvars

Вам будет предложено принять описанные действия в зависимости от установленных конфигураций. Введите « да », чтобы начать развертывание. Вы также можете просмотреть конфигурацию, которая будет развернута, запустив «terraform plan».

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

Операция может занять несколько минут, поэтому наберитесь терпения .

После завершения развертывания вы увидите вывод, похожий на:

Apply complete! Resources: 8 added, 0 changed, 0 destroyed.

Outputs:

controller_network_ips = [
  [
    "10.0.0.2",
  ],
]
login_network_ips = [
  [
    "10.0.0.3",
  ],
]

Проверка создания экземпляра виртуальной машины

Откройте меню навигации и выберите Compute Engine > Экземпляры виртуальных машин.

d5832bdd527794ed.png

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

7a1fc9603758d58d.png

В разделе «Экземпляры виртуальных машин» просмотрите два экземпляра виртуальных машин, созданных Terraform.

Имена будут другими, если вы изменили поле имя_кластера .

  • g1-контроллер
  • g1-логин0

5. Войдите в кластер Slurm.

Доступ к кластеру Слёрм

Вернитесь на вкладку «Редактор кода/Cloud Shell». Выполните следующую команду, чтобы войти в свой экземпляр, заменив <ZONE> на зону узла g1-login0 (должно быть us-central1-b ):

gcloud compute ssh g1-login0 --zone=<ZONE>

Эта команда позволит вам войти в виртуальную машину g1-login0 .

Другой способ легко получить доступ к узлу входа — нажать кнопку «SSH» рядом с виртуальной машиной g1-login0 на странице «Экземпляры виртуальной машины», чтобы открыть новую вкладку с SSH-соединением.

8c373a87d13620f7.png

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

WARNING: The public SSH key file for gcloud does not exist.
WARNING: The private SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
This tool needs to create the directory [/home/user/.ssh] before being
 able to generate SSH keys.

Do you want to continue (Y/n)?

Если да, введите Y. Если вас попросят выбрать парольную фразу, оставьте это поле пустым , дважды нажав Enter .

Если при входе в систему появляется следующее сообщение:

*** Slurm is currently being configured in the background. ***
A terminal broadcast will announce when installation and configuration is
complete.

Подождите и не продолжайте лабораторную работу, пока не увидите это сообщение (около 5 минут):

*** Slurm login setup complete ***

Как только вы увидите приведенное выше сообщение, вам придется выйти из системы и снова войти в g1-login0 чтобы продолжить лабораторную работу. Для этого нажмите CTRL + C, чтобы завершить задачу.

Затем выполните следующую команду для выхода из вашего экземпляра:

exit

Теперь повторно подключитесь к своей виртуальной машине для входа. Выполните следующую команду, чтобы войти в свой экземпляр, заменив <ZONE> на зону узла g1-login0:

gcloud compute ssh g1-login0 --zone=<ZONE>

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

Обзор инструментов CLI Slurm

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

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

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

sinfo

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

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite     10  idle~ g1-compute-0-[0-9]

Вы можете видеть, что наши 10 узлов, определяемые значением "max_node_count" раздела отладки, равным 10, помечены как "idle~" (узел находится в режиме ожидания и нераспределенном режиме, готовый к развертыванию).

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

squeue

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

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

Команды Slurm «srun» и «sbatch» используются для запуска заданий, помещенных в очередь. «srun» запускает параллельные задания и может использоваться как оболочка для mpirun. «sbatch» используется для отправки пакетного задания в slurm и может вызывать srun один или несколько раз в разных конфигурациях. «sbatch» может принимать пакетные сценарии или может использоваться с опцией –wrap для запуска всего задания из командной строки.

Давайте запустим задание, чтобы увидеть Slurm в действии и получить задание в нашу очередь!

6. Запустите задание Slurm и масштабируйте кластер

Запустите задание Slurm и масштабируйте кластер

Теперь, когда у нас запущен кластер Slurm, давайте запустим задание и масштабируем наш кластер.

Команда «sbatch» используется для запуска пакетных команд и сценариев Slurm. Давайте запустим простой пакетный скрипт, который будет запускать «имя хоста» на наших автоматически масштабируемых виртуальных машинах.

Войдя в g1-login0, выполните следующую команду:

sbatch -N2 --wrap="srun hostname"

Эта команда запускает пакетную команду Slurm. Он указывает, что sbatch будет запускать 2 узла с опцией «-N». Он также указывает, что каждый из этих узлов будет запускать команду «srun hostname» в опции «-wrap».

По умолчанию sbatch записывает свои выходные данные в «slurm-%j.out» в рабочем каталоге, из которого запускается команда, где %j заменяется идентификатором задания в соответствии с шаблонами имен файлов Slurm . В нашем примере пакетная обработка запускается из папки пользователя /home, которая представляет собой общую файловую систему на основе NFS, по умолчанию размещенную на контроллере. Это позволяет вычислительным узлам при желании совместно использовать входные и выходные данные. В производственной среде рабочее хранилище должно быть отделено от хранилища /home, чтобы избежать снижения производительности операций кластера. Отдельные подключения хранилищ можно указать в файле tfvars в опциях «network_storage».

После выполнения сценария sbatch с использованием командной строки sbatch он вернет идентификатор запланированного задания, например:

Submitted batch job 2

Мы можем использовать идентификатор задания, возвращаемый командой sbatch, для отслеживания и управления выполнением задания и ресурсами. Выполните следующую команду, чтобы просмотреть очередь заданий Slurm:

squeue

Скорее всего, вы увидите выполненное вами задание, как показано ниже:

JOBID PARTITION               NAME     USER ST       TIME  NODES   NODELIST(REASON)
    2     debug g1-compute-0-[0-1] username  R       0:10      2 g1-compute-0-[0-1]

Поскольку у нас не было подготовленных вычислительных узлов, Slurm автоматически создаст вычислительные экземпляры в соответствии с требованиями задания. Автоматический характер этого процесса имеет два преимущества. Во-первых, это исключает работу, которая обычно требуется в кластере HPC: вручную выделять узлы, настраивать программное обеспечение, интегрировать узел в кластер и затем развертывать задание. Во-вторых, это позволяет пользователям экономить деньги, поскольку простаивающие, неиспользуемые узлы сокращаются до тех пор, пока не будет запущено минимальное количество узлов.

Вы можете выполнить команду sinfo , чтобы увидеть, как работает кластер Slurm:

sinfo

Это покажет узлы, перечисленные в очереди, в состоянии «alloc#», что означает, что узлы выделяются:

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite      8  idle~ g1-compute-0-[2-9]
debug*       up   infinite      2 alloc#  g1-compute-0-[0-1]

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

9997efff595f1e.png

Как только узлы запустят задание, экземпляры перейдут в состояние «выделения», что означает, что задания распределяются по заданию:

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite      8  idle~ g1-compute-0-[2-9]
debug*       up   infinite      2  alloc g1-compute-0-[0-1]

Как только задание будет завершено, оно больше не будет отображаться в очереди, а узлы «alloc» в sinfo вернутся в состояние «бездействия». Периодически запускайте «очередь», пока задание не будет завершено через минуту или две.

Выходной файл slurm-%j.out будет записан в вашу общую папку /home NFS и будет содержать имена хостов. Откройте или просмотрите выходной файл (обычно slurm-2.out), его содержимое будет содержать:

g1-compute-0-0
g1-compute-0-1

Отличная работа, вы выполнили задание и расширили свой кластер Slurm!

7. Запустите задание MPI.

Теперь давайте запустим задание MPI на наших узлах. Войдя в систему g1-login0, используйте wget для загрузки программы MPI, написанной на языке программирования C:

wget https://raw.githubusercontent.com/mpitutorial/mpitutorial/gh-pages/tutorials/mpi-hello-world/code/mpi_hello_world.c

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

module load openmpi

Мы будем использовать инструмент «mpicc» для компиляции кода MPI C. Выполните следующую команду:

mpicc mpi_hello_world.c -o mpi_hello_world

Это компилирует наш код C в машинный код, чтобы мы могли запускать код в нашем кластере через Slurm.

Затем используйте предпочитаемый вами текстовый редактор, чтобы создать пакетный скрипт под названием « helloworld_batch »:

vi helloworld_batch

Введите i , чтобы войти в режим вставки vi.

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

#!/bin/bash
#
#SBATCH --job-name=hello_world
#SBATCH --output=hello_world-%j.out
#
#SBATCH --nodes=2

srun mpi_hello_world

Сохраните и выйдите из редактора кода, нажав escape и набрав «:wq» без кавычек.

Этот скрипт определяет среду и задачи пакетного выполнения Slurm. Во-первых, среда выполнения определяется как bash. Затем скрипт сначала определяет параметры Slurm с помощью строк «#SBATCH». Имя задания определяется как «hello_world».

Выходной файл задается как «hello_world_%j.out», где %j заменяет идентификатор задания в соответствии с шаблонами имен файлов Slurm . Этот выходной файл записывается в каталог, из которого запускается пакетный сценарий. В нашем примере это папка пользователя /home, которая представляет собой общую файловую систему на основе NFS. Это позволяет вычислительным узлам при желании совместно использовать входные и выходные данные. В производственной среде рабочее хранилище должно быть отделено от хранилища /home, чтобы избежать снижения производительности операций кластера.

Наконец, количество узлов, на которых должен выполняться этот сценарий, определяется как 2.

После определения параметров предоставляются исполняемые команды. Этот сценарий будет параллельно запускать код mpi_hello_world с помощью команды srun, которая является полной заменой команды mpirun.

Затем запустите сценарий sbatch, используя командную строку sbatch:

sbatch helloworld_batch

Запуск sbatch вернет идентификатор запланированного задания, например:

Submitted batch job 3

Это запустит команду имени хоста на двух узлах, по одной задаче на каждый узел, а также выведет выходные данные в файл hello_world-3.out .

Поскольку у нас уже было подготовлено 2 узла, это задание будет выполнено быстро.

Отслеживать очередь до тех пор, пока задание не будет завершено и больше не будет отображаться в списке:

squeue

После завершения откройте или запустите файл hello_world-3.out и убедитесь, что он запущен на g1-compute-0-[0-1]:

Hello world from processor g1-compute-0-0, rank 0 out of 2 processors
Hello world from processor g1-compute-0-1, rank 1 out of 2 processors

После простоя в течение 5 минут (настраивается с помощью поля suspend_time в YAML или поля SuspendTime в slurm.conf) динамически предоставляемые вычислительные узлы будут освобождены от распределения для освобождения ресурсов. Вы можете проверить это, периодически запуская sinfo и наблюдая, как размер кластера возвращается к 0:

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite     10  idle~ g1-compute-0-[0-9]

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

8. Заключение

Поздравляем, вы создали кластер Slurm на Google Cloud Platform и использовали его новейшие функции для автоматического масштабирования кластера в соответствии с требованиями рабочей нагрузки! Вы можете использовать эту модель для запуска любого разнообразия заданий, и она масштабируется до сотен экземпляров за считанные минуты, просто запрашивая узлы в Slurm.

Если вы хотите продолжить обучение использованию Slurm в GCP, обязательно продолжайте изучение кода « Создание федеративных кластеров HPC с помощью Slurm ». В этой лаборатории кода вы узнаете, как настроить два федеративных кластера Slurm в облаке, чтобы продемонстрировать, как можно добиться многокластерной федерации локально или в облаке.

Вы создаете что-то крутое, используя новую функциональность Slurm, основанную на GCP? Есть вопросы? Есть предложение по функции? Свяжитесь с командой Google Cloud сегодня через веб-сайт Google Cloud High Performance Computing Solutions или пообщайтесь с нами в дискуссионной группе Google Cloud & Slurm !

Очистка развертывания Terraform

Выход из слёрм-узла:

exit

Перед удалением развертывания дайте всем узлам с автоматическим масштабированием уменьшить масштаб. Вы также можете удалить эти узлы вручную, запустив команду «gcloud Compute Instances delete <Instance Name>» для каждого экземпляра или используя графический интерфейс консоли, чтобы выбрать несколько узлов и нажать «Удалить».

Вы можете легко очистить развертывание Terraform после того, как мы закончим, выполнив следующую команду из Google Cloud Shell после выхода из g1-login0:

cd ~/slurm-gcp/tf/examples/basic
terraform destroy -var-file=basic.tfvars

При появлении запроса введите «да» , чтобы продолжить. Эта операция может занять несколько минут, наберитесь терпения.

Удалить проект

Для очистки мы просто удаляем наш проект.

  • В меню навигации выберите IAM & Admin.
  • Затем нажмите на настройки в подменю.
  • Нажмите на значок корзины с текстом «Удалить проект».
  • Следуйте инструкциям подсказок

Что мы рассмотрели

  • Как использовать развертывание Slurm на GCP с помощью Terraform.
  • Как запустить задание с помощью Slurm в GCP.
  • Как запрашивать информацию о кластере и отслеживать выполнение заданий в Slurm.
  • Как автоматически масштабировать узлы с помощью Slurm на GCP для соответствия конкретным параметрам и требованиям задания.
  • Как скомпилировать и запустить приложения MPI в Slurm на GCP.

Найдите поддержку Слёрма

Если вам нужна поддержка при использовании этих интеграций в тестовых или производственных средах, свяжитесь с SchedMD напрямую, используя их контактную страницу здесь: https://www.schedmd.com/contact.php.

Вы также можете использовать доступные руководства по устранению неполадок:

Наконец, вы также можете задать свой вопрос в дискуссионной группе Google Cloud & Slurm, расположенной здесь: https://groups.google.com/g/google-cloud-slurm-discuss.

Узнать больше

Обратная связь

Пожалуйста, отправьте отзыв об этой кодовой лаборатории , используя эту ссылку . Оформление обратной связи занимает менее 5 минут. Спасибо!