Частичное соответствие выполняется параллельно в sklearn.decomposition.IncrementalPCA? - PullRequest
1 голос
/ 05 апреля 2019

Я следовал Иманол Луенго , отвечаю , чтобы построить частичное совпадение и преобразование для sklearn.decomposition.IncrementalPCA .Но почему-то похоже, что (из htop) он использует все ядра процессора по максимуму.Я не смог найти ни параметра n_jobs, ни чего-либо связанного с многопроцессорностью.Мой вопрос: если это поведение этих функций по умолчанию, как я могу установить количество процессоров и где я могу найти информацию об этом?Если нет, то, очевидно, я делаю что-то не так в предыдущих разделах моего кода.

PS: мне нужно ограничить количество ядер ЦП, поскольку использование всех ядер на сервере вызывает много проблем с другими людьми.

Дополнительная информация и код отладки: Итак, прошло некоторое время, и я все еще не мог выяснить причину такого поведения или как ограничить количество ядер процессора, используемых одновременно.Я решил предоставить пример кода для его тестирования.Обратите внимание, что этот фрагмент кода взят с веб-сайта sklearn .Единственное отличие состоит в увеличении размера набора данных, поэтому можно легко увидеть поведение.

from sklearn.datasets import load_digits
from sklearn.decomposition import IncrementalPCA
import numpy as np

X, _ = load_digits(return_X_y=True)

#Copy-paste and increase the size of the dataset to see the behavior at htop.
for _ in range(8):
    X = np.vstack((X, X))

print(X.shape)

transformer = IncrementalPCA(n_components=7, batch_size=200)
transformer.partial_fit(X[:100, :])
X_transformed = transformer.fit_transform(X)

print(X_transformed.shape)

И вывод:

(460032, 64)
(460032, 7)

Process finished with exit code 0

И htop показывает: htop shows...

1 Ответ

0 голосов
/ 14 мая 2019

Я искал решение этой проблемы в другом посте , и я понял, что это не из-за ошибки реализации scikit-learn, а скорее из-за библиотеки BLAS (в частности, OpenBLAS), используемой numpyбиблиотека, которая используется в функции IncrementalPCA sklearn.OpenBLAS по умолчанию настроен на использование всех доступных потоков.Подробную информацию можно найти здесь .

TL: DR Решил проблему, установив переменные среды BLAS перед импортом numpy или любой библиотеки, которая импортирует numpy с кодом ниже.Подробную информацию можно найти здесь .

import os
os.environ["OMP_NUM_THREADS"] = 1 # export OMP_NUM_THREADS=1
os.environ["OPENBLAS_NUM_THREADS"] = 1 # export OPENBLAS_NUM_THREADS=1
os.environ["MKL_NUM_THREADS"] = 1 # export MKL_NUM_THREADS=1
os.environ["VECLIB_MAXIMUM_THREADS"] = 1 # export VECLIB_MAXIMUM_THREADS=1
os.environ["NUMEXPR_NUM_THREADS"] = 1 # export NUMEXPR_NUM_THREADS=1
...