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

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

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

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

2 ответа

Решение

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

В соответствии с упрощенными предположениями о том, что вы запрашиваете один процесс для каждого хоста, 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]"), который вам нужно расширить. Я делаю это с помощью списка хостов модулей от Кента Энгстрёма, доступного здесь 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 на определенном хосте вашего размещения с обычным синтаксисом:

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

Недостаток кода, о котором сообщалось выше, заключается в том, что все ваши задания будут инструктировать Tensorflow устанавливать серверы, прослушивающие на фиксированном порту 22222. Если несколько таких заданий будут запланированы на одном и том же узле, второе не сможет прослушать 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']) ]  

Удачи!

Вы можете просто передать пакетный скрипт, чтобы запятнать 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 содержит скрипт, который вы хотите выполнить с slurm, т.е. ваш код тензорного потока.

Вы можете посмотреть детали здесь: https://slurm.schedmd.com/sbatch.html

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