Lavorare con i cluster HPC


11

Nella mia università, abbiamo un cluster di elaborazione HPC. Uso il cluster per addestrare classificatori e così via. Quindi, di solito, per inviare un lavoro al cluster, (ad esempio script python scikit-learn), devo scrivere uno script Bash che contenga (tra gli altri) un comando simile qsub script.py.

Tuttavia, trovo questo processo molto frustrante. Di solito succede che scrivo lo script Python sul mio laptop e quindi accedo al server e aggiorno il repository SVN, quindi ottengo lì lo stesso script Python. Quindi scrivo quello script Bash o lo modifico, così posso eseguire lo script bash.

Come vedi, questo è davvero frustrante poiché, per ogni piccolo aggiornamento per lo script Python, ho bisogno di fare molti passi per eseguirlo nel cluster di elaborazione. Ovviamente l'attività diventa ancora più complicata quando devo inserire i dati sul server e utilizzare il percorso dei set di dati sul server.

Sono sicuro che molte persone qui utilizzano cluster informatici per i loro compiti di data science. Voglio solo sapere come state riuscendo a mandare i lavori ai cluster?


1
Ah, le gioie della distribuzione ... migliorate dalle gioie dei sistemi distribuiti :)
logc

Risposte:


5

Chiedi all'amministratore della griglia di aggiungere il tuo computer locale come "host di invio" e installa SGE (che supponiamo che tu stia utilizzando, in realtà non lo dici) così puoi farlo qsubdal tuo computer.

O....

Usa emacs, quindi puoi modificarlo sul tuo HPC tramite le funzionalità di connessione ssh "tramp" di emacs e mantenere una shell aperta in un'altra finestra di emacs. Non dici quale editor / sistema operativo ti piace usare. Puoi persino configurare emacs per salvare un file in due posizioni, in modo da poter salvare sul tuo computer locale per l'esecuzione di test e sul file system HPC contemporaneamente per grandi lavori.


4

Esistono molte soluzioni per alleviare l'onere della copia del file da un computer locale ai nodi di elaborazione nei cluster. Un approccio semplice consiste nell'utilizzare un'interfaccia che consente l'accesso multiplo alle macchine nel cluster, come clusterssh (cssh). Consente di digitare comandi su più macchine contemporaneamente tramite una serie di schermate di terminale (ognuna una connessione ssh a una macchina diversa nel cluster).

Poiché il cluster sembra aver qsubimpostato, il problema potrebbe essere piuttosto correlato alla replica dei dati lungo le macchine (oltre alla semplice esecuzione di un comando in ciascun nodo). Quindi, per affrontare questo punto, è possibile scrivere uno scpscript, copiare cose da e verso ciascun nodo del cluster (che è sicuramente meglio indirizzato con SVN), oppure è possibile impostare un NFS. Ciò consentirebbe un accesso semplice e trasparente ai dati e ridurrebbe anche la necessità di replicare i dati non necessari.

Ad esempio, è possibile accedere a un nodo, copiare i dati in tale posizione e semplicemente utilizzare i dati in remoto , tramite la comunicazione di rete. Non sono a conoscenza di come configurare un NFS, ma hai già accesso ad esso (nel caso in cui la tua cartella principale sia la stessa su tutte le macchine a cui accedi). Quindi, gli script e i dati potrebbero essere inviati in un unico posto e successivamente accessibili da altri. Questo è simile all'approccio SVN, tranne per il fatto che è più trasparente / diretto.


4

Il tuo approccio all'utilizzo di un repository della versione di origine è valido e in realtà ti consente anche di lavorare sul cluster e quindi di copiare tutto indietro.

Se ti accorgi di apportare modifiche minori allo script Python sul tuo laptop, quindi di aggiornare la directory SVN sul cluster, perché non lavorare direttamente sul frontend del cluster, apportare tutte le modifiche minori necessarie e, alla fine, impegnarti tutto lì e aggiornare sul tuo laptop?

Tutto ciò di cui hai bisogno è familiarizzare con l'ambiente (SO, editor, ecc.) O installare il tuo ambiente (di solito installo nella mia directory home l'ultima versione di Vim , Tmux , ecc. Con i dotfile appropriati, quindi mi sento a a casa lì.)

Inoltre, è possibile eseguire la versione dei dati e persino i risultati intermedi se le dimensioni lo consentono. I miei repository spesso comprendono codice, dati (versioni originali e pulite), documentazione e fonti cartacee per la pubblicazione (lattice)

Infine, è possibile creare script per l'invio del proprio lavoro per evitare di modificare manualmente gli script. qsubaccetta uno script da stdin e accetta anche tutti i #$commenti come argomenti della riga di comando.


3

Dalla formulazione della tua domanda suppongo che tu abbia una macchina locale e una macchina remota in cui aggiorni due file: uno script Python e uno script Bash. Entrambi i file sono sotto il controllo SVN ed entrambi i computer hanno accesso allo stesso server SVN.

Mi dispiace di non avere alcun consiglio specifico per il tuo sistema di rete, ma lasciami elencare alcuni punti generali che ho trovato importanti per qualsiasi distribuzione.

Mantieni le modifiche di produzione limitate alle modifiche di configurazione . Scrivi che devi "usare il percorso dei set di dati sul server"; mi sembra che tu abbia i percorsi codificati nel tuo script Python. Questa non è una buona idea, proprio perché dovrai cambiare quei percorsi in ogni altra macchina in cui sposti lo script. Se ripristini tali modifiche su SVN, sul tuo computer locale avrai i percorsi remoti, e ancora e ancora ... (E se non ci fossero solo percorsi, ma anche password? Non dovresti avere password di produzione in un SVN server.)

Quindi, conserva percorsi e altre informazioni di installazione in un .inifile e usa ConfigParser per leggerlo, oppure usa un .jsonfile e usa il modulo json . Conserva una copia del file localmente e una in remoto, entrambe nello stesso percorso, entrambe senza controllo SVN, e mantieni il percorso di quel file di configurazione nello script Python (o ottenerlo dalla riga di comando se non riesci a conservare entrambi configurazioni con lo stesso percorso).

Mantieni la configurazione il più piccola possibile . Qualsiasi configurazione è una "parte mobile" della tua applicazione e qualsiasi sistema è più robusto tanto meno ha parti mobili. Un buon indicatore di qualcosa che appartiene alla configurazione è esattamente che devi modificarlo ogni volta che sposti il ​​codice; le cose che non hanno avuto bisogno di essere modificate possono rimanere come costanti nel codice.

Automatizza la tua distribuzione . Puoi farlo tramite uno script Bash sul tuo computer locale; notare che è possibile eseguire qualsiasi comando su una macchina remota attraverso ssh. Per esempio:

svn export yourprojectpath /tmp/exportedproject
tar czf /tmp/yourproject.tgz /tmp/exportedproject
scp /tmp/myproject.tgz youruser@remotemachine:~/dev

## Remote commands are in the right hand side, between ''
ssh youruser@remotemachine 'tar xzf ~/dev/yourproject.tgz'
ssh youruser@remotemachine 'qsub ~/dev/yourproject/script.py'

Perché ciò funzioni, ovviamente è necessario disporre di un accesso senza password , basato su chiavi pubbliche / private, impostato tra la macchina locale e quella remota.

Se hai bisogno di più di questo, puoi pensare di usare Python's Fabric o la cucina di livello superiore .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.