Запуск TensorFlow на кластере Slurm?

Я мог бы получить доступ к вычислительному кластеру, в частности, к одному node с двумя 12-ядерными процессорами, который работает с Slurm Workload Manager.

Я хотел бы запустить TensorFlow в этой системе, но, к сожалению, я не смог найти никакой информации о том, как это сделать или если это даже возможно. Я новичок в этом, но, насколько я понимаю, мне пришлось бы запустить TensorFlow, создав работу Slurm и не сможет напрямую выполнить python/tensorflow через ssh.

У кого-нибудь есть идея, учебник или какой-либо источник в этой теме?

Ответ 1

Это относительно просто.

В упрощающих предположениях, что вы запрашиваете один процесс на один хост, slurm предоставит вам всю необходимую информацию в переменных среды, в частности, SLURM_PROCID, SLURM_NPROCS и SLURM_NODELIST.

Например, вы можете инициализировать индекс своей задачи, количество задач и нод-лист следующим образом:

from hostlist import expand_hostlist
task_index  = int( os.environ['SLURM_PROCID'] )
n_tasks     = int( os.environ['SLURM_NPROCS'] )
tf_hostlist = [ ("%s:22222" % host) for host in
                expand_hostlist( os.environ['SLURM_NODELIST']) ]  

Обратите внимание, что slurm предоставляет вам список хостов в сжатом формате (например, "myhost [11-99]" ), который вам нужно расширить. Я делаю это с помощью хоста-модуля с помощью  Kent Engström, доступен здесь https://pypi.python.org/pypi/python-hostlist

В этот момент вы можете пойти прямо вперед и создать свою спецификацию и сервер TensorFlow с информацией, доступной вам, например:

cluster = tf.train.ClusterSpec( {"your_taskname" : tf_hostlist } )
server  = tf.train.Server( cluster.as_cluster_def(),
                           job_name   = "your_taskname",
                           task_index = task_index )

И ты настроен! Теперь вы можете выполнить размещение TensorFlow node на определенном хосте вашего распределения с помощью обычного синтаксиса:

for idx in range(n_tasks):
   with tf.device("/job:your_taskname/task:%d" % idx ):
       ...

Недостаток кода, описанного выше, заключается в том, что все ваши задания будут давать указание Tensorflow устанавливать серверы, прослушивающие фиксированный порт 22222. Если несколько таких заданий будут запланированы на один и тот же node, второй не сможет прослушать 22222.

Лучшее решение - разрешить порты резервирования slurm для каждого задания. Вам нужно привести администратора slurm на борт и попросить его настроить slurm, чтобы он мог запрашивать порты с опцией --resv-ports. На практике это требует, чтобы они добавили следующую строку в свой slurm.conf:

MpiParams=ports=15000-19999

Прежде чем удалять администратор slurm, проверьте, какие параметры уже настроены, например:

scontrol show config | grep MpiParams

Если ваш сайт уже использует старую версию OpenMPI, есть шанс, что такой вариант уже существует.

Затем измените мой первый фрагмент кода следующим образом:

from hostlist import expand_hostlist
task_index  = int( os.environ['SLURM_PROCID'] )
n_tasks     = int( os.environ['SLURM_NPROCS'] )
port        = int( os.environ['SLURM_STEP_RESV_PORTS'].split('-')[0] )
tf_hostlist = [ ("%s:%s" % (host,port)) for host in
                expand_hostlist( os.environ['SLURM_NODELIST']) ]  

Удачи!

Ответ 2

Вы можете просто передать пакет script в slurm с помощью команды sbatch, такой как

sbatch --partition=part start.sh

перечисление доступных разделов может быть выполнено с помощью sinfo.

start.sh (возможная конфигурация) :

#!/bin/sh
#SBATCH -N 1      # nodes requested
#SBATCH -n 1      # tasks requested
#SBATCH -c 10      # cores requested
#SBATCH --mem=32000  # memory in Mb
#SBATCH -o outfile  # send stdout to outfile
#SBATCH -e errfile  # send stderr to errfile
python run.py

тогда как run.py содержит script, который вы хотите выполнить с помощью slurm, т.е. кода вашего тензорного потока.

Здесь вы можете посмотреть подробности: https://slurm.schedmd.com/sbatch.html