Paramètre scikit-learn n_jobs sur l'utilisation du processeur et la mémoire

11

Dans la plupart des estimateurs sur scikit-learn, il existe un n_jobsparamètre dans fit/ predictmethods pour créer des emplois parallèles à l'aide de joblib. J'ai remarqué que le définir sur -1crée un seul processus Python et maximise les cœurs, ce qui fait que l'utilisation du processeur atteint 2500% en plus. Ceci est très différent de le définir sur un entier positif> 1, ce qui crée plusieurs processus Python à une utilisation de ~ 100%.

Comment le paramétrer affecte-t-il l'utilisation du CPU et du cœur sur un serveur Linux multi-CPU? (par exemple, si n_jobs=8alors 8 CPU sont complètement verrouillés ou les CPU réservent-ils encore des cœurs pour d'autres tâches / processus?)

De plus, je reçois MemoryErroroccasionnellement lors de la définition n_jobs=-1de grands ensembles de données. Cependant, l'utilisation de la mémoire oscille généralement autour de 30 à 40% pour le processus Python unique. Comment les données et la mémoire sont-elles gérées / copiées en fonction de la valeur de n_jobs?

Snympi
la source
1
N'oubliez pas que vous pouvez également le régler sur -2, qui utilisera tous les cœurs disponibles sauf un, laissant votre machine au moins un peu fonctionnelle. Tout à fait correct que les problèmes de mémoire commencent généralement à piquer pour de nombreux cœurs, surtout si les ensembles de données sont volumineux
Ken Syme

Réponses:

4

Je peux imaginer qu'une valeur de -1consomme toutes les ressources disponibles au fur et à mesure qu'elles deviennent disponibles. Selon la fonction dont vous parlez, il semble que les données soient copiées pour chacun des travaux, ce qui peut entraîner des problèmes de mémoire si l'ensemble de données est suffisamment volumineux. Voici un extrait d'informations de la docstring 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`.

Il peut donc être judicieux d'utiliser pre_dispatchpour limiter la consommation de mémoire.

Sinon, pourquoi le définissez-vous -1? Vous devez simplement le définir sur le nombre de cœurs physiques sur votre machine, ou peut-être 2 fois ce nombre, si la tâche peut être multithread.

ÉDITER:

Il semble que la configuration n_jobs=-1ne sélectionne en fait que tous les cœurs physiques et maximise leur utilisation. Jetez un œil aux commentaires de cette réponse sur StackOverflow .

Si vous ne l'avez pas réglé pre_dispatch, il essaiera bien sûr de copier beaucoup. C'est pourquoi vous manquez de mémoire. Si vous avez 4 cœurs, il y aura, par défaut, 8 copies du jeu de données (comme décrit ci-dessus dans le devis).

Voici un autre fil , qui regarde plus du côté des performances

n1k31t4
la source
1
nous utilisons donc pre_dispatch pour limiter les copies des données, mais pourquoi mettre à -1 il y a un problème de mémoire?
1
@sweetyBaby - veuillez voir les liens ajoutés. Le réglage n_jobs = -1ne prendra pas en compte la mémoire, seul le nombre de cœurs sur votre CPU, ce qui peut bien sûr entraîner des problèmes de mémoire.
n1k31t4