2015-09-19 8 views
6

Ich möchte sklearn.grid_search.GridSearchCV() auf mehreren Prozessoren parallel verwenden. Dies ist das erste Mal, dass ich das tun werde, aber meine ersten Tests zeigen, dass es zu funktionieren scheint.scikit-learn: allgemeine Frage über Parallel Computing

Ich versuche this Teil der Dokumentation zu verstehen:

n_jobs: int, default 1

Anzahl von Jobs parallel laufen zu lassen.

pre_dispatch: int oder String, optional

Kontrollen die Zahl der Arbeitsplätze, die während parallel Ausführung geschickt bekommen. Das Reduzieren dieser Anzahl kann nützlich sein, um eine Explosion von Speicherverbrauch zu vermeiden, wenn mehr Jobs gesendet werden, als CPUs verarbeiten können. Dieser Parameter kann sein:

Keine, in diesem Fall werden alle Jobs sofort erstellt und generiert. Verwenden Sie dies für leichtgewichtige und schnell laufende Jobs, um zu vermeiden, Verzögerungen aufgrund der On-Demand-Spawning der Jobs Ein int, geben Sie die genaue Anzahl der Jobs, die erzeugt werden eine Zeichenfolge, geben Sie einen Ausdruck als eine Funktion von n_jobs, wie in '2 * n_jobs'

Kann das jemand brechen für mich ab? Ich habe Probleme, den Unterschied zwischen n_jobs und pre_dispatch zu verstehen. Wenn ich n_jobs = 5 und pre-dispatch=2 einstelle, wie unterscheidet sich das von der Einstellung n_jobs=2?

Antwort

0

Source

Wenn n_jobs auf einen Wert eingestellt wurde, höher als eins ist, werden die Daten für jede Parametereinstellung kopiert (und nicht n_jobs mal). Dies geschieht aus Effizienzgründen, wenn einzelne Jobs sehr wenig Zeit benötigen, aber Fehler verursachen können, wenn das Dataset groß ist und nicht genügend Speicher verfügbar ist. Eine Problemumgehung in diesem Fall besteht darin, pre_dispatch festzulegen. Dann wird der Speicher viele Male nur pre_dispatch kopiert. Ein vernünftiger Wert für pre_dispatch ist 2 * n_jobs.

+0

Pflege um zu erarbeiten?Ich verstehe nicht, was passiert, wenn 5 Prozesse 2 Daten "Chunks" teilen müssen? – Fequish

+0

'pre_dispatch' steuert im Wesentlichen die Anzahl der 'Chargen' der gesendeten Aufgaben. – rightskewed

5

Angenommen, Sie tun KNN und müssen zwischen k=[1,2,3,4,5, ... 1000] wählen. Auch wenn Sie n_jobs=2, GridSearchCV, zuerst erstellen 1000 Jobs, jeweils mit einer Wahl Ihrer k, auch 1000 Kopien Ihrer Daten (möglicherweise sprengen Sie Ihren Speicher, wenn Ihre Daten groß ist), dann diese 1000 Aufträge zu 2 CPUs (die meisten Jobs werden natürlich noch ausstehen). GridSearchCV spawnt nicht nur 2 Jobs für 2 CPUs, weil der Prozess, Jobs on-demand zu erstellen, teuer ist. Es erzeugt direkt die gleiche Anzahl von Jobs wie Parameterkombinationen, die Sie haben (1000 in diesem Fall). In diesem Sinne könnte die Formulierung n_jobs irreführend sein. Mit pre_dispatch können Sie nun festlegen, wie viele Jobs Sie spawnen möchten.