Это относительно просто.
В упрощающих предположениях, что вы запрашиваете один процесс на хост, 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']) ]
Обратите внимание, что Слерма дает вам список хостов в сжатом формате (например, «MyHost [11 -99] "), что вам нужно расширить. Я делаю это с модулем списке_узлов по Кент 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 на конкретном хосте вашего распределения с обычным синтаксисом:
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
Перед вами ошибка вашего Слерма администратора, проверьте, какие параметры уже настроены, например, с:
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']) ]
Удачи!
информацию, выводимую на [месте непрерывной интеграции] (http://ci.tensorflow.org/) может помочь. Также см. [Readme] (https://tensorflow.googlesource.com/tensorflow/+/master/tensorflow/tools/ci_build/README.md) –
Я выполнил запрос Google Slurm и Docker, и было несколько результатов. –
Вы нашли конкретные источники? Если да, поделитесь ими, пожалуйста. Конечно, Google перечисляет некоторые страницы, но я не смог найти никаких советов, руководств или официальной информации о запуске TensorFlow с его Python-API через работу Slurm. – daniel451