È relativamente semplice.
In base alle ipotesi di semplificazione che si richiede un processo per host, slurm fornirà tutte le informazioni necessarie nelle variabili di ambiente, in particolare SLURM_PROCID, SLURM_NPROCS e SLURM_NODELIST.
Ad esempio, è possibile inizializzare l'indice compito, il numero di attività ed il nodelist come segue:
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']) ]
Nota che slurm ti dà un elenco di host nel suo formato compresso (ad esempio, "myhost [11 -99] "), che è necessario espandere. Lo faccio con il modulo hostlist da Kent Engström, disponibile qui https://pypi.python.org/pypi/python-hostlist
A quel punto, si può andare avanti a destra e creare la vostra specifica cluster di tensorflow e server con le informazioni che avete a disposizione, ad esempio:
cluster = tf.train.ClusterSpec({"your_taskname" : tf_hostlist })
server = tf.train.Server(cluster.as_cluster_def(),
job_name = "your_taskname",
task_index = task_index)
E sei pronto! È ora possibile eseguire il posizionamento del nodo tensorflow su uno specifico host del assegnazione con la sintassi solita:
for idx in range(n_tasks):
with tf.device("/job:your_taskname/task:%d" % idx):
...
Un difetto con il codice sopra riportato è che tutti i lavori saranno istruire tensorflow installare server ascolta a 22222 porta fissa. Se più di tali lavori sono programmati sullo stesso nodo, il secondo non riuscirà ad ascoltare 22222.
Una soluzione migliore è di lasciare porte di riserva slurm per ogni lavoro. Devi portare a bordo l'amministratore di slurm e chiedergli di configurare lo slurm in modo che ti permetta di chiedere porte con l'opzione --resv-ports. In pratica, questo richiede chiedendo loro di aggiungere una linea come la seguente nella loro slurm.conf:
MpiParams=ports=15000-19999
Prima di bug vostro amministratore slurm, controllare ciò che le opzioni sono già configurati, ad esempio, con:
scontrol show config | grep MpiParams
Se il tuo sito utilizza già una versione precedente di OpenMPI, è possibile che un'opzione come questa sia già disponibile.
Poi, modificare il mio primo frammento di codice come segue:
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']) ]
Buona fortuna!
Le informazioni sul [sito di integrazione continua] (http://ci.tensorflow.org/) potrebbe essere di aiuto. Vedi anche [readme] (https://tensorflow.googlesource.com/tensorflow/+/master/tensorflow/tools/ci_build/README.md) –
Ho eseguito una query di Google su Slurm e Docker e c'erano più risultati. –
Hai trovato fonti specifiche? Se sì, condividili per favore. Ovviamente Google elenca alcune pagine ma non sono riuscito a trovare suggerimenti, tutorial o informazioni ufficiali sull'esecuzione di TensorFlow con la sua API Python tramite un lavoro Slurm. – daniel451