Руководство пользователя вычислительной системы с гибридной архитектурой¶
Регистрация¶
Регистрация пользователей происходит через систему ЦКП 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
", осуществляется аналогично прекращению выполнения любого консольного приложения.