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