Очередь задач a6500g10q
Задачи из этой очереди запускаются на одном сервере HPE Apollo 6500 Gen10. С точки зрения планировщика сервер разделён на два виртуальных узла (virtual node, vnode), каждый из которых содержит 188 ГБ ОЗУ, 20 ядер одного процессора и 4 ускорителя NVIDIA Tesla V100, подключенных к этому процессору шиной PCIe.
Планировщик ограничивает доступные задаче ресурсы, используется механизм 'контрольных групп' ядра Linux (control groups, cgroups):
- При запуске каждой задачи планировщик создаёт для неё на узле контрольную группу с ресурсами, соответствующими запрошенным в 'select', и ограничивающую доступ процессам задачи к физическим ресурсам сервера. В частности, запускаемые задачей приложения будут видеть только графические ускорители, выделенные планировщиком. Работающие процессы не смогут задействовать больше ядер и оперативной памяти, чем было запрошено у планировщика.
Четыре графических ускорителя сервера подключены шиной PCIe Gen3 x16 к одному процессору, ещё четыре ускорителя подключены ко второму процессору. Процессоры взаимодействуют между собой по шине Intel UPI. Взаимодействие между ускорителем и процессором, подключенным к нему по шине PCIe, всегда будет быстрее, чем с другим процессором. Поэтому для обеспечения максимального быстродействия важно, чтобы приложение работало на ядрах того процессора, к которому подключен используемый приложением графический ускоритель. Это обеспечивается разделением сервера на два виртуальных узла, каждый из которых содержит все ядра одного из процессоров и все 4 графических ускорителя, подключенных к этому процессору шиной PCIe. В результате работающие задачи автоматически получают оптимальные сочетания ускорителя и процессора.
Ограничения
Задачи, поставленные в очередь a6500g10q, перенаправляются планировщиком в соответствии с запрошенным walltime в одну из следующих очередей:
- a6500g10_short - для задач с walltime до
03:00:00
включительно. Задачи, работающие в этой очереди, могут занимать сервер в монопольном режиме (см. 'Пример 2' ниже). Также, при наличии свободных ресурсов, возможен одновременный запуск восьми задач одного пользователя, каждая из которых использует по 1 GPU. - a6500g10_middle - для задач с walltime от
03:00:01
до72:00:00
включительно. Задачи каждого пользователя, работающие в этой очереди, при наличии свободных ресурсов могут занять до половины сервера (4 GPU и 20 процессорных ядер) одновременно. - a6500g10_long - для задач с walltime от
72:00:01
до240:00:00
включительно. Задачи каждого пользователя, работающие в этой очереди, при наличии свободных ресурсов могут занять не более 1 GPU и 5 процессорных ядер. Задачи всех пользователей в этой очереди суммарно могут использовать только 4 GPU сервера, остальные GPU предназначены для более коротких задач.
Пример 1
В отличии от использования очереди 'teslaq' задача не должна самостоятельно разбираться, какой именно GPU её выделен и просто может использовать все ускорители, которые увидит. Операционная система спрячет от приложения другие ускорители с помощью механизма cgroups.
Создайте файл submit.sh такого вида, запрашивающий два графических ускорителя и затем отображающий информацию о доступных ускорителях:
#!/bin/sh #PBS -q a6500g10q #PBS -l select=1:ngpus=2:ncpus=1:mem=100m #PBS -l walltime=00:01:00 #PBS -j oe cd $PBS_O_WORKDIR /usr/bin/nvidia-smi -L echo echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES"
После выполнения задачи лог-файл будет содержать примерно следующее:
GPU 0: Tesla V100-SXM2-32GB (UUID: GPU-2adb6278-0a52-f6a7-58b6-a009223f4538) GPU 1: Tesla V100-SXM2-32GB (UUID: GPU-3e9b8125-9b6a-52cf-4ea2-a543d2d761fa) CUDA_VISIBLE_DEVICES=GPU-2adb6278-0a52-f6a7-58b6-a009223f4538,GPU-3e9b8125-9b6a-52cf-4ea2-a543d2d761fa
Т.е. задача видит только 2 ускорителя, как и запрашивала.
Пример 2
Все восемь графических ускорителей сервера соединены друг с другом шиной NVLink 2.0, примерно на порядок более производительной, чем PCIe Gen3 x16. Если используемое ПО умеет распараллеливать работу на несколько ускорителей, наличие высокопроизводительного прямого соединения между ними может существенно ускорить работу.
Поскольку сервер логически разделён на два виртуальных узла, причём с привязкой каждого GPU к определённому CPU, запрос ресурсов вида 'select=1:ngpus=8:…' выполнить невозможно. Вместо этого для получения сервера в монопольном режиме нужно использовать следующий запрос:
#PBS -l select=2:ngpus=4:ncpus=20:mem=188g:mpiprocs=...
Получение всех 8 GPU возможно только при нахождении задачи в очереди a6500g10_short, т.е. максимальная продолжительность задачи может быть ровно 3 часа:
#PBS -l walltime=03:00:00
Текущее состояние
Для удобства наблюдения за состоянием сервера и соответствующими задачами написана утилита, называющаяся так же, как очередь - 'a6500g10q':
user01@clu:~> a6500g10q
Jobs running on the vnode 'a6500g10[0]' (state = free; a6500g10_short): 129485.vm-pbs 02:41:39 a6500g10_short 1:ngpus=4:ncpus=20:mem=188g user01 Jobs running on the vnode 'a6500g10[1]' (state = free; a6500g10_short a6500g10_middle a6500g10_long): 129130.vm-pbs 53:20:27 a6500g10_middle 1:ncpus=5:mpiprocs=5:mem=48g:ngpus=1 user02 129295.vm-pbs 53:47:06 a6500g10_middle 1:ncpus=5:mpiprocs=5:mem=48g:ngpus=1 user02 129312.vm-pbs 27:44:58 a6500g10_middle 1:ngpus=1:ncpus=5:mem=20g user03 129317.vm-pbs 27:44:58 a6500g10_middle 1:ngpus=1:ncpus=1:mem=16g user04 Waiting jobs: 129358.vm-pbs 23:00:00 a6500g10_middle 1:ngpus=1:ncpus=1:mem=16g user04 129376.vm-pbs 20:00:00 a6500g10_middle 1:ngpus=1:ncpus=1:mem=16g user01 129468.vm-pbs 05:50:00 a6500g10_middle 1:ngpus=1:ncpus=1:mem=16g user05 129484.vm-pbs 72:00:00 a6500g10_middle 1:ncpus=5:mpiprocs=5:mem=48g:ngpus=1 user02
Время, отображаемое в выводе утилиты во втором столбце, для ожидающих запуска задач показывает запрошенный walltime, а для работающих - максимальное время, оставшееся до завершения.
Также текущее состояние можно узнать с интерфейсного сервера следующими командами:
qstat|grep a6500g10
pbsnodes a6500g10
В выводе команды 'pbsnodes' в том числе отображаются номера задач, работающих на узле, и занятые в данный момент ресурсы. Например, так:
jobs = 65863.vm-pbs/0, 65863.vm-pbs/1, 65863.vm-pbs/2, 65863.vm-pbs/3, 65863.vm-pbs/4 resources_assigned.mem = 48234496kb resources_assigned.ncpus = 5 resources_assigned.ngpus = 1
Подробную информацию об определённой задаче можно узнать с помощью следущей команды:
qstat -f номер_задачи
Реализации MPI
Версия операционной системы на этом сервере существенно отличается от используемой на остальных узлах кластера. Поэтому многие реализации MPI, скомпилированные для работы под SLES12, на этом узле не работают. Узнать список доступных реализаций MPI и выбрать нужную можно только с самого узла a6500g10 - или разместив нужные команды в скрипте для qsub или используя интерактивный режим:
- Получить доступ на сервер в интерактивном режиме:
hpcuser@clu:~> qsub -I -q a6500g10q -l select=1:ncpus=1:mem=100m,walltime=0:1:0
- Просмотреть список реализаций MPI, настроенных в mpi-selector на этом сервере:
hpcuser@a6500g10:~> mpi-selector --list
intel_mpi-5.0.1.035 openmpi2
- intel_mpi-5.0.1.035 - коммерческая реализация MPI от Intel 2014 года
- openmpi2 - OpenMPI, установленный из официального репозитория операционной системы
- Установить нужную реализацию и отключиться от сервера:
hpcuser@a6500g10:~> mpi-selector --set openmpi2
Defaults already exist; overwrite them? (y/N) y
hpcuser@a6500g10:~> exit
- После этого можно подключиться к серверу ещё раз и проверить:
hpcuser@clu:~> qsub -I -q a6500g10q -l select=1:ncpus=1:mem=100m,walltime=0:1:0
hpcuser@a6500g10:~> mpi-selector --query
default:openmpi2 level:user
hpcuser@a6500g10:~> which mpicc
/usr/lib64/mpi/gcc/openmpi2/bin/mpicc
Также каждый пользователь кластера может самостоятельно скомпилировать нужную ему версию OpenMPI и установить её в свою домашнюю директорию.