2016-01-16 47 views
12

Potrei accedere a un cluster di elaborazione, in particolare un nodo con due CPU 12-core, che è in esecuzione con Slurm Workload Manager.Esecuzione di TensorFlow su un cluster Slurm?

Mi piacerebbe eseguire TensorFlow su quel sistema ma sfortunatamente non sono riuscito a trovare alcuna informazione su come farlo o se ciò è possibile. Sono nuovo a questo, ma per quanto ho capito, avrei dovuto eseguire TensorFlow creando un lavoro Slurm e non posso eseguire direttamente python/tensorflow tramite ssh.

Qualcuno ha un'idea, tutorial o qualsiasi tipo di fonte su questo argomento?

+1

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) –

+0

Ho eseguito una query di Google su Slurm e Docker e c'erano più risultati. –

+1

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

risposta

19

È 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!

2

Si può semplicemente passare uno script batch per slurm con il comando sbatch come tali

sbatch --partition=part start.sh 

Elencare le partizioni disponibili può essere fatto con sinfo.

start.sh (configurazione possibile) :

#!/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 

mentre run.py contiene lo script che si desidera eseguire con slurm vale a dire il codice tensorflow.

È possibile cercare i dettagli qui: https://slurm.schedmd.com/sbatch.html

Problemi correlati