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

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

Базовая архитектурная схема автономного кластера Slurm в Google Cloud Platform.
Slurm — один из ведущих менеджеров рабочих нагрузок для высокопроизводительных вычислительных кластеров по всему миру. Slurm предоставляет систему управления рабочими нагрузками и планирования заданий с открытым исходным кодом, отказоустойчивую и масштабируемую для небольших и крупных кластеров Linux. Для работы Slurm не требуется модификация ядра, и он относительно самодостаточен. В качестве менеджера рабочих нагрузок кластера Slurm выполняет три ключевые функции:
- Она предоставляет пользователям эксклюзивный или неэксклюзивный доступ к ресурсам (вычислительным узлам) на определенный период времени, чтобы они могли выполнять свою работу.
- Она предоставляет основу для запуска, выполнения и мониторинга работы (обычно параллельной задачи) на наборе выделенных узлов.
- Она разрешает конфликты за ресурсы, управляя очередью ожидающих выполнения задач.
Что вы узнаете
- Как настроить кластер Slurm с помощью Terraform
- Как запустить задание с помощью SLURM
- Как запрашивать информацию о кластере и отслеживать запущенные задания в SLURM
- Как автоматически масштабировать узлы для обеспечения соответствия конкретным параметрам и требованиям задания.
- Где найти помощь по Slurm
Предварительные требования
- Учетная запись Google Cloud Platform и проект с возможностью выставления счетов.
- Базовые знания Linux
2. Настройка
Настройка среды для самостоятельного обучения
Создать проект
Если у вас еще нет учетной записи Google (Gmail или G Suite), вам необходимо ее создать . Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и откройте страницу «Управление ресурсами» :

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

Введите название проекта. Запомните идентификатор проекта (выделен красным на скриншоте выше). Идентификатор проекта должен быть уникальным для всех проектов 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 на панели инструментов в правом верхнем углу:

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

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

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 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, содержащий файлы Terraform для Slurm for Google Cloud Platform:
git clone https://github.com/SchedMD/slurm-gcp.git
Перейдите в каталог конфигурации развертывания Slurm, выполнив следующую команду:
cd slurm-gcp
Настройка Slurm Terraform tfvars
Файл basic.tfvars.example содержит подробную информацию о конфигурации развертывания, включая сеть, экземпляры и хранилище для развертывания. Скопируйте его в новый файл, который мы назовем «файл tfvars», а затем отредактируйте по мере необходимости.
cd tf/example/basic cp basic.tfvars.example basic.tfvars
В сессии Cloud Shell откройте файл basic.tfvars . Вы можете использовать предпочитаемый вами редактор командной строки (vi, nano, emacs и т. д.) или редактор кода Cloud Console для просмотра содержимого файла:

Просмотрите содержимое файла 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 есть несколько полей для настройки. Единственное поле, которое необходимо настроить, — это проект . Все остальные параметры конфигурации в примере можно использовать как есть, но измените их в соответствии с вашей ситуацией. Более подробное описание параметров конфигурации см. здесь .
- cluster_name: Название кластера 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
- controller_secondary_disk: Добавить дополнительный диск для хранения данных на NFS-сервере?
- controller_secondary_disk_type: Тип вторичного диска контроллера
- controller_secondary_disk_size_gb: Размер вторичного диска контроллера
- controller_instance_template: Шаблон экземпляра GCP , используемый для экземпляра контроллера. Любые указанные поля вычислительных ресурсов переопределят свойства шаблона. Например, если указан controller_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: Параметры монтирования (например, defaults, _netdev)
- login_network_storage: Сетевое хранилище для монтирования на узлах входа в систему и контроллера. NFS, CIFS, Lustre и GCSFuse будут установлены автоматически. Можно повторить для дополнительных точек монтирования.
- server_ip: IP-адрес сервера хранения
- remote_mount: Имя монтирования хранилища (имя файловой системы)
- local_mount: Локальный каталог монтирования
- fs_type: Тип файловой системы (NFS, CIFS, Lustre, GCSFuse устанавливаются автоматически)
- mount_options: Параметры монтирования (например, defaults, _netdev)
- compute_node_service_account: Учетная запись службы , которая будет использоваться на вычислительном(ых) экземпляре(ах)
- compute_node_scopes: Область доступа вычислительных экземпляров
- Разделы: Конфигурация разделов Slurm. Может быть повторена для дополнительных разделов.
- имя: Название раздела
- machine_type: Тип экземпляра вычислительного узла(ов)
- static_node_count: Количество постоянно работающих вычислительных узлов
- max_node_count: Максимально допустимое количество вычислительных узлов — 64K.
- Зона: зона Google Cloud, которая будет содержать ресурсы этого раздела — Подробнее
- изображение: Тип вычислительного узла машины
- image_hyperthreads: Включить или выключить технологию Hyper-Threading для экземпляра
- 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: Если regional_capacity равно 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
Вам будет предложено принять описанные действия в соответствии с заданными настройками. Введите « yes », чтобы начать развертывание. Вы также можете просмотреть конфигурацию для развертывания, выполнив команду «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 > Экземпляры виртуальных машин.

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

В разделе «Экземпляры виртуальных машин» просмотрите два экземпляра виртуальных машин, созданных Terraform.
Названия будут отличаться, если вы изменили поле cluster_name .
- g1-контроллер
- g1-login0
5. Войдите в кластер Slurm.
Получите доступ к кластеру Slurm.
Вернитесь во вкладку «Редактор кода/Cloud Shell». Выполните следующую команду для входа в свой экземпляр, заменив <ZONE> зоной узла g1-login0 (должно быть us-central1-b ):
gcloud compute ssh g1-login0 --zone=<ZONE>
Эта команда выполнит вход в виртуальную машину g1-login0 .
Ещё один простой способ получить доступ к узлу авторизации — нажать кнопку «SSH» рядом с виртуальной машиной g1-login0 на странице «Экземпляры виртуальных машин», чтобы открыть новую вкладку с SSH-соединением.

Если вы впервые используете Cloud Shell, вы можете увидеть сообщение, подобное приведенному ниже, с просьбой создать 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>
Как и в предыдущем случае, вам, возможно, придётся подождать минуту-две, прежде чем вы сможете подключиться и все этапы настройки будут завершены.
Обзор инструментов командной строки 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 приведен ниже. Команда 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. Давайте запустим простой скрипт `sbatch`, который выполнит команду `hostname` на наших автоматически масштабируемых виртуальных машинах.
Войдя в систему g1-login0, выполните следующую команду:
sbatch -N2 --wrap="srun hostname"
Эта команда запускает пакетную команду Slurm. Она указывает, что sbatch запустит команду на двух узлах с опцией "-N". Также она указывает, что на каждом из этих узлов будет выполнена команда "srun hostname" с опцией "–wrap".
По умолчанию sbatch записывает свои выходные данные в файл "slurm-%j.out" в рабочем каталоге, из которого запускается команда, где %j заменяет идентификатор задания в соответствии с шаблонами имен файлов Slurm . В нашем примере sbatch запускается из папки /home пользователя, которая представляет собой файловую систему на основе NFS, размещенную по умолчанию на контроллере. Это позволяет вычислительным узлам совместно использовать входные и выходные данные при необходимости. В производственной среде рабочее хранилище должно быть отделено от хранилища /home, чтобы избежать влияния на производительность кластерных операций. Отдельные точки монтирования хранилища можно указать в файле tfvars в параметрах "network_storage".
После выполнения скрипта sbatch с помощью командной строки он вернет идентификатор задания (Job ID) для запланированного задания, например:
Submitted batch job 2
Идентификатор задания (Job ID), возвращаемый командой 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 автоматически создаст вычислительные экземпляры в соответствии с требованиями задания. Автоматический характер этого процесса имеет два преимущества. Во-первых, он исключает работу, обычно необходимую в высокопроизводительном вычислительном кластере, такую как ручное выделение узлов, настройка программного обеспечения, интеграция узла в кластер и последующее развертывание задания. Во-вторых, это позволяет пользователям экономить деньги, поскольку простаивающие, неиспользуемые узлы масштабируются до тех пор, пока не будет запущено минимальное количество узлов.
Вы можете выполнить команду sinfo , чтобы увидеть процесс запуска кластера Slurm:
sinfo
Это отобразит узлы, перечисленные в squeue, в состоянии "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, чтобы просмотреть недавно созданные узлы. Для запуска узлов и Slurm потребуется несколько минут, прежде чем задание будет назначено новым узлам. Вскоре список ваших экземпляров виртуальных машин будет выглядеть примерно так:

Как только узлы начнут выполнять задание, экземпляры перейдут в состояние «распределения», то есть задания будут назначены одному из заданий:
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]
После завершения задания оно больше не будет отображаться в списке squeue, а узлы "alloc" в sinfo вернутся в состояние "idle". Периодически запускайте "squeue", пока задание не завершится, примерно через минуту-две.
Выходной файл slurm-%j.out будет записан в вашу NFS-общедоступную папку /home и будет содержать имена хостов. Откройте или просмотрите содержимое выходного файла (обычно 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
Для компиляции кода MPI на языке C мы будем использовать инструмент "mpicc". Выполните следующую команду:
mpicc mpi_hello_world.c -o mpi_hello_world
Эта команда компилирует наш код на языке C в машинный код, чтобы мы могли запускать этот код в нашем кластере с помощью Slurm.
Далее, используя предпочитаемый вами текстовый редактор, создайте пакетный скрипт sbatch с именем " helloworld_batch ":
vi helloworld_batch
Нажмите клавишу i , чтобы войти в режим вставки vi.
Скопируйте и вставьте следующий текст в файл, чтобы создать простой скрипт sbatch:
#!/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 . Этот выходной файл записывается в каталог, из которого запускается скрипт sbatch. В нашем примере это папка /home пользователя, которая представляет собой общую файловую систему на основе NFS. Это позволяет вычислительным узлам при необходимости совместно использовать входные и выходные данные. В производственной среде рабочее хранилище должно быть отделено от хранилища /home, чтобы избежать влияния на производительность кластерных операций.
Наконец, количество узлов, на которых должен запускаться этот скрипт, определено как 2.
После определения параметров предоставляются исполняемые команды. Этот скрипт будет запускать код mpi_hello_world параллельно, используя команду srun, которая является заменой команды mpirun.
Затем выполните скрипт sbatch, используя командную строку sbatch:
sbatch helloworld_batch
При запуске sbatch будет возвращен идентификатор задания (Job ID) для запланированного задания, например:
Submitted batch job 3
Эта команда выполнит команду hostname на двух узлах, по одной задаче на каждый узел, а также запишет результат в файл 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 и наблюдая, как размер кластера возвращается к нулю:
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, обязательно пройдите практическое занятие " Создание федеративных высокопроизводительных вычислительных кластеров с помощью Slurm ". Это занятие поможет вам настроить два федеративных кластера Slurm в облаке, чтобы показать, как можно создать многокластерную федерацию, как в локальной среде, так и в облаке.
Вы разрабатываете что-то интересное, используя новые функции Slurm, встроенные в GCP? Есть вопросы? Есть предложения по улучшению функционала? Свяжитесь с командой Google Cloud сегодня через веб-сайт Google Cloud High Performance Computing Solutions или пообщайтесь с нами в группе обсуждений Google Cloud и Slurm !
Очистка развертывания Terraform
Выход из системы узла Slurm:
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 и администрирование.
- Затем нажмите на «Настройки» в подменю.
- Нажмите на значок корзины с надписью «Удалить проект».
- Следуйте инструкциям.
Что мы рассмотрели
- Как развернуть Slurm в GCP с помощью Terraform.
- Как запустить задание с помощью Slurm в GCP.
- Как запрашивать информацию о кластере и отслеживать запущенные задания в Slurm.
- Как автоматически масштабировать узлы с помощью Slurm в GCP для учета конкретных параметров и требований задания.
- Как скомпилировать и запустить MPI-приложения в Slurm на GCP.
Найти поддержку Slurm
Если вам нужна поддержка по использованию этих интеграций в тестовой или производственной среде, пожалуйста, свяжитесь напрямую с SchedMD, используя их страницу контактов здесь: https://www.schedmd.com/contact.php
Вы также можете воспользоваться доступными руководствами по устранению неполадок:
- Руководство по устранению неполадок Slurm в GCP: https://github.com/SchedMD/slurm-gcp#troubleshooting
- Руководство по устранению неполадок SchedMD: https://slurm.schedmd.com/troubleshoot.html
Наконец, вы также можете задать свой вопрос в группе обсуждения Google Cloud и Slurm, которую можно найти здесь: https://groups.google.com/g/google-cloud-slurm-discuss
Узнать больше
Обратная связь
Пожалуйста, оставьте отзыв об этом практическом занятии , используя эту ссылку . На заполнение отзыва потребуется менее 5 минут. Спасибо!