scikit-learn parametro n_jobs su utilizzo e memoria della CPU


11

Nella maggior parte degli stimatori su scikit-learn, c'è un n_jobsparametro in fit/ predictmetodi per creare lavori paralleli usando joblib. Ho notato che impostandolo su -1crea solo 1 processo Python e massimizza i core, facendo sì che l'utilizzo della CPU raggiunga il 2500% in cima. Questo è abbastanza diverso dall'impostarlo su un numero intero positivo> 1, che crea più processi Python con un utilizzo del ~ 100%.

In che modo l'impostazione influisce sull'utilizzo della CPU e del core su un server Linux multi-CPU? (ad es. se n_jobs=8quindi 8 CPU sono completamente bloccate o le CPU riservano ancora alcuni core per altre attività / processi?)

Inoltre, ottengo MemoryErroroccasionalmente quando si imposta n_jobs=-1per set di dati di grandi dimensioni. Tuttavia, l'utilizzo della memoria di solito si aggira intorno al 30-40% per il singolo processo Python. In che modo i dati e la memoria vengono gestiti / copiati in base al valore di n_jobs?


1
Ricorda anche che puoi impostarlo su -2, che utilizzerà tutti tranne 1 dei core disponibili, lasciando la tua macchina almeno un po 'funzionante. Abbastanza corretto che i problemi di memoria di solito iniziano a mordere per molti core, specialmente se i set di dati di grandi dimensioni
Ken Syme,

Risposte:


4

Posso immaginare un valore di -1consuma tutte le risorse disponibili come e quando diventano disponibili. A seconda della funzione di cui si sta parlando, sembra che i dati vengano copiati per ciascuno dei lavori, il che può portare a problemi di memoria se il set di dati è abbastanza grande. Ecco uno snippet di informazioni dal docstring di GridSearchCV :

If `n_jobs` was set to a value higher than one, the data is copied for each
point in the grid (and not `n_jobs` times). This is done for efficiency
reasons if individual jobs take very little time, but may raise errors if
the dataset is large and not enough memory is available.  A workaround in
this case is to set `pre_dispatch`. Then, the memory is copied only
`pre_dispatch` many times. A reasonable value for `pre_dispatch` is `2 *
n_jobs`.

Quindi potrebbe essere una buona idea usare pre_dispatchper porre un limite massimo al consumo di memoria.

Altrimenti, perché lo stai impostando -1? Dovresti semplicemente impostarlo sul numero di core fisici sulla tua macchina, o forse 2 volte quel numero, se l'attività può essere multi-thread.

MODIFICARE:

Sembra che l'impostazione n_jobs=-1semplicemente selezioni tutti i core fisici e ne massimizzi l'utilizzo. Dai un'occhiata ai commenti in questa risposta su StackOverflow .

Se non lo hai impostato pre_dispatch, tenterà ovviamente di copiarlo molto. Questo è il motivo per cui rimani senza memoria. Se si dispone di 4 core, per impostazione predefinita verranno eseguite 8 copie del set di dati (come descritto sopra nel preventivo).

Ecco un altro thread , che guarda più al lato delle prestazioni


1
quindi usiamo pre_dispatch per limitare le copie dei dati, ma perché impostare su -1 c'è un problema di memoria?

1
@sweetyBaby - vedi i link aggiunti. L'impostazione n_jobs = -1non prenderà in considerazione la memoria, ma solo il numero di core sulla CPU, che ovviamente può portare a problemi di memoria.
n1k31t4,
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.