Sklearn Kmeans с многопроцессорной обработкой - PullRequest
0 голосов
/ 07 декабря 2018

Я не могу понять, как работает n_jobs:

data, labels = sklearn.datasets.make_blobs(n_samples=1000, n_features=416, centers=20)
k_means = sklearn.cluster.KMeans(n_clusters=10, max_iter=3, n_jobs=1).fit(data)

работает менее чем за 1 сек

с n_jobs = 2, он работает почти вдвое больше

с n_jobs = 8 это так долго, что никогда не заканчивалось на моем компьютере ... (у меня 8 ядер)

Есть что-то, чего я не понимаю, как работает распараллеливание?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

n_jobs указывает число параллельных процессов / потоков, которые должны использоваться для распараллеленных подпрограмм

Из документов

В некоторых случаях параллелизма используется многопоточностьбэкэнд по умолчанию, какой-то многопроцессорный бэкэнд.Можно переопределить бэкэнд по умолчанию, используя sklearn.utils.parallel_backend.

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

Снова из документов:

Полезность параллельной обработки для улучшения времени выполнения зависит от многих факторов, и обычно лучше экспериментировать, а не предполагать, что увеличение числа заданийэто всегда хорошо.Выполнение нескольких копий некоторых оценщиков или функций может быть очень вредным для производительности параллельно.

Так что n_jobs не является «серебряной пулей», но нужно экспериментировать, чтобы проверить, работает ли она для их оценщиков.и вид данных.

0 голосов
/ 07 апреля 2019

Вы можете использовать n_jobs=-1, чтобы использовать все свои процессоры, или n_jobs=-2, чтобы использовать все из них, кроме одного.

...