parámetro scikit-learn n_jobs sobre uso de CPU y memoria

11

En la mayoría de los estimadores en scikit-learn, hay un n_jobsparámetro en fit/ predictmétodos para crear trabajos paralelos utilizando joblib. Noté que configurarlo -1crea solo 1 proceso de Python y maximiza los núcleos, lo que hace que el uso de la CPU alcance el 2500% en la parte superior. Esto es bastante diferente de establecerlo en algún entero positivo> 1, que crea múltiples procesos de Python con un uso de ~ 100%.

¿Cómo afecta su configuración al uso de CPU y núcleo en un servidor Linux con múltiples CPU? (por ejemplo, si n_jobs=8entonces hay 8 CPU totalmente bloqueadas o las CPU aún reservan algunos núcleos para otras tareas / procesos?)

Además, MemoryErrorocasionalmente me pongo al configurar n_jobs=-1grandes conjuntos de datos. Sin embargo, el uso de memoria generalmente oscila entre el 30 y el 40% para el proceso de Python. ¿Cómo se gestionan / copian los datos y la memoria según el valor de n_jobs?

Snympi
fuente
1
Recuerde también que puede configurarlo en -2, que usará todos menos 1 de los núcleos disponibles, dejando su máquina al menos algo funcional. Todo correcto que los problemas de memoria por lo general comienzan a morder durante muchos núcleos, especialmente si los conjuntos de datos grandes
Ken Syme

Respuestas:

4

Me imagino que un valor de -1consume todos los recursos disponibles cuando estén disponibles. Según la función de la que esté hablando, parece que los datos se copian para cada uno de los trabajos, lo que puede provocar problemas de memoria si el conjunto de datos es lo suficientemente grande. Aquí hay un fragmento de información de la cadena de documentos de 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`.

Por lo tanto, podría ser una buena idea usar pre_dispatchpara poner un límite superior en el consumo de memoria.

De lo contrario, ¿por qué lo está configurando -1? Debe configurarlo en la cantidad de núcleos físicos en su máquina, o tal vez 2 veces ese número, si la tarea puede ser multiproceso.

EDITAR:

Parece que la configuración n_jobs=-1solo selecciona todos los núcleos físicos y maximiza su uso. Eche un vistazo a los comentarios en esta respuesta en StackOverflow .

Si no lo ha configurado pre_dispatch, por supuesto intentará copiar mucho. Por eso te quedas sin memoria. Si tiene 4 núcleos, habrá, de forma predeterminada, 8 copias del conjunto de datos realizado (como se describe anteriormente en la cotización).

Aquí hay otro hilo , que se ve más en el lado del rendimiento

n1k31t4
fuente
1
entonces usamos pre_dispatch para limitar las copias de los datos, pero ¿por qué establecer en -1 hay un problema de memoria?
1
@sweetyBaby: consulte los enlaces agregados. La configuración n_jobs = -1no tendrá en cuenta la memoria, solo la cantidad de núcleos en su CPU, lo que, por supuesto, puede provocar problemas de memoria.
n1k31t4