Dalam kebanyakan estimator pada scikit-belajar, ada n_jobs
parameter dalam fit
/ predict
metode untuk menciptakan lapangan kerja paralel menggunakan joblib
. Saya perhatikan bahwa pengaturan untuk -1
membuat 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=8
kemudian apakah 8 CPU sepenuhnya terkunci atau apakah CPU masih menyimpan beberapa core untuk tugas / proses lain?)
Selain itu, saya MemoryError
kadang-kadang mendapatkan ketika mengatur n_jobs=-1
untuk dataset besar. Namun, penggunaan memori biasanya berkisar sekitar 30-40% untuk proses Python tunggal. Bagaimana data & memori dikelola / disalin tergantung pada nilai n_jobs
?
sumber
Jawaban:
Saya bisa membayangkan nilai
-1
menghabiskan 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 :Jadi itu mungkin ide yang baik untuk digunakan
pre_dispatch
untuk 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=-1
memang 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
sumber
n_jobs = -1
tidak akan mempertimbangkan memori Anda, hanya jumlah inti pada CPU Anda, yang tentu saja dapat menyebabkan masalah memori.