Я запускаю k-средство на большом наборе данных. Я установил его следующим образом:Ошибка параллельной обработки KMeans
from sklearn.cluster import KMeans
km = KMeans(n_clusters=500, max_iter = 1, n_init=1,
init = 'random', precompute_distances = 0, n_jobs = -2)
# The following line computes the fit on a matrix "mat"
km.fit(mat)
Моя машина имеет 8 ядер. В документации говорится: «Для n_jobs = -2 все процессоры, кроме одного, используются». Я вижу, что есть несколько дополнительных процессов Python, выполняющихся в то время, как выполняется km.fit
, но используется только один процессор.
Звучит ли это как GIL issue? Если да, есть ли способ заставить все процессоры работать? (Похоже, что должно быть ... в противном случае в чем смысл аргумента n_jobs
).
Я предполагаю, что у меня что-то не хватает, и кто-то может подтвердить мой страх или вернуть меня в нужное русло; если это будет более активно, я перейду к созданию рабочего примера.
Update 1. Для простоты я переключился n_jobs
быть положительным 2. Вот что происходит с моей системой во время исполнения:
На самом деле я не единственный пользователь на машина, но
free | grep Mem | awk '{print $3/$2 * 100.0}'
указывает на то, что 88% ОЗУ бесплатно (запутанным для меня, так как использование оперативной памяти выглядит, по крайней мере 27% на скриншоте выше).
Update 2. Я обновил sklearn
версию 0.15.2, и ничего не изменилось в top
выходе сообщалось выше. Эксперимент с различными значениями n_jobs
аналогичным образом не дает улучшения.
Не проблема GIL, потому что 'KMeans' будет обрабатывать процессы, а не потоки. Сколько данных вы кормили? У вас достаточно памяти? Какая версия scikit-learn? Вы попробовали 'n_jobs = -1' или' n_jobs = 2' (просто для проверки)? –
См. Обновление. Данные о 3 гигабайтах csv читаются через pandas -> numpy, а оперативная память - 24 гигабайта; Я не вижу, как проблема памяти. В текущем обновлении используется 'n_jobs = 2'. – zkurtz
Версия: scikit-learn == 0.14.1 – zkurtz