Улучшение производительности tsne (в данном случае knn inside) с помощью joblib - PullRequest
0 голосов
/ 30 апреля 2019

В описании класса NearestNeighbours написано:

n_jobs: int или None, необязательно (по умолчанию = None) Количество параллельных заданий для поиска соседей. None означает 1, если не в контексте: obj: joblib.parallel_backend. -1 означает использование всех процессоров. См .: термин: Glossary <n_jobs> для более подробной информации.

И если мы проверим тело функции _fit функции [sklearn] TSNE, есть строки (746 - 761):

            if self.verbose:
                print("[t-SNE] Computing {} nearest neighbors...".format(k))

            # Find the nearest neighbors for every point
            knn = NearestNeighbors(algorithm='auto', n_neighbors=k,
                                   metric=self.metric) # here we may place n_jobs=-1 and its will improve speed of the knn.kneighbours call
            t0 = time()
            knn.fit(X)
            duration = time() - t0
            if self.verbose:
                print("[t-SNE] Indexed {} samples in {:.3f}s...".format(
                    n_samples, duration))

            t0 = time()
            distances_nn, neighbors_nn = knn.kneighbors(
                None, n_neighbors=k)

Итак, я проверил и получил улучшение производительности (скорости), просто добавив n_jobs, установленный в -1, к ctor of NearestNeighbouts, но я думаю, что это неправильный способ сделать это, поэтому давайте вернемся к описанию этого класса. Я пытался сделать это:

        with parallel_backend('loky', -1):
            X_embedded = TSNE(n_components=2, n_iter_without_progress=100, learning_rate=100.0, verbose=1,
                              random_state=123).fit_transform(X)

Но это работает на одном процессоре, я также пытался использовать экземпляр 'Parallel' из joblib, но у меня нет улучшения производительности (в отличие от случая, когда я обманул код внутри тела TSNE).

Итак, есть ли какие-либо предложения о том, как я могу использовать joblib, и он будет работать так, как будто я устанавливаю n_jobs = -1 для knn вручную?

...