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

Для постановки заданий в очередь используется команда 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 графические карты, две карты на одном вычислительном узле, и одна на другом.