Domanda

di lavoro su quello che potrebbe essere spesso chiamato progetti "supporto di dati", sono stato in grado di parallelizzare il mio codice (per lo più per la modellazione e la previsione in Python) su un unico sistema attraverso ovunque da 4 a 32 core. Ora sto guardando scaling fino a cluster su EC2 (probabilmente con Starcluster / IPython, ma aperto ad altri suggerimenti pure), e sono stato perplesso da come conciliare la distribuzione di lavoro su core su un istanze esempio contro in un cluster.

E 'anche pratico per parallelizzare tra le istanze così come attraverso core su ogni istanza? Se è così, qualcuno può dare un breve riassunto dei pro + contro di esecuzione molti casi con pochi nuclei ogni vs. alcuni casi con molti core? C'è una regola generale per la scelta del giusto rapporto di istanze di core per esempio?

larghezza di banda e la RAM sono preoccupazioni non banali nei miei progetti, ma è facile da individuare quando questi sono i colli di bottiglia e regolare. E 'molto più difficile, mi immagino, al punto di riferimento il giusto mix di core per casi senza prove ripetute, ed i miei progetti variano troppo per qualsiasi singolo test da applicare a tutte le circostanze. Grazie in anticipo, e se ho appena riuscito a google questo correttamente, sentitevi liberi di indicare la risposta giusta da qualche altra parte!

È stato utile?

Soluzione

Quando si utilizza IPython, è quasi non c'è bisogno di preoccuparsi di esso (a scapito di qualche perdita di efficienza / sovraccarico maggiore comunicazione). Il plugin IPython parallelo Starcluster per difetto avviare un motore per core fisico su ogni nodo (I che questo sia configurabile ma non so dove). Basta eseguire quello che vuoi in tutti i motori utilizzando l'API DirectView (map_sync, apply_sync, ...) oppure i comandi magici% px. Se si sta già utilizzando IPython in parallelo su una macchina, di utilizzarlo su un cluster non è diverso.

Affrontare alcune delle vostre domande specifiche:

"come conciliare la distribuzione di lavoro su core su un istanze esempio contro su un cluster" - Si ottiene un motore per core (almeno); il lavoro viene distribuito automaticamente su tutti i core e tra tutte le istanze.

"E 'anche pratico per parallelizzare tra le istanze così come attraverso core su ogni istanza?" - Sì :) Se il codice si esegue è imbarazzante parallelo (esattamente lo stesso algo su più set di dati) allora si può ignorare la maggior parte in cui un particolare motore è in funzione. Se il nucleo richiede molta comunicazione tra i motori, allora naturalmente è necessario strutturare in modo che i motori comunicare principalmente con altri motori sulla stessa macchina fisica; ma questo tipo di problema non è l'ideale per IPython, credo.

"Se è così, qualcuno può dare un breve riassunto dei pro + contro di esecuzione molti casi con poche core ciascuno vs. pochi casi con molti core? C'è una regola empirica per la scelta del giusto rapporto di istanze di nuclei per esempio?" - Utilizzare i maggiori casi C3 per compute-bound, e il più piccolo per i problemi di memoria larghezza di banda-bound; per problemi di message-passing-bound, utilizzare anche le più grandi casi, ma cercare di partizionare il problema in modo che ogni corre partizione su una macchina fisica e la maggior parte il messaggio che passa è all'interno della stessa partizione. I problemi che avrebbe eseguito notevolmente più lento su istanze quadrupla C3 N che su 2N doppie c3 sono rari (un esempio artificiale può essere in esecuzione più filtri semplici su un gran numero di immagini, in cui si passa attraverso tutte le immagini per ogni filtro, piuttosto che tutti i filtri per la stessa immagine). Utilizzando più grandi casi è una buona regola.

Altri suggerimenti

Una regola generale è di non distribuire fino a quando si deve. Di solito è più efficiente avere N server di una certa capacità di 2N server di mezzo tale capacità. Più di accesso ai dati sarà locali, e quindi veloce in memoria rispetto lenta attraverso la rete.

A un certo punto, scaling up una macchina diventa antieconomico perché il costo delle scale di risorse aggiuntive oltre linearmente. Tuttavia, questo punto è ancora incredibilmente alto.

Su Amazon, in particolare, però, l'economia di ogni tipo di istanza può variare molto se si utilizza le istanze sul mercato spot. L'impostazione predefinita prezzi più o meno significa che la stessa quantità di costi delle risorse circa la stessa a prescindere dal tipo di istanza, che può variare molto; grandi casi può essere più conveniente di quelli piccoli, o N piccole istanze possono essere molto più conveniente di una macchina di grandi dimensioni con risorse equivalenti.

Una considerazione massiccia è che il paradigma calcolo può cambiare un bel po 'quando ci si sposta da una macchina a più macchine. I compromessi che la comunicazione ambientale inducono può costringere a, per esempio, di adottare un paradigma di dati parallelo in scala. Ciò significa che una scelta diversa di strumenti e algoritmi. Ad esempio, SGD sembra piuttosto diverso in memoria e in Python che su MapReduce. Quindi, si dovrebbe prendere in considerazione questo prima parallelizzazione.

Si può scegliere di distribuire il lavoro in un cluster, anche se un singolo nodo e paradigmi non distribuiti lavorare per voi, per l'affidabilità. Se un singolo nodo non riesce, si perdono tutti del calcolo; una computazione distribuita può potenzialmente recuperare e completare solo la parte del calcolo che è stato perso.

Tutto sommato uguale (costo, Potenza del CPU, ecc) si può scegliere l'istanza più piccolo che può contenere tutta la mia set di dati in memoria e scalabilità orizzontale. In questo modo

  • è assicurarsi di non indurre latenze inutili a causa di comunicazioni di rete, e
  • si tende a massimizzare la larghezza di banda complessiva di memoria disponibile per i processi.

Supponendo che si sta eseguendo una sorta di convalida incrociata schema per ottimizzare alcuni meta parametro del modello, assegnare ogni core per un valore di prova e scegliere un numero casi come necessario per coprire tutto lo spazio dei parametri nel minor numero di colpi, come si vede in forma.

Se i dati non rientra nella memoria di un unico sistema, naturalmente è necessario per distribuire tra le istanze. Poi si tratta di bilanciare la latenza di memoria (meglio con molti casi) con latenza di rete (meglio con un minor numero di casi), ma data la natura del EC2 scommetterei spesso si preferisce lavorare con pochi casi di grasso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top