CPU kullanımı ve belleğinde scikit-learn n_jobs parametresi


12

Scikit-learn hakkındaki çoğu tahmin edicide, paralel işler oluşturmak için / yöntemlerinde bir n_jobsparametre vardır . Sadece 1 Python işlemi oluşturduğunu ve çekirdekleri maksimuma çıkardığını ve CPU kullanımının% 2500'e ulaşmasına neden olduğunu fark ettim . Bu, ~% 100 kullanımda birden fazla Python işlemi oluşturan pozitif 1 tamsayı> 1'e ayarlamaktan oldukça farklıdır.fitpredictjoblib-1

Ayarlama, çoklu CPU Linux sunucusundaki CPU ve çekirdek kullanımını nasıl etkiler? (örneğin n_jobs=8, 8 CPU tamamen kilitliyse veya CPU'lar hala diğer görevler / işlemler için bazı çekirdekler ayırıyor mu?)

Ayrıca, MemoryErrorzaman zaman n_jobs=-1büyük veri kümeleri için ayarlarken olsun . Bununla birlikte, bellek kullanımı tek Python işlemi için genellikle% 30-40 civarında seyreder. Veri ve bellek, değerine bağlı olarak nasıl yönetiliyor / kopyalanıyor n_jobs?


1
Unutmayın, makinenizi en azından biraz çalışır halde bırakarak mevcut çekirdeklerin 1 dışında tümünü kullanacak olan -2'ye ayarlayabilirsiniz. Bellek sorunlarının genellikle birçok çekirdek için ısırmaya başlaması oldukça doğrudur, özellikle de veri kümeleri büyükse
Ken Syme

Yanıtlar:


4

-1Mevcut tüm kaynakları ne zaman kullanılabilir olduklarını ve ne zaman tükettiklerini hayal edebiliyorum . Hangi işlevden bahsettiğinize bağlı olarak, her iş için veri kopyalanmış gibi görünüyor, bu da veri kümesi yeterince büyükse bellek sorunlarına yol açabilir. GridSearchCV öğretisinden bir bilgi pasajı :

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`.

Bu nedenle pre_dispatchbellek tüketiminize bir üst sınır koymak için iyi bir fikir olabilir .

Aksi halde neden ayarlıyorsunuz -1? Görev çok iş parçacıklı olabiliyorsa, makinenizdeki fiziksel çekirdek sayısına veya belki bu sayının 2 katına ayarlamanız gerekir.

DÜZENLE:

Görünüşe göre, ayar n_jobs=-1sadece tüm fiziksel çekirdekleri seçer ve kullanımlarını en üst düzeye çıkarır. StackOverflow'daki bu cevaptaki yorumlara bir göz atın .

Ayarlamadıysanız pre_dispatch, elbette çok kopyalamaya çalışacaktır. Bu yüzden hafızanız bitiyor. 4 çekirdeğiniz varsa, varsayılan olarak, veri kümesinin 8 kopyası olacaktır (yukarıda alıntıda açıklandığı gibi).

İşte performans tarafında daha fazla görünen başka bir iş parçacığı


1
bu nedenle verilerin kopyalarını sınırlamak için pre_dispatch kullanıyoruz, ancak neden -1 olarak ayarlanmış bir bellek sorunu var?

1
@sweetyBaby - lütfen eklenen bağlantılara bakın. Ayar n_jobs = -1sizi hafızayı dikkate almaz, sadece CPU'nuzdaki çekirdek sayısı elbette hafıza sorunlarına yol açabilir.
n1k31t4
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.