Проект

Общее

Профиль

Руководство пользователя вычислительной системы с гибридной архитектурой

Описание системы

Вычислительная система с гибридной архитектурой состоит из двух вычислительных узлов. Первый из них (proxima1) включает в себя два шестидесятичетырехядерных процессора AMD EPYC 7742 с максимальной частотой 3,4 ГГц, 2 ТБ DDR4 ОЗУ и восемь сопроцессоров NVIDIA A100 GPU 40 ГБ, объединенных сетью NVLink. Второй узел (proxima2) содержит два двадцатичетырехядерных процессора AMD EPYC 7402 с максимальной частотой 3,35 ГГц, 2 ТБ DDR4 ОЗУ, четыре сопроцессора NVIDIA A800 GPU 80 ГБ и два сопроцессора NVIDIA A2 GPU 16 ГБ. Для хранения пользовательских данных доступно дисковое хранилище объемом 28 ТБ, построенное на основе накопителей NVMe. В качестве сети хранения данных используется сеть EDR InfiniBand с пропускной способностью в 100 Гбит/с.

Регистрация

Регистрация пользователей происходит через систему ЦКП http://ckp.ccfebras.ru.

Вход в систему

Для работы с системой пользователь должен иметь свою учетную запись. Регистрация пользователя происходит в соответствии с предыдущей частью руководства. После регистрации пользователь получает свое имя (логин), пароль и домашнюю директорию. Если имя пользователя, например, будет user, то домашняя папка находится в /home/user.

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

Пользователи имеют возможность работать на вычислительной системе с любой машины, находящейся в сети института и интернет. Для входа в систему пользователю необходим адрес сервера (jupiter.febras.net), порт подключения (2020), а также имя и пароль, полученные при регистрации.

Вход с Windows-машины

Работа с системой осуществляется по безопасному протоколу SSH при помощи какого-либо ssh-клиента. Клиент должен поддерживать протокол версии 2. Рекомендуется использовать PuTTY. Эта программа является свободно распространяемой и проста в использовании.

После запуска программы пользователь должен выбрать протокол ssh, в поле «Host Name (or IP address)» указать адрес сервера, а в поле «Port» - номер используемого порта. Нажатие на «Open» приведет к отправке запроса на подключение. В случае успешного подключения к серверу будет предложено ввести имя (логин), а затем и пароль.

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

Работа в ssh-сессии происходит в терминальном (текстовом, консольном) режиме. Необходимо помнить, что консоль Linux, в отличии от Windows, различает регистр вводимых символов, то есть mydoc.txt и mydoc.TXT не одно и то же. После входа на экране отображается консоль командного интерпретатора в формате имя_пользователя@машина текущий_каталог:

[user@proxima1 ~]$

Вход с терминала Linux

В любой дистрибутив ОС Linux входит терминальный ssh-клиент (обычно OpenSSH). Минимальный формат команды для подключения к кластеру таков:

[user@localhost ~]$ ssh -p 2020 jupiter.febras.net -l имя_пользователя

NVIDIA GPU Cloud

В качестве основного источника прикладного программного обеспечения для вычислительной системы используется реестр контейнеров NGC. Просмотреть список доступных пакетов и подробную информацию о каждом из них можно непосредственно на сайте NGC (https://catalog.ngc.nvidia.com/), а также при помощи интерфейса командой строки. Например, для поиска фреймворка TensorFlow необходимо ввести команду:

ngc registry image list --format_type csv |grep TensorFlow

В результате её выполнения будет выведен список контейнеров, в описании которых содержится подстрока “TensorFlow”. При этом каждая строка вывода соответствует отдельному контейнеру, содержащемуся в реестре. Название контейнера содержится во второй колонке каждой строки (в качестве разделителя используется запятая). Третья колонка содержит версию контейнера, используемую по умолчанию. В последней колонке указывается, является ли контейнер доступным для анонимного пользователя (unlocked), либо для его использования необходима регистрация в NGC (locked). По умолчанию в вычислительной системе доступно использование контейнеров первого типа.

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

ngc registry image info nvidia/tensorflow

Локальное программное обеспечение

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

Таблица 1. Локальное программное обеспечение

Пакет Компонент Версия Модуль
GNU Compiler Collection Компилятор C 11.4.0 -
Компилятор C++ 11.4.0 -
Компилятор Fortran 11.4.0 -
NVIDIA CUDA Toolkit - 12.4 -
NVIDIA HPC SDK - 24.3 nvhpc/24.3
Intel oneAPI Toolkit Компилятор C/C++ 2024.1.0 compiler/2024.1.0
Компилятор Fortran 2024.1.0 ifort/2024.1.0
Библиотека MKL 2024.1 mkl/2024.1
Библиотека MPI 2021.12 mpi/2021.12
Advisor 2024.1 advisor/2024.1
VTune 2024.1 vtune/2024.1

Программное обеспечение, для которого в колонке "Модуль" указан прочерк, не требует настройки перед использованием. Остальное программное обеспечение требует предварительной загрузки соответствующего модуля с использованием команды:

user@proxima1:~$ module load имя_модуля

Список всех загруженных модулей может быть получен при помощи команды:

user@proxima1:~$ module list

Все доступные в системе модули можно вывести командой:

user@proxima1:~$ module avail

Запуск заданий

Для запуска расчетов в вычислительной системе используется система диспетчеризации заданий Slurm (https://slurm.schedmd.com/quickstart.html). Она позволяет запускать задания в интерактивном режиме, а также помещать их в очередь для последующего исполнения.

Интерактивный режим работы реализуется при помощи команды “srun”. Ниже представлен пример запуска интерпретатора Python из контейнера “nvidia/tensorflow” версии “22.01-tf1-py3”.

srun --ntasks=1 --gres=gpu:a100:2 --cpus-per-gpu=1 --mem-per-gpu=16G --container-image=nvcr.io\#nvidia/tensorflow:22.01-tf1-py3 python -c 'import tensorflow ; print(tensorflow.__version__)'

Указанная команда предоставляет пользователю 2 GPU NVIDIA A100, каждому из которых дополнительно выделяется по 1 процессорному ядру и 16 ГБ оперативной памяти, после чего запускает исполняемый файл python на указанных ресурсах. Выбор типа используемых сопроцессоров осуществляется путем указания его идентификатора вторым аргументом в опции --gres=gpu:a100:2. Перечень доступных графических ускорителей с их идентификаторами приводится в таблице 2.

Таблица 2. Перечень доступных сопроцессоров

Наименование Объем видеопамяти, ГБ Количество Тип
NVIDIA A100 40 8 a100
NVIDIA A800 80 4 a800
NVIDIA A2 16 2 a2

Используемый контейнер задается при помощи опции “--container-image=nvcr.io\#nvidia/tensorflow:22.01-tf1-py3”. Имя контейнера имеет вид “реестр#имя_контейнера:версия_контейнера”. При использовании в качестве источника контейнеров облака NGC в качестве реестра необходимо указать “nvcr.io”. В отсутствии имени реестра контейнеры будут загружаться из реестра Docker Hub. Подробная инструкция по запуску контейнеров в Slurm доступна по адресу: https://github.com/NVIDIA/pyxis/wiki/Usage.

При необходимости задачи могут быть помещены в очередь заданий, из которой они будут передаваться на исполнение по мере освобождении запрошенных ресурсов. Сделать это можно при помощи команды “sbatch имя_скрипта”. Здесь имени скрипта соответствует имя специальным образом подготовленного скрипта командной оболочки, содержащего опции системы диспетчеризации заданий, описание запрашиваемых ресурсов и последовательность выполняемых в задании команд. Пример такого скрипта, сохраненного в файле “tensorflow.slurm”, представлен в листинге 1.

#!/bin/bash
#SBATCH --mail-user=user@mail.com
#SBATCH --mail-type=ALL
#SBATCH --ntasks=1
#SBATCH --cpus-per-gpu=1
#SBATCH --gres=gpu:a100:2
#SBATCH --mem-per-gpu=16G
#SBATCH --container-image=nvcr.io\#nvidia/tensorflow:22.01-tf1-py3
#SBATCH --time=0-00:15:00
#SBATCH --job-name=tensorflow_job

python -c 'import tensorflow ; print(tensorflow.__version__)'

Листинг 1. Содержимое файла “tensorflow.slurm

В первой строке скрипта указан используемый для его выполнения интерпретатор. Далее следуют опции диспетчера управления заданиями, начинающиеся с подстроки “#SBATCH”. Большинство из них имеют то же назначение, что и опции команды “srun” из приведенного ранее примера. Назначение дополнительных опций, содержащихся в файле “tensorflow.slurm”, представлено в таблице 3. С полным списком опций можно ознакомиться по адресу https://slurm.schedmd.com/sbatch.html. Все остальные строки скрипта, не начинающиеся с символа комментария “#”, являются его полезной нагрузкой. Они содержат команды, выполняющиеся на целевой системе.

Таблица 3. Назначение некоторых опций скрипта описания заданий Slurm

Опция Назначение
--mail-user=user@mail.com Адрес электронной почты пользователя, на который отправляются сообщения при изменении статуса задания
--mail-type=ALL Тип отправляемых сообщений (“ALL” соответствует всем доступным типам)
--time=0-00:15:00 Запрашиваемое время выполнения задания (Д-ЧЧ:ММ:СС)
--job-name=tensorflow_job Имя задания, отображаемое в выводе команд

Для помещения задания, описанного в скрипте “tensorflow.slurm” в очередь на исполнение, необходимо использовать команду “sbatch ./tensorflow.slurm”. Подразумевается, что команда запускается из директории, в которой находится скрипт. В противном случае необходимо передать команде “sbatch” полный путь к соответствующему скрипту. При успешном выполнении команды на консоль будет выведена строка, содержащая номер задания. Получить список всех заданий, помещенных в очередь на исполнение, можно с использованием команды “squeue”.

Вывод всех команд, записанных в скрипте описания задания, сохраняется в директории, из которой вызывалась команда “sbatch” под именем “slurm-номер_задания.out”.

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

Запуск заданий с использованием локальных контейнеров

Запуск заданий с использованием ссылок на контейнеры в удаленных реестрах, как это делалось в разделе 2 настоящего руководства, подразумевает предварительную автоматическую загрузку и конвертацию образов контейнеров. Это приводит к значительным временным издержкам. Поэтому для ускорения работы с контейнерами рекомендуется сохранять их локальные копии. Для этого можно использовать приведенную ниже команду, в которой опция “--container-name=имя-контейнера” задает имя локального контейнера.

srun --ntasks=1 --mem-per-cpu=32G --container-image=nvcr.io\#nvidia/tensorflow:22.01-tf1-py3 --container-name=имя-контенера true

При необходимости можно выполнить модификацию сохраняемого образа. В этом случае вместо указанной выше команды необходимо использовать следующую:
srun --ntasks=1 --mem-per-cpu=32G --container-image=nvcr.io\#nvidia/tensorflow:22.01-tf1-py3 --container-name=имя-контейнера --container-remap-root --container-writable --pty bash

В результате внутри контейнера будет запущена командная оболочка с привилегиями суперпользователя, после выхода из которой все необходимые изменения будут записаны в его локальной копии. Аналогичную процедуру можно произвести и с уже сохраненным образом:
srun --ntasks=1 --mem-per-cpu=32G --container-name=имя-контейнера --container-remap-root --container-writable --pty bash

Имя получившегося контейнера можно использовать вместо ссылки на оригинальный контейнер при запуске заданий:

srun --ntasks=1 --gres=gpu:a100:2 --cpus-per-gpu=1 --mem-per-gpu=16G --container-name=имя-контейнера python -c 'import tensorflow ; print(tensorflow.__version__)'

Аналогичным образом можно указать имя контейнера и при постановке заданий в очередь на исполнение (листинг 2).
#!/bin/bash
#SBATCH --mail-user=user@mail.com
#SBATCH --mail-type=ALL
#SBATCH --ntasks=1
#SBATCH --cpus-per-gpu=1
#SBATCH --gres=gpu:a100:2
#SBATCH --mem-per-gpu=16G
#SBATCH --container-name=имя-контейнера
#SBATCH --time=0-00:15:00
#SBATCH --job-name=tensorflow_job

python -c 'import tensorflow ; print(tensorflow.__version__)'

Листинг 2. Содержимое файла описания задания при использовании локального образа контейнера

Список локальных контейнеров можно получить с использованием команды "enroot list":

user@proxima1:~$ enroot list
pyxis_имя-контейнера

В её выводе у всех локальных контейнеров, сохраненных с использованием команды "srun", будет указан префикс "pyxis_". Указанное имя с префиксом используется для удаления ненужного образа при помощи команды "enroot remove pyxis_имя-контейнера".

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

srun --ntasks=1 --container-name=имя-контейнера --container-save=/путь/к/файлу/контейнера.sqsh true

Для импорта контейнера из файла формата "sqsh" используйте следующую команду:

srun --ntasks=1 --mem-per-cpu=32G --container-image=/путь/к/файлу/контейнера.sqsh --container-name=имя-контейнера true

Запуск задания в локальном окружении

Для запуска задания в локальном окружении (без использования контейнера) необходимо убрать опцию “--container-image” из командной строки или скрипта. При этом остальные опции остаются без изменений.

Мониторинг заданий

Мониторинг заданий, помещенных в очередь на исполнение, выполняется командой "squeue":

user@proxima1:~$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
               480     workq     job3    user2 PD       0:00      1 (Resources)
               481     workq     job4    user1 PD       0:00      1 (Priority)
               471     workq     job2    user2  R 1-00:34:36      1 proxima1
               438     workq     job1    user1  R   13:50:46      1 proxima1

Здесь в колонке "JOBID" приводится идентификатор задания, в колонке "PARTITION" - раздел вычислительной системы, в колонке "NAME" - имя задания, в колонке "USER" - имя пользователя, запустившего задание, в колонке "ST" - статус задания ("R" - задание выполняется, "PD" - задание ожидает начала выполнения), в колонке "TIME" - время выполнения задания, в колонке "NODES" - число узлов, на котором выполняется задание, а в колонке "NODELIST(REASON)" - имена узлов, на которых выполняется задание (в скобках - причина того, что задание не выполняется).

Сузить список выводимых заданий до заданий конкретного пользователя можно при помощи опции "--user":

user@proxima1:~$ squeue --user=user1
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
               481     workq     job4    user1 PD       0:00      1 (Priority)
               438     workq     job1    user1  R   13:50:46      1 proxima1

Команда "squeue" также поддерживает широкие возможность по модификации формата вывода. Например, для просмотра информации по заказанным заданиями ресурсам (числе процессорных ядер на задание и графических ускорителей на узел) используйте опцию "-O jobid,name,username,maxcpus,tres-per-node":

user@proxima1:~$ squeue -O jobid,name,username,maxcpus,tres-per-node
JOBID               NAME                USER                MAX_CPUS            TRES_PER_NODE
595                 job                 user                8                   gres:gpu:a100:8

Для получения подробной информации о задании можно также воспользоваться командой "scontrol", указав в её опциях "show job идентификатор_задания":

user@proxima1:~$ scontrol show job 760 -d
JobId=760 JobName=job
   UserId=user(1004) GroupId=user(1004) MCS_label=N/A
   Priority=4294901356 Nice=0 Account=account_name QOS=normal
   JobState=RUNNING Reason=None Dependency=(null)
   Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
   DerivedExitCode=0:0
   RunTime=00:02:55 TimeLimit=00:15:00 TimeMin=N/A
   SubmitTime=2022-06-15T18:10:28 EligibleTime=2022-06-15T18:10:28
   AccrueTime=2022-06-15T18:10:28
   StartTime=2022-06-15T18:10:38 EndTime=2022-06-15T18:25:38 Deadline=N/A
   SuspendTime=None SecsPreSuspend=0 LastSchedEval=2022-06-15T18:10:38 Scheduler=Backfill
   Partition=workq AllocNode:Sid=proxima1:1138711
   ReqNodeList=(null) ExcNodeList=(null)
   NodeList=proxima1
   BatchHost=proxima1
   NumNodes=1 NumCPUs=2 NumTasks=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
   TRES=cpu=2,mem=1G,node=1,billing=2,gres/gpu=1
   Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
   JOB_GRES=gpu:a100:1
     Nodes=proxima1 CPU_IDs=0-1 Mem=1024 GRES=gpu:a100:1(IDX:0)
   MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
   Features=(null) DelayBoot=00:00:00
   OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null)
   Command=./job.slurm
   WorkDir=/home/user
   StdErr=/home/user/slurm-760.out
   StdIn=/dev/null
   StdOut=/home/user/slurm-760.out
   Power=
   CpusPerTres=gres:gpu:2
   MemPerTres=gres:gpu:1024
   TresPerNode=gres/gpu:a100:1
   MailUser=user@mail.com MailType=INVALID_DEPEND,BEGIN,END,FAIL,REQUEUE,STAGE_OUT

Указанная команда применяется и для получения информации о имеющихся вычислительных ресурсах. Для этого используется опция "show node имя_узла" (при отсутствии имени узла выводится информация по всем доступным узлам):

user@proxima1:~$ scontrol show node
NodeName=proxima1 Arch=x86_64 CoresPerSocket=64
   CPUAlloc=2 CPUEfctv=256 CPUTot=256 CPULoad=0.78
   AvailableFeatures=(null)
   ActiveFeatures=(null)
   Gres=gpu:a100:8(S:0-1)
   NodeAddr=proxima1 NodeHostName=proxima1 Version=23.11.5
   OS=Linux 5.15.0-1047-nvidia #47-Ubuntu SMP Tue Mar 12 21:08:43 UTC 2024
   RealMemory=2064000 AllocMem=51200 FreeMem=120410 Sockets=2 Boards=1
   State=MIXED ThreadsPerCore=2 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=workq
   BootTime=2024-04-12T16:58:35 SlurmdStartTime=2024-04-12T17:00:43
   LastBusyTime=2024-04-18T00:43:13 ResumeAfterTime=None
   CfgTRES=cpu=256,mem=2064000M,billing=256,gres/gpu=8
   AllocTRES=cpu=2,mem=50G,gres/gpu=1
   CapWatts=n/a
   CurrentWatts=0 AveWatts=0
   ExtSensorsJoules=n/a ExtSensorsWatts=0 ExtSensorsTemp=n/a

   NodeName=proxima2 Arch=x86_64 CoresPerSocket=24
   CPUAlloc=0 CPUEfctv=96 CPUTot=96 CPULoad=0.00
   AvailableFeatures=(null)
   ActiveFeatures=(null)
   Gres=gpu:a800:4(S:0-1),gpu:a2:2(S:0-1)
   NodeAddr=proxima2 NodeHostName=proxima2 Version=23.11.5
   OS=Linux 5.15.0-102-generic #112-Ubuntu SMP Tue Mar 5 16:50:32 UTC 2024
   RealMemory=2052000 AllocMem=0 FreeMem=2045570 Sockets=2 Boards=1
   State=IDLE ThreadsPerCore=2 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=workq
   BootTime=2024-04-12T21:20:36 SlurmdStartTime=2024-04-12T21:23:03
   LastBusyTime=2024-04-16T09:41:40 ResumeAfterTime=None
   CfgTRES=cpu=96,mem=2052000M,billing=96,gres/gpu=6
   AllocTRES=
   CapWatts=n/a
   CurrentWatts=0 AveWatts=0
   ExtSensorsJoules=n/a ExtSensorsWatts=0 ExtSensorsTemp=n/a

Приведенный вывод команды показывает, что вычислительная система состоит из двух узлов: "proxima1" и "proxima2". На первом из имеющихся 256 аппаратных потоков, 2 ТБ оперативной памяти и 8 графических ускорителей (CfgTRES=cpu=256,mem=2064000M,billing=256,gres/gpu=8) задействовано 2 аппаратных потока, 50 ГБ оперативной памяти и 1 графический ускоритель (AllocTRES=cpu=2,mem=50G,gres/gpu=1). При этом на втором узле доступны все имеющиеся ресурсы.

Принудительное завершение задания

Для принудительного завершения задания используйте команду "scancel идентификатор_задания":

user@proxima1:~$ scancel 595

Снимаемое задание может как исполняться, так и находится в очереди на выполнение.

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