Запуск 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