Включить параллельную обработку в DBSCAN - PullRequest
2 голосов
/ 30 января 2020

Я пытаюсь использовать несколько ядер с DBSCAN от sklearn, но время выполнения, похоже, не меняется при изменении n_jobs = -1 (используйте все процессоры для запуска параллельных заданий, как предлагается в документации) , Чего мне не хватает?

import numpy as np
from sklearn.metrics.pairwise import euclidean_distances
from time import time
from sklearn.cluster import DBSCAN

# generate a symmetric distance matrix
num_training_examples = 10000
num_features = 10
X = np.random.randint(5, size=(num_training_examples, num_features))
D = euclidean_distances(X,X)

# DBSCAN parameters
eps = 0.25
kmedian_thresh = 0.005
min_samples = 5

# case 1: omit n_jobs arg from DBSCAN
start = time()
db = DBSCAN(eps=eps,
            min_samples = min_samples,
            metric='precomputed').fit(D)
end = time()
total_time = end - start
print('DBSCAN took {} seconds for {} training examples without n_jobs arg'\
       .format(total_time,num_training_examples))


# case 2: add n_jobs arg to DBSCAN
n_jobs = -1
start = time()
db = DBSCAN(eps=eps,
            min_samples = min_samples,
            metric='precomputed',
            n_jobs=n_jobs).fit(D)
end = time()
total_time = end - start
print('DBSCAN took {} seconds for {} training examples with n_jobs arg'\
       .format(total_time,num_training_examples,n_jobs))
  • DBSCAN took 0.710000038147 seconds for 10000 training examples without n_jobs arg
  • DBSCAN took 0.707999944687 seconds for 10000 training examples with n_jobs = -1

1 Ответ

1 голос
/ 30 января 2020

Редактировать: не накладные проблемы. Op уже имеет ответ в комментариях, n_jobs не используется, если метри c предварительно вычислено.

Короче говоря, у вас проблемы с накладными расходами.

Вы тренируетесь только с 10000, поэтому оптимальное количество необходимых рабочих мест не может быть много. Сложно подумать: если у вас есть 100 регистров и вы создаете работу для каждого регистра, время, необходимое для создания работы, может быть больше, чем время для обработки регистра, верно? Да, я знаю, что это действительно экстремальный случай, но в небольших масштабах это то, что может случиться с вами.

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

Существует много объяснений переполнения стека, здесь у вас есть одно о потоках.

...