Выполняется ли частичная подгонка параллельно в sklearn.decomposition.IncrementalPCA?

Я следовал за отвечатьИманол Луенго, чтобы построить частичную подгонку и преобразование для 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 показывает: Выполняется ли частичная подгонка параллельно в sklearn.decomposition.IncrementalPCA?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
835
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я искал обходной путь для этой проблемы в моем другой пост, и я понял, что это не из-за ошибки реализации 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

Другие вопросы по теме