Планировщик IBM Spectrum LSF

Очередью заданий на системе IBM Polus, установленной на факультете ВМК МГУ, управляет планировщик IBM Spectrum LSF.

Постановка заданий в очередь

Для постановки заданий в очередь используется команда bsub.

Формат команды:

       bsub [options] command [arguments] 

Ключ (options) Значение
-n <число процессов> требуемое число ядер
-W <[часы:]минуты> предполагаемое время счета задания в формате [часы:]минуты
-i <имя файла> перенапрвление stdin на заданный файл
-o <имя файла> перенаправление stdout в заданный файл, если файл существует, то произойдет добавление к существующему файлу.
-e <имя файла> перенаправление stderr в заданный файл, если файл существует, то произойдет добавление к существующему файлу.
-oo <имя файла> перенаправление stdout в заданный файл, если файл существует, то он будет перезаписан.
-eo <имя файла> перенаправление stderr в заданный файл, если файл существует, то он будет перезаписан.
-tty перенаправление stdout/stderr на терминал
-q <имя очереди> постановка задания в заданную очередь
-m <имя узла> постановка задания на заданный узел
-J <имя> присвоение заданию заданное имя
-R <строка параметров> запрашивает некоторые дополнительные ресурсы (более подробно см. ниже)
-gpu <строка параметров> указывает, что задание надо запускать на графических картах (более подробно см. ниже)

Комментарии к некоторым ключам (опциям):

-n - число запрашиваемых ядер. Если этот параметр не указан, то по умолчанию он будет равен 1.

-q <имя очереди> - постановка задания в заданную очередь

На данный момент на с/к Polus имеются три очереди: short, normal, fullcluster. По умолчанию задания ставятся в очередь short. Очередь short предназначена для выполнения коротких заданий длительностью не более 30 минут. Очередь normal предназначена для запуска задач длительностью до трех часов. При этом задания, установленные в очередь short, имеет приоритет перед заданиями, установленными в очередь normal. Очереди short и normal доступны всем пользователям. Очередь fullcluster позволяет запускать задачи на всех 5 узлах с/к Polus. Доступ к этой очереди возможен только по предварительной заявке.

-m <имя узла> -- постановка задания на заданный узел

На с/к Polus для запуска вычислительных задач доступны 4 узла: polus-c1-ib, polus-c2-ib, polus-c3-ib, polus-c4-ib. Первые три узла имеют достуную память 256Gb, последний четвертый узел позволяет запускать задачи, требующие памяти до 1 Tb.

Примеры использования:
 bsub -n 8 -W 2:30 -o result.out ./my_program 

Запустить my_program на 8 ядрах на 2 часа 30 минут при этом стандартный вывод перенаправить в файл result.out.

 bsub -n 4 -W 20 -o result.out -eo result.err -m polus-c4-ib -q normal ./my_program 

Запустить my_program на 4 ядрах на 20 минут на узле polus-c4-ib в очереди normal, при этом стандартный вывод перенаправить в файл result.out, а стандартный поток ошибок в файл result.err при этом, если файлы уже существуют, то файл result.out будет дополнен, а файл result.err будет перезаписан.

Запрос ресурсов (-R "строка параметров")

Ключом -R задаются требования по ресурсам. Далее будут рассмотрены наиболее полезные опции. Более подробную информацию смотрите в документации.

Ключ Значение
-R "rusage[mem=SIZE]" Резервирование для задания SIZE Mb памяти.
-R "rusage [ut=U]" Резервирование под задание U*100% загрузки процессора
-R "span[hosts=N]" Требование, чтобы все выделенные под задачу ядра располагались на N вычислительных узлах. В частности, если N=1, то это требование означает размещать все выделенные ядра на одном узле.
-R "span[ptile=N]" Зарезервировать на каждом вычислительном узле до N ядер.

При резервировании ресурса возможно указание длительности его использования (опция duration), а также величину уменьшения зарезервированного ресурса (опция decay).

Примеры использования.
 bsub -R "rusage[mem=500,ut=0.5]" ./my_job  
Резервирование для my_job 500Mb пямяти и 50% загрузки процессора.
 bsub -R "rusage[mem=300:duration=1h]" ./my_job 
На вычислительном узле зарезервировать 300Mb памяти на 1 час
 bsub -R "rusage[ut=0.4:duration=20:decay=1]" ./my_job 
На вычислительном узле зарезервировать 40% загрузки процессора на 20 мин, и линейным образом уменьшать загрузку на протяжении всего указанного периода.
 bsub -n 16 -R "span[hosts=1]" ./my_job 
Запустить my_job на 16 ядрах, так чтобы все они разполагались на одном вычислительном узле.
 bsub -n 6 -R "span[ptile=2]" ./my_job 
Запустить my_job на 6 ядрах, по 2 ядра на вычислительный узел, т.е будут задействованы 3 вычислительных узла, в каждом по 2 ядра.

Работа с графическими картами (-gpu "строка парметров")

Формат команды (указаны не все возможные опции более подробно смотри документацию)
 bsub -gpu "[num=num_gpus] [:mode=shared | exclusive_process] [:j_exclusive=yes | no] [:gmem=mem_value]" 

num = num_gpus - указывает число запрашиваемых графических карт. По умолчанию этот параметр равен 1. Обратите внимание на то, что на c/к Polus на каждом узле только две! карты, поэтому num_gpus может принимать значение только 1 или 2. Если указать значение большее двух, например, три, то это будет означать, что запрашиваются три графические карты на одном узле, поскольку на c/к Polus таких узлов не существует, то такая задача никогда не запустится и будет находиться в режиме PEND. Если тем не менее необходимо запускать задания на более чем двух графических картах, то нужно использовать несколько вычислительных узлов. Как это сделать написано ниже. Еще один важный нюанс число ядер выделяемых задачей на cpu (параметр -n) не должно быть меньше числа графических карт, которое запрашивает задание.

mode=shared | exclusive_process - указывает режим, в котором будет запущена задача, если выбран режим shared, то задача может разделять запрошенные графические карты с другими задачами, в случае режима exclusive_process задача будет запущена в монопольном режиме использования графических карт. По умолчанию стоит режим shared

j_exclusive = yes | no - устанавливает могут ли другие задачи использовать графические карты. Если установлен режим mode=exclusive_process, то j_exclusive=yes автоматически. Если установлен режим mode=shared, а j_exclusive=yes, то ваша задача может порождать процессы, которые будут совместно использовать графические карты, а задачи других пользователей использовать эти карты не смогут. Если режим mode=shared и j_exclusive=no, то возможно совместное использование графических карт задачами различных пользователей. По умолчанию стоит j_exclusive=no.

gmem=mem_value - резервирует необходимый объем графической памяти на каждой карте. Доступно не более 16Gb.

Примеры использования:
 bsub -gpu - ./my_job 
Данная задача будет запущена на 1 графической карте с параметрами используемыми по умолчанию, т.е. данная GPU может быть также использована задачами других пользователей.
 bsub -n 2 -gpu "num=2:mode=exclusive_process" ./my_job 
Данная задача будет запущена на 2 графических картах, используя их в монопольном режиме.
 bsub -n 4 -gpu "num=2:mode=share:j_exclusive=yes" mpiexec ./my_job 
Данная задача запустит четере процесса, которые будут совместно использовать 2 графические карты (два на дной и два на другой), при этом данная карта на весь период работы программы не будет доступна для задач других пользователей.
 bsub -gpu "num=1:mode=exclusive_process:gmem=12G" ./my_job 

Данная задача должна быть запущена на 1 графической карте в монопольном режиме, при этом для нее зарезарвированно 12 Gb памяти на GPU.

Для задач, написанных с использованием MPI+CUDA возможно использование нескольких графических карт с разных вычислительных узлов. Чтобы этого добиться надо запросить количество ядер соответствующее желаемому числу карт и распределить их максимально равномерно между вычислительными узлами, на каждом вычислительном узле запросить графические карты.

Пример:
 bsub -n 3 -R "span[ptile=1]" -gpu "num=1:mode=exclusive_process" mpiexec ./my_job 

В данном случае запросятся 3 графические карты на трех вычислительных узлах, по одной карте на узле.

 bsub -n 6 -R "span[ptile=2]" -gpu "num=2:mode=exclusive_process" mpiexec ./my_job 

В данном случае запросятся 6 графических карт, по две карты с каждого вычислительного узла, то есть задействованны будут три вычислительных узла.

Возможно и неравномерное использование графических карт, например:

 bsub -n 3 -R "span[ptile=2]" -gpu "num=2:mode=exclusive_process" mpiexec ./my_job 

В данном случае должны выделиться 3 графические карты, две карты на одном вычислительном узле, и одна на другом.

Просмотр очереди

Для просмотра очереди заданий используется команда bjobs.

Формат команды:

       bjobs [options] [JOBID] 

Ключ (options) Значение
-a Вывод информации обо все заданиях, включая уже завершившиеся задания.
-w Вывод информации о задании в "wide" формате
-l вывод полной информации о задании
-u <имя пользователя> вывод информации о заданиях заданного пользователя. Используйте all для вывода информации о задачах всех пользователей.
-q <имя очереди> Вывод информации о заданиях поставленных в указанную очередь.
-m <имя узла> Вывод информации о заданиях поставленных на заданный узел
-J < имя задания > Вывод информации о заданиях с заданным именем

Примеры использования.

 bjobs 

Команда bjobs без параметров выведет информацию о ваших текущих задачах поставленных в очередь.

 bjobs -l 3045 

Выведет полную информацию о задаче с JOBID 3045.

 bjobs -u all 

Выведет информацию обо всех задачах (в том числе других пользователей), поставленных в очередь в данный момент.

При использовании команды bjobs выводится список следующего вида:(в данном случае представлен вывод последнего примера)

JOBID   USER                 STAT  QUEUE      SLOTS NALLOC_SLOT JOB_NAME                       SUBMIT_TIME  ESTIMATED_START_TIME TIME_LEFT   PEND_REASON
2895    erofeev              RUN   normal     1     1           */data/adobe/rgba --cuda-dev 0 Sep  4 17:14          -           1:46 L      -
2896    erofeev              RUN   normal     1     1           *s-alphamatting-padded/narrow/ Sep  4 17:14          -           1:46 L      -
2909    zhukov_ka            RUN   normal     20    20          *J.err;mpiexec ./task -n 20000 Sep  6 15:28          -           0:14 L      -
2910    zhukov_ka            RUN   normal     10    10          *J.err;mpiexec ./task -n 10000 Sep  6 15:28          -           0:15 L      -
1598    bagrovnyu            PEND  normal       -   0           ./solve_mpi_cuda 10000 4       Jun 20 18:43          -                -      Job's requirements for resource reservation not satisfied (Resource: ngpus_excl_t): 3 hosts;
Столбцы списка содержат следующую информацию (перечислены не все столбцы):

Заголовок Значение
JOBID Идентификатор задания: номер_задания
USER Идентификатор пользователя, от имени которого запускается задание
STAT Состояние задания (здесь приведены не все возможные значения, более подробно смотрите man bjobs):
  • RUN — задание выполняется в данный момент
  • PEND — задание ожидает запуска,
  • DONE — задание завершилось с нулевым статусом
  • EXIT — задание завершилось с ненулевым статусом
QUEUE Очередь, в которую поставлена задача
SLOTS/NALLOC_SLOT Количество ядер, занятых задачей
JOB_NAME Имя задачи
SUBMIT_TIME Время постановки задачи в очередь
TIME_LEFT Время, оставшееся до окончания задачи

Удаление задач из очереди

Чтобы удалить из очереди задание, ожидающее постановки на счет, или снять со счета уже идущее задание, используется программа bkill. Например, команда

 bkill  1157

удалит из очереди задание с идентификатором 1157 (идентификатор задания показывается в поле JOBID выдачи программы bjobs), а команда

 bkill -u pupkin

снимет все задания пользователя pupkin. В обоих случаях задание будет удалено из очереди только в том случае, если к команде bkill обратился его владелец или привилегированный пользователь.