Задачи из этой очереди запускаются на одном сервере HPE Apollo 6500 Gen10. С точки зрения планировщика сервер разделён на два виртуальных узла (virtual node, vnode), каждый из которых содержит 188 ГБ ОЗУ, 20 ядер одного процессора и 4 ускорителя NVIDIA Tesla V100, подключенных к этому процессору шиной PCIe.
Планировщик ограничивает доступные задаче ресурсы, используется механизм 'контрольных групп' ядра Linux (control groups, cgroups):
Задачи, поставленные в очередь a6500g10q, перенаправляются планировщиком в соответствии с запрошенным walltime в одну из следующих очередей:
03:00:00
включительно. Задачи, работающие в этой очереди, могут занимать сервер в монопольном режиме (см. 'Пример 2' ниже). Также, при наличии свободных ресурсов, возможен одновременный запуск восьми задач одного пользователя, каждая из которых использует по 1 GPU.03:00:01
до 72:00:00
включительно. Задачи каждого пользователя, работающие в этой очереди, при наличии свободных ресурсов могут занять до половины сервера (4 GPU и 20 процессорных ядер) одновременно.72:00:01
до 240:00:00
включительно. Задачи каждого пользователя, работающие в этой очереди, при наличии свободных ресурсов могут занять не более 1 GPU и 5 процессорных ядер. Задачи всех пользователей в этой очереди суммарно могут использовать только 4 GPU сервера, остальные GPU предназначены для более коротких задач.В отличии от использования очереди '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 ускорителя, как и запрашивала.
Все восемь графических ускорителей сервера соединены друг с другом шиной 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, скомпилированные для работы под SLES12, на этом узле не работают. Узнать список доступных реализаций MPI и выбрать нужную можно только с самого узла a6500g10 - или разместив нужные команды в скрипте для qsub или используя интерактивный режим:
hpcuser@clu:~> qsub -I -q a6500g10q -l select=1:ncpus=1:mem=100m,walltime=0:1:0
hpcuser@a6500g10:~> mpi-selector --list
intel_mpi-5.0.1.035 openmpi2
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 и установить её в свою домашнюю директорию.