Ошибка параллельной обработки KMeans

Я запускаю k-means для большого набора данных. Я настроил это так:

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 используются все процессоры, кроме одного». Я вижу, что во время выполнения km.fit выполняется несколько дополнительных процессов Python, но используется только один ЦП.

Похоже ли это на проблему с GIL? Если да, то есть ли способ заставить работать все процессоры? (Вроде как должно быть... иначе какой смысл в аргументе n_jobs).

Я предполагаю, что упускаю что-то основное, и кто-то может либо подтвердить мой страх, либо вернуть меня в нужное русло; если это на самом деле более сложно, я перейду к настройке рабочего примера.

Обновление 1. Для простоты я переключил n_jobs на положительное значение 2. Вот что происходит с моей системой во время выполнения:

введите здесь описание изображения

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

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

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

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


person zkurtz    schedule 16.10.2014    source источник
comment
Это не проблема GIL, потому что KMeans будет порождать процессы, а не потоки. Сколько данных вы вводите? Хватит ли у вас памяти? Какая версия scikit-learn? Вы пробовали n_jobs=-1 или n_jobs=2 (просто для проверки)?   -  person Fred Foo    schedule 16.10.2014
comment
Смотрите обновление. Данные составляют около 3 гигабайт csv, прочитанных через pandas -> numpy, в то время как оперативная память машины составляет 24 гигабайта; Я не понимаю, в чем проблема с памятью. Текущее обновление использует n_jobs = 2.   -  person zkurtz    schedule 16.10.2014
comment
Версия: scikit-learn==0.14.1   -  person zkurtz    schedule 16.10.2014
comment
Это старая версия. K-means был значительно оптимизирован в версии 0.15.   -  person Fred Foo    schedule 16.10.2014
comment
@larsmans версия обновлена, но все равно не повезло.   -  person zkurtz    schedule 17.10.2014
comment
Насколько велик набор больших данных в вашем случае? Сколько времени это занимает?   -  person Has QUIT--Anony-Mousse    schedule 19.10.2014
comment
Под большим я подразумеваю достаточно большой, чтобы быть уверенным, что время, которое я наблюдаю, занято интересующими меня вычислениями, а не накладными расходами. Я использую около 10 миллионов строк и 20 переменных; это выполняется примерно за 200 секунд.   -  person zkurtz    schedule 20.10.2014


Ответы (1)


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

person Andreas Mueller    schedule 20.03.2015
comment
Исправлено (скоро должно появиться на сайте). - person Andreas Mueller; 20.03.2015
comment
Интересно, я не думал о такой возможности. Это разочаровывает, если это правда, потому что даже в пределах одной инициализации, я ожидаю, что есть много чего для распараллеливания. Существует огромное количество вычислений расстояний между каждым из 500 (в моем случае) начальных центров и всеми остальными точками. - person zkurtz; 20.03.2015
comment
Все это делается через BLAS, и если ваш BLAS многоядерный, они будут распараллелены. - person Andreas Mueller; 23.03.2015