Выделение графического процессора в SBATCH - PullRequest
1 голос
/ 11 июля 2019

У меня есть доступ к большому кластеру графических процессоров (20+ узлов, 8 графических процессоров на узел), и я хочу запустить задачу несколько раз на n графических процессорах (1 на графический процессор, n> 8) в одном пакетебез резервирования полных узлов с флагом --exclusive.

Мне удалось предварительно выделить ресурсы (см. ниже), но я очень стараюсь запустить задачу несколько раз в рамках задания.В частности, мой журнал не показывает значения для переменной CUDA_VISIBLE_DEVICES.

Я знаю, как выполнить эту операцию на полностью зарезервированных узлах с флагами --nodes и --gres.В этой ситуации я использую --nodes=1 --gres=gpu:1 для каждого srun.Тем не менее, это решение не работает для настоящего вопроса, работа зависает на неопределенное время.

В MWE ниже, у меня есть работа, требующая 16 gpus (--ntasks и --gpus-per-task).Задания состоят из 28 задач, которые запускаются с помощью команды srun.

#!/usr/bin/env bash
#SBATCH --job-name=somename
#SBATCH --partition=gpu
#SBATCH --nodes=1-10
#SBATCH --ntasks=16
#SBATCH --gpus-per-task=1

for i in {1..28}
do
        srun echo $(hostname) $CUDA_VISIBLE_DEVICES &
done

wait

Вывод этого сценария должен выглядеть следующим образом:

nodeA 1
nodeR 2
...

Однако это то, чтоЯ получил:

nodeA
nodeR
...

1 Ответ

0 голосов
/ 26 июля 2019

Когда вы пишете

srun echo $(hostname) $CUDA_VISIBLE_DEVICES &

расширение переменной $CUDA_VISIBLE_DEVICES будет выполняться на главном узле выделения (где выполняется скрипт), а не на узле, на который нацелен srun. Вам следует сбежать от $:

srun echo $(hostname) \$CUDA_VISIBLE_DEVICES &

Кстати, --gpus-per-task= появился в справочной странице sbatch в версии 19.05. Когда вы используете его с более ранней опцией, я не уверен, как оно пойдет.

...