Я запускаю 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
не дает никаких улучшений.
KMeans
будет порождать процессы, а не потоки. Сколько данных вы вводите? Хватит ли у вас памяти? Какая версия scikit-learn? Вы пробовалиn_jobs=-1
илиn_jobs=2
(просто для проверки)? - person Fred Foo   schedule 16.10.2014n_jobs = 2
. - person zkurtz   schedule 16.10.2014