scikit-pelajari parameter n_jobs pada penggunaan CPU & memori

11

Dalam kebanyakan estimator pada scikit-belajar, ada n_jobsparameter dalam fit/ predictmetode untuk menciptakan lapangan kerja paralel menggunakan joblib. Saya perhatikan bahwa pengaturan untuk -1membuat hanya 1 proses Python dan memaksimalkan core, menyebabkan penggunaan CPU mencapai 2500% di atas. Ini sangat berbeda dari pengaturan ke beberapa integer positif> 1, yang menciptakan banyak proses Python pada ~ 100% penggunaan.

Bagaimana pengaturan itu mempengaruhi penggunaan CPU & inti pada server Linux multi-CPU? (misal jika n_jobs=8kemudian apakah 8 CPU sepenuhnya terkunci atau apakah CPU masih menyimpan beberapa core untuk tugas / proses lain?)

Selain itu, saya MemoryErrorkadang-kadang mendapatkan ketika mengatur n_jobs=-1untuk dataset besar. Namun, penggunaan memori biasanya berkisar sekitar 30-40% untuk proses Python tunggal. Bagaimana data & memori dikelola / disalin tergantung pada nilai n_jobs?

Snympi
sumber
1
Ingat juga Anda dapat mengaturnya ke -2, yang akan menggunakan semua kecuali 1 core yang tersedia, meninggalkan mesin Anda setidaknya agak berfungsi. Cukup benar bahwa masalah memori biasanya mulai menggigit banyak core, terutama jika dataset besar
Ken Syme

Jawaban:

4

Saya bisa membayangkan nilai -1menghabiskan semua sumber daya yang tersedia saat dan ketika mereka tersedia. Bergantung pada fungsi yang Anda bicarakan, tampaknya data disalin untuk setiap pekerjaan, yang dapat menyebabkan masalah memori jika dataset cukup besar. Berikut ini cuplikan informasi dari docstring 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`.

Jadi itu mungkin ide yang baik untuk digunakan pre_dispatchuntuk meletakkan batas atas pada konsumsi memori Anda.

Kalau tidak, mengapa Anda mengaturnya -1? Anda hanya perlu mengaturnya ke jumlah inti fisik pada mesin Anda, atau mungkin 2 kali lipat dari jumlah itu, jika tugas tersebut dapat multi-threaded.

EDIT:

Sepertinya pengaturan n_jobs=-1memang hanya memilih semua inti fisik dan memaksimalkan penggunaannya. Lihat komentar dalam jawaban ini di StackOverflow .

Jika Anda belum menyetel pre_dispatch, tentu saja akan mencoba untuk menyalin banyak. Inilah sebabnya mengapa Anda kehabisan memori. Jika Anda memiliki 4 core, secara default akan ada 8 salinan dataset yang dibuat (seperti dijelaskan di atas dalam kutipan).

Berikut ini utas lainnya , yang lebih terlihat pada sisi kinerja

n1k31t4
sumber
1
jadi kami menggunakan pre_dispatch untuk membatasi salinan data, tetapi mengapa diatur ke -1 ada masalah memori?
1
@sweetyBaby - silakan lihat tautan yang ditambahkan. Pengaturan n_jobs = -1tidak akan mempertimbangkan memori Anda, hanya jumlah inti pada CPU Anda, yang tentu saja dapat menyebabkan masalah memori.
n1k31t4