2014-10-16 3 views
1

Я запускаю 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. Вот что происходит с моей системой во время исполнения:

enter image description here

На самом деле я не единственный пользователь на машина, но

free | grep Mem | awk '{print $3/$2 * 100.0}' 

указывает на то, что 88% ОЗУ бесплатно (запутанным для меня, так как использование оперативной памяти выглядит, по крайней мере 27% на скриншоте выше).

Update 2. Я обновил sklearn версию 0.15.2, и ничего не изменилось в top выходе сообщалось выше. Эксперимент с различными значениями n_jobs аналогичным образом не дает улучшения.

+1

Не проблема GIL, потому что 'KMeans' будет обрабатывать процессы, а не потоки. Сколько данных вы кормили? У вас достаточно памяти? Какая версия scikit-learn? Вы попробовали 'n_jobs = -1' или' n_jobs = 2' (просто для проверки)? –

+0

См. Обновление. Данные о 3 гигабайтах csv читаются через pandas -> numpy, а оперативная память - 24 гигабайта; Я не вижу, как проблема памяти. В текущем обновлении используется 'n_jobs = 2'. – zkurtz

+0

Версия: scikit-learn == 0.14.1 – zkurtz

ответ

2

Параллелизм для KMeans просто запускает несколько инициализаций параллельно. Когда вы устанавливаете n_init = 1, существует только одна инициализация и нечего распараллеливать. Докшрин для n_jobs кажется неправильным на данный момент. Я не уверен, что там произошло.

+0

Исправлено (должно быть на сайте скоро). –

+0

Интересно, я не думал об этой возможности. Это разочаровывает, если это правда, потому что даже в рамках одной инициализации я ожидаю, что можно многое распараллелить. Существует огромное количество расстояний между каждым из 500 (в моем случае) начальных центров и всех остальных точек. – zkurtz

+0

Все это делается через BLAS, и если ваш BLAS многоядерный, они будут распараллеливаться. –

Смежные вопросы