У меня сумасшедшее количество переключений контекста, когда я импортирую что-то из scikit-learn.

мы используем scikit-learn для поиска похожих кластеров изображений. Мы хотим иметь для этого внутренний API, но когда мы импортируем объекты из scikit или используем его, мы получаем очень большое количество переключений контекста.

Любой из этих импортов создает их много:

from sklearn.neighbors import NearestNeighbors
from sklearn.externals.joblib import load
from sklearn.decomposition import PCA
from sklearn.externals import joblib

вот вывод vmstat 1 во время перезапуска нашей программы.

очень высокие контекстные переключатели после импорта

Мы добавили несколько задержек до и после импорта и связали большое количество переключений контекста с этими строками.

Но также, когда мы обрабатываем числа в нашем 3-гигабайтном объекте NearestNeighbors, мы видим значительное увеличение переключений контекста.

введите здесь описание изображения

Вы определенно можете определить 3 запроса, которые мы отправляем в наш API.

Вот предполагаемые повышения:

def reduce_dimensions(self, dataset):
    return self.dim_obj.transform(dataset)

def get_closest_cluster(self, input_data):
    indexs_with_distance = self.cluster_obj.radius_neighbors(X=input_data, radius=self.radious, return_distance=True)
    return self.get_ordered_indexs(indexs_with_distance)

Это происходит, когда мы запускаем нашу установку с помощью docker compose на нашем ноутбуке и когда мы запускаем ее на кочевнике с помощью docker. Веб-приложение написано с помощью Flask и обслуживается с помощью gunicorn.

Есть ли способ сделать scikit более находчивым с этими переключателями контекста?

Наши администраторы обеспокоены тем, что это приведет к деградации всех приложений, развернутых на одних и тех же узлах.

Мы используем Python 3.6 и scikit-learn 0.19.1.


person HWM-Rocker    schedule 24.11.2017    source источник


Ответы (1)


Попробуйте ограничить количество потоков, которые может использовать ваш процесс, запустив:

OMP_NUM_THREADS=1 python run.py

См. полное объяснение здесь: Использование OMP_NUM_THREADS=1 для многопроцессорной обработки Python

person tiagorbf    schedule 10.12.2017