Очередь задач 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 предназначены для более коротких задач.

В отличии от использования очереди '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
  • Просмотреть список реализаций 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 и установить её в свою домашнюю директорию.