Планирование ресурсов графического процессора с помощью Sun Grid Engine (SGE)
У нас есть кластер машин, каждый с 4 графическими процессорами. Каждое задание должно иметь возможность запрашивать 1-4 графических процессора. Вот подвох: я хотел бы, чтобы SGE сообщал каждой работе, какие графические процессоры он должен выполнять. В отличие от процессора, графический процессор работает лучше, если к нему одновременно обращается только один процесс. Поэтому я хотел бы:
Job #1 GPU: 0, 1, 3
Job #2 GPU: 2
Job #4 wait until 1-4 GPUs are avaliable
Проблема, с которой я столкнулся, состоит в том, что SGE позволит мне создать ресурс GPU с 4 модулями на каждом узле, но он не будет явно указывать заданию, какой графический процессор использовать (только то, что он получает 1, 3 или без разницы).
Я думал о создании 4 ресурсов (gpu0, gpu1, gpu2, gpu3
), но я не уверен, что -l
flag будет использовать шаблон glob и не сможет выяснить, как SGE сообщит заданию, какие ресурсы gpu он получил. Есть идеи?
2 ответа
Если у вас есть несколько графических процессоров, и вы хотите, чтобы ваши задания запрашивали графический процессор, но планировщик Grid Engine должен обработать и выбрать свободные графические процессоры, вы можете настроить комплекс RSMAP (карта ресурсов) (вместо INT). Это позволяет вам указать количество, а также имена графических процессоров на конкретном хосте в конфигурации хоста. Вы также можете установить его как расходный материал HOST, чтобы независимо от того, сколько слотов вы запросили, количество устройств с графическим процессором, запрошенных с -l cuda=2, приходилось на каждый хост 2 (даже если параллельное задание получило, например, 8 слотов на разных хостах).).
qconf -mc
#name shortcut type relop requestable consumable default urgency
#----------------------------------------------------------------------------------------------
gpu gpu RSMAP <= YES HOST 0 0
В конфигурации хоста выполнения вы можете инициализировать свои ресурсы с помощью идентификаторов / имен (здесь просто GPU1 и GPU2).
qconf -me yourhost
hostname yourhost
load_scaling NONE
complex_values gpu=2(GPU1 GPU2)
Затем при запросе -l gpu=1 планировщик Univa Grid Engine выберет GPU2, если GPU1 уже используется другим заданием. Вы можете увидеть фактический выбор в выводе qstat -j. Задание получает выбранный графический процессор, считывая переменную среды $SGE_HGR_gpu, которая в этом случае содержит выбранный идентификатор / имя "GPU2". Это может быть использовано для доступа к нужному графическому процессору без коллизий.
Если у вас хост с несколькими сокетами, вы можете даже подключить графический процессор непосредственно к некоторым ядрам процессора рядом с графическим процессором (около шины PCIe), чтобы ускорить обмен данными между графическим процессором и процессорами. Это возможно путем добавления маски топологии в конфигурацию узла выполнения.
qconf -me yourhost
hostname yourhost
load_scaling NONE
complex_values gpu=2(GPU1:SCCCCScccc GPU2:SccccSCCCC)
Теперь, когда планировщик UGE выбирает GPU2, он автоматически связывает задание со всеми 4 ядрами (C) второго сокета (S), чтобы заданию не разрешалось запускаться на первом сокете. Для этого даже не требуется -binding параметр qsub.
Дополнительные примеры конфигурации вы можете найти на http://www.gridengine.eu/.
Обратите внимание, что все эти функции доступны только в Univa Grid Engine (8.1.0/8.1.3 и выше), но не в SGE 6.2u5 и других версиях Grid Engine (таких как OGE, Sun of Grid Engine и т. Д.). Вы можете попробовать это, загрузив 48-ядерную ограниченную бесплатную версию с univa.com.
Если вы используете один из других вариантов механизма сетки, вы можете попробовать адаптировать скрипты, которые мы используем в нашем кластере: https://github.com/UCL/Grid-Engine-Prolog-Scripts