Планирование ресурсов графического процессора с помощью 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

Другие вопросы по тегам