Я следовал за отвечатьИманол Луенго, чтобы построить частичную подгонку и преобразование для 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
Я искал обходной путь для этой проблемы в моем другой пост, и я понял, что это не из-за ошибки реализации scikit-learn, а скорее из-за библиотеки BLAS (в частности, OpenBLAS), используемой библиотекой numpy, которая используется в sklearn Функция IncrementalPCA. 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