Sto provando a utilizzare IPython Parallel per uno scenario molto comune, in cui voglio eseguire le simulazioni su un cluster su cui è in esecuzione Sun Grid Engine e non riesco a trovare un modo affidabile per eseguire Questo.Uso di IPython Parallel su Sun Grid Engine
Qui è quello che sto cercando di fare:
voglio eseguire simulazioni numeriche (utilizzando gli array NumPy) con diversi valori dei parametri diversi - i compiti sono ovviamente/'imbarazzante' parallelo. Ho accesso (tramite ssh) al nodo principale del cluster su cui gira Grid Engine. Fino ad ora, stavo eseguendo script di shell con il comando QSUB, ma questo è abbastanza maldestro (gestione dei crash di nodi ecc.) E stavo cercando un modo per tutto questo in Python.
IPython sembra ideale per questo scenario, ma si sta rivelando complicato per il corretto funzionamento dell'installazione. Inizio (diciamo 20) i motori usando IPCLUSTER sul nodo principale, quindi copio i file .json sui miei computer locali da dove mi connetto usando IPython.parallel.Client.
Ho impostato IPClusterStart.controller_launcher_class = 'SGEControllerLauncher'
e IPClusterEngines.engine_launcher_class = 'SGEEngineSetLauncher'
IPCLUSTER sembra funzionare bene; Ottengo questo output dal nodo testa sul terminale ssh:
-- [IPClusterStart] Starting Controller with SGEControllerLauncher
-- [IPClusterStart] Job submitted with job id: '143396'
-- [IPClusterStart] Starting 4 Engines with SGEEngineSetLauncher
-- [IPClusterStart] Job submitted with job id: '143397'
-- [IPClusterStart] Engines appear to have started successfully
Tuttavia, ho questi problemi:
Molto spesso, molti dei motori non riuscirà a registro con il controller anche dopo Vedo il messaggio sopra il quale dice che i motori sono stati avviati con successo. Quando avvii IPCLUSTER con 20 motori, posso vedere 10-15 motori visualizzati nella coda Grid Engine. Non ho idea di cosa succede agli altri motori - non ci sono file di output. Di questi 10-15 motori che iniziano solo alcuni di essi a registrare con il controller e vedo questo sul loro file di output:
... [IPEngineApp] Using existing profile dir: .../.ipython/profile_sge' ... [IPEngineApp] Loading url_file ... .ipython/profile_sge/security/ipcontroller-engine.json' ... [IPEngineApp] Registering with controller at tcp://192.168.87.106:63615 ... [IPEngineApp] Using existing profile dir: .../.ipython/profile_sge' ... [IPEngineApp] Completed registration with id 0
Su altri vedo questo:
... [IPEngineApp] Using existing profile dir: .../.ipython/profile_sge' ... [IPEngineApp] Loading url_file .../.ipython/profile_sge/security/ipcontroller-engine.json' ... [IPEngineApp] Registering with controller at tcp://192.168.87.115:64909 ... [IPEngineApp] Registration timed out after 2.0 seconds
Qualsiasi idea del perché questo accade?
A volte, i motori di avviare e registrare con successo, ma cominciano a morire quando faccio correre qualcosa di molto semplice come
view.execute('%pylab')
e l'unica eccezione torno è questo:[Eccezione Engine] Traceback (più recente call last): File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/IPython/parallel/client/client.py", riga 708, in _handle_stranded_msgs errore di generazione. EngineError ("Motore% r morto durante l'esecuzione dell'attività% r"% (eid, msg_id)) EngineError: Engine 1 morto durante l'esecuzione dell'attività 'b9601e8a-cff5-4037-b9d9-a0b93ca2f256'
Avviare i motori in questo modo significa che occupo i nodi e la coda finché i motori sono in esecuzione, anche se non eseguono nulla. C'è un modo semplice per avviare i motori in modo che vengano generati solo quando vuoi eseguire alcuni script e si chiuderanno una volta che avranno restituito il risultato del loro calcolo?
Il Grid Engine sembra avviare il controller su un nodo diverso ogni volta, quindi il flag --ruse nei file di configurazione di IPCLUSTER non è utile; Devo copiare i file JSON ogni volta che uso IPCLUSTER. c'è un modo per evitarlo?
Sarebbe veramente utile se qualcuno può dare un semplice flusso di lavoro per questo scenario comune: usando IPython parallelo a inviare i lavori, ovviamente, in parallelo a un cluster SGE tramite una connessione SSH. Ci dovrebbe essere un modo per gestire la reinoltrazione dei crash del motore, e sarebbe anche bello se ci fosse un modo per usare le risorse del cluster solo per la durata della simulazione.