Запуск задач на сервере nv.hpc.susu.ru
 
Логотип ЛСМ ЮУрГУ
Южно-Уральский государственный университет (национальный исследовательский университет)
НАУЧНО-ОБРАЗОВАТЕЛЬНЫЙ ЦЕНТР "ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ И КВАНТОВЫЕ ТЕХНОЛОГИИ" ЛАБОРАТОРИЯ СУПЕРКОМПЬЮТЕРНОГО МОДЕЛИРОВАНИЯ
Русский язык
О нас
Наши партнеры
Отделы и сотрудники
История
Информация в СМИ
Эмблема ЛСМ
Экскурсии
Контакты
Вычислительные ресурсы
Суперкомпьютер «Торнадо ЮУрГУ»
Комплекс «Нейрокомпьютер ЮУрГУ»
Кластер «СКИФ Урал»
Пользователям
Правила
Регистрация
Прикладное ПО
Системное ПО
Обучение
Инструкции
Инструкции Outlook и SharePoint
Система ПВК
Программное обеспечение
Правила
Инструкции ПВК
Коммерческим клиентам
Научная работа
Цели ЛСМ
Проекты
     
Google

www по сайту
Главная / Пользователям / Инструкции / Запуск задач на сервере nv.hpc.susu.ru
Основные правила выполнения расчетов
  • Все вычислительные задачи должны выполняться только на вычислительных узлах.

  • Все задачи пользователей выполняются через систему управления заданиями Slurm.

Как выполнять расчеты?

При подключении к nv.hpc.susu.ru вы подключаетесь к  «логин-серверу», а не к вычислительным узлам.
Логин-сервер является общим ресурсом, на который имеют доступ все пользователи. С данного сервера пользователи запускают задачи, просматривают статус очереди, управляют своими файлами.
Для непосредственного выполнения расчетов необходимо использовать систему управления заданиями Slurm через скрипты и команды, описанные далее. Они сообщают комплексу какие ресурсы ей нужны и как долго она будет выполняться. Slurm автоматически запустит задачу на сервере или поставит её в очередь, если запрошенные ресурсы сейчас недоступны.

Базовые команды, необходимые для работы с очередью задач

sbatch — позволяет запустить задачу в  «пакетном» режиме   возможностью полной подготовки окружения и т.п.), приоритетный способ.
srun — позволяет выполнить задачу в интерактивном режиме, обычно используется для отладки.
squeue — отобразить все задачи в очереди.
scancel <job_id> — прекратить выполнение своей задачи с указанным id.

Создание задачи

Задача состоит из двух частей: запрос ресурсов и шагов выполнения. В запросе ресурсов указывается необходимое количество процессорных ядер и графических ускорителей, ожидаемое время выполнения, объём памяти и дискового пространства и т.д. Шаги выполнения описывают задачи  (tasks) и программы, которые необходимо выполнить. 
Задачи могут быть запущены в  «пакетном» режиме  (sbatch) с возможностью подготовки окружения и загрузки необходимых модулей, а также в  «интерактивном» режиме  (srun), с выводом результатов расчётов на экран.
Задачи в очереди запускаются на расчет согласно приоритетам. В некоторых случаях, даже при наличии свободных ресурсов, задача не сможет их занять, если есть более приоритетная задача, которая ждет дополнительных ядер. Одним из способов повысить приоритет своей задачи является уменьшение максимально возможного времени её выполнения при помощи опции --time.

Хранение расчетов

Хранение производится на хранилище Panasas ActiveStor 8 с установленными для пользователя квотами 

Запуск задачи в пакетном режиме с помощью sbatch

Удобство работы в slurm раскрывается при использовании пакетного режима выполнения задач. Для его работы необходимо подготовить скрипт-файл, в котором запрашиваются различные ресурсы, подготавливается окружение и затем выполняются необходимые программы. Во время работы задачи вывод и ошибки сохраняются на диск для дальнейшей обработки. Любая задача может быть запущена в пакетном режиме, если она не требует отклика от пользователя во время работы. 

Общий синтаксис запуска следующий:

sbatch [опции] script_name.sbatch или sbatch [опции] --wrap=  «команда запуска»

В качестве <script_name> должен выступать скрипт-файл, в котором описываются требуемые ресурсы и шаги выполнения задачи. Общий синтаксис скрипта для передачи в sbatch выглядит следующим образом:

#!/bin/bash

#SBATCH <ключ sbatch> <значение>

#SBATCH <ключ sbatch> <значение>
 

<пользовательские команды>

<пользовательские команды>

Опции для sbatch могут быть переданы как в командной строке при вызове команды, так и в самом скрипте  (#SBATCH …).

Шаблон скрипт-файла для sbatch, рекомендуемый для использования:

#!/bin/bash

#SBATCH --job-name={task}           # Название задачи

#SBATCH --error={task}-%j.err       # Файл для вывода ошибок

#SBATCH --output={task}-%j.log      # Файл для вывода результатов

#SBATCH --time={12:00:00}           # Максимальное время выполнения

#SBATCH --nodes={1}                 # Требуемое кол-во узлов   нашем случае всегда 1)

#SBATCH --gres=gpu:2{2}                  # Требуемое кол-во GPU

#SBATCH --cpus-per-task={2}         # Требуемое кол-во CPU

 

module load {modules}               # Загрузка модуля

srun {options} {command}            # Выполнение расчёта

Не забывайте менять параметры, указанные в {фигурных скобках} на свои.

Например, для запуска python-расчета на 4 CPU и 2 GPU, требующего подготовки окружения, необходимо написать следующий скрипт:#!/bin/bash

#SBATCH --job-name=my_numpy_task          # Название задачи 

#SBATCH --error=my_numpy_task-%j.err       # Файл для вывода ошибок 

#SBATCH --output=my_numpy_task-%j.log      # Файл для вывода результатов 

#SBATCH --time=1:30:00                     # Максимальное время выполнения

#SBATCH --cpus-per-task=4                  # Количество CPU на одну задачу

#SBATCH --gres=gpu:2             # Требуемое кол-во GPU

module load anaconda/2020.07       # Загрузка модуля Anaconda

srun python my_numpy_task.py               # Выполнение расчёта

Результат работы программы будет выведен в файл my_numpy_task.out.

Если для выполнения задачи не требуется каких-то подготовительных действий, скрипт можно не писать, а выполняемую команду  «обернуть» через опцию» --wrap», например:

~$ sbatch -c 2 --gres=gpu:2 1 --wrap=»/home/testuser/my_program arg1 arg2»

Запуск задачи в интерактивном режиме с помощью srun

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

Приоритет задач

Очередь заданий строится на основе приоритетов – чем выше приоритет задачи, тем ближе она к началу очереди. Задача, стоящая в самом начале очереди, резервирует для себя требуемые системные ресурсы по мере их освобождения. То есть, даже если есть свободные вычислительные узлы, их нельзя занять, если есть более приоритетная задача, которая ждёт дополнительных ресурсов.
  Из этого правила есть исключение – если выполнение задачи X с меньшим приоритетом не повлияет на время запуска задачи Y с большим приоритетом, то задача X может быть запущена перед Y. Такой метод планирования поддерживается благодаря плагину backfill scheduling. Одним из способов повысить приоритет своей задачи является уменьшение максимально возможного времени её выполнения с помощью опций --time и --deadline.

Основные опции sbatch, srun

-n <число>   (он же --ntasks=<число>) — число запускаемых процессов;
 -c <число>   (он же --cpus-per-task=<число>) — количество CPU-ядер на каждый процесс;
 -G <число>  (он же --gpus=<число>) — количество GPU; #Не работает для выделения GPU необхдоимо указывать --gres=gpu:2
 -N <число>  (он же --nodes=<число>) — минимальное количество узлов, выделяемых для задачи;
 --ntasks-per-node=<число> — количество процессов на каждый узел  (например,» -n 4 --ntasks-per-node=2» — значит, нужно 2 узла для выполнения этих 4 процессов);
 --gpus-per-task=<число> — количество GPU на каждый запускаемый процесс; #Не работает для выделения GPU необхдоимо указывать --gres=gpu:2
 --gpus-per-node=<число> — количество GPU на каждый выделяемый узел; #Не работает для выделения GPU необхдоимо указывать --gres=gpu:2
 --cpus-per-gpu=<число> — количество CPU на каждую выделяемую GPU;

--time=<число> — необходимое время выполнения задачи   минутах), может быть задано форматами:
 [минуты | минуты:секунды | часы:минуты:секунды | дни-часы | дни-часы:минуты | дни-часы:минуты:секунды]
 По умолчанию, максимальное время выполнения задачи ограничено 1 часом. Если задача требует больше времени, то необходимо в скрипт-файле использовать параметр --time
  --partition=<название очереди>: очередь, в которую будет поставлена задача  (по умолчанию  «work»);
 --job-name=<название задачи>: название задачи в очереди;
 --deadline=<время выполнения>: ограничение по времени выполнения, после которого задача будет принудительно завершена;
 --output=<название файла>: файл, куда будет записываться вывод в процессе выполнения задачи;
 --wrap=<строка запуска>: строка запуска задачи.

 * Подробная информация по использованию планировщика Slurm доступна на официальном сайте.

Примеры скрипт-файлов sbatch

1. Запуск простой задачи с помощью sbatch с подготовкой скрипт-файла: sbatch myscript.sh где содержимое myscript.sh это:

 #!/bin/bash
 #SBATCH --job-name=myjob        # Название задачи в очереди
 #SBATCH --time=5-0:0             # Максимальное время выполнения  (5 дней)
 #SBATCH --output=myjob.slurm.log   # Вывод результата в myjob.slurm.log
 #SBATCH --cpus-per-task=8        # Выполнение расчёта на 8 ядрах CPU
 
 /home/testuser/simple_program      # Запуск ПО

2. Запуск простой задачи с помощью sbatch с указанием запрашиваемых ресурсов  (эквивалент предыдущему):

~$ sbatch --job-name=myjob --time=5-0:0 --output=myjob.%j.log --wrap=»/home/testuser/simple_program»

3. Запуск консоли bash с доступом к 1 GPU и 4 CPU:

~$ srun --pty -1 --ntasks 4 --gres=gpu:2 bash

4. Запуск задачи на 8 ядрах на одном узле:

~$ sbatch --cpus-per-task=8 one_node_program
 5. Запуск обучения нейронной сети на 2 GPU и 16 CPU:

 #!/bin/bash
 #SBATCH --job-name=net_training
 #SBATCH --error=stderr.%j.txt
 #SBATCH --output=stdout.%j.txt
 #SBATCH --partition=normal
 #SBATCH --gres=gpu:2
 #SBATCH --cpus-per-task 16
 
 # Активация окружения Anaconda
 Перед активацией окружения рекомендуется деактивировать текущее
 
source deactivate
 source activate pytorch
 
 echo  «Working on node `hostname`»
 echo  «Assigned GPUs: $CUDA_VISIBLE_DEVICES»
 cd /home/testuser/pytorch
 export NGPUS=2
 python -m torch.distributed.launch --nproc_per_node=$NGPUS /home/testuser/pytorch/train_net.py --config-file  «configs/network_X_101_32x8d_FPN_1x.yaml»

Примечание для расчетов на python с выводом в терминал

Важное примечание для расчетов на python, результаты которых отображаются в выводе!
 По умолчанию python использует буферизованный вывод  .е. вывод НЕ мгновенно передается в результирующий файл).
 Например, в случае такого кода:

from time import sleep

print  ('Start')

for i in range  (60):

   sleep  (1)

print  ('Done')

Начальный вывод  «Start» появится в файле вывода  (slurm-.out) только спустя 60 итераций  (одновременно с  «Done»).
 Для задач, результаты которых оцениваются в процессе выполнения  (выводятся промежуточные значения и т.п.), это не подходит  (например, в случае, когда задача завершится по таймауту, вывода в файле не будет).
 Для мгновенного отображения результатов предлагается 2 варианта:

  1. Добавлять аргумент flush=True в функцию print:  «print  ('Start', flush=True)»  (это работает только при версии python >= v3.3)
  2. Добавить аргумент -u при запуске задачи к самому интерпретатору: например,  «python3 -u myprog.py»  (изменения в коде в данном случае не понадобится)