Проект

Общее

Профиль

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

Регистрация

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

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

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

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

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

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

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

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

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

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

[user@proxima ~]$

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

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

[user@localhost ~]$ ssh proxima.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

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

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

Локальное программное обеспечение
Пакет Компонент Версия Модуль
GNU Compiler Collection Компилятор C 9.3.0 -
Компилятор C++ 9.3.0 -
Компилятор Fortran 9.3.0 -
NVIDIA CUDA Toolkit - 11.4 -
NVIDIA HPC SDK - 22.2 nvhpc/22.2
Intel oneAPI Toolkit Компиляторы C/C++ и Fortran 2022.0.2 compiler/2022.0.2
Библиотека MKL 2022.0.2 mkl/2022.0.2
Библиотека MPI 2021.5.1 mpi/2021.5.1
Advisor 2022.0.0 advisor/2022.0.0
Trace Analyzer and Collector 2021.5.0 itac/2021.5.0
VTune 2022.0.0 vtune/2022.0.0

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

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

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

user@proxima:~$ module list

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

user@proxima:~$ module avail

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

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

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

srun --ntasks=1 --gres=gpu: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, каждому из которых дополнительно выделяется по 1 процессорному ядру и 16 ГБ оперативной памяти, после чего запускает исполняемый файл python на указанных ресурсах. Используемый контейнер задается при помощи опции “--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: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”, представлено в таблице 1. С полным списком опций можно ознакомиться по адресу https://slurm.schedmd.com/sbatch.html. Все остальные строки скрипта, не начинающиеся с символа комментария “#”, являются его полезной нагрузкой. Они содержат команды, выполняющиеся на целевой системе.

Таблица 1. Назначение некоторых опций скрипта описания заданий 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: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: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@proxima:~$ 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@proxima:~$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
               480      a100     job3    user2 PD       0:00      1 (Resources)
               481      a100     job4    user1 PD       0:00      1 (Priority)
               471      a100     job2    user2  R 1-00:34:36      1 proxima
               438      a100     job1    user1  R   13:50:46      1 proxima

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

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

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

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

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

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

user@proxima:~$ scontrol show job 760 -d
JobId=760 JobName=job
   UserId=user(1004) GroupId=user(1004) MCS_label=N/A
   Priority=4294901356 Nice=0 Account=hfic_dvo_ran 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=a100 AllocNode:Sid=proxima:1138711
   ReqNodeList=(null) ExcNodeList=(null)
   NodeList=proxima
   BatchHost=proxima
   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:1
     Nodes=proxima CPU_IDs=0-1 Mem=1024 GRES=gpu: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:1
   MailUser=user@mail.com MailType=INVALID_DEPEND,BEGIN,END,FAIL,REQUEUE,STAGE_OUT

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

user@proxima:~$ scontrol show node
NodeName=proxima Arch=x86_64 CoresPerSocket=64
   CPUAlloc=16 CPUTot=256 CPULoad=9.16
   AvailableFeatures=(null)
   ActiveFeatures=(null)
   Gres=gpu:8(S:0-1)
   NodeAddr=proxima NodeHostName=proxima Version=21.08.5
   OS=Linux 5.4.0-91-generic #102-Ubuntu SMP Fri Nov 5 16:31:28 UTC 2021
   RealMemory=2064070 AllocMem=409600 FreeMem=1355518 Sockets=2 Boards=1
   State=MIXED ThreadsPerCore=2 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=a100
   BootTime=2022-02-04T20:22:38 SlurmdStartTime=2022-02-19T02:51:48
   LastBusyTime=2022-06-05T08:17:54
   CfgTRES=cpu=256,mem=2064070M,billing=256,gres/gpu=8
   AllocTRES=cpu=16,mem=400G,gres/gpu=8
   CapWatts=n/a
   CurrentWatts=0 AveWatts=0
   ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/s

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

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

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

user@proxima:~$ scancel 595

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

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