当我从 scikit-learn 导入一些东西时,我有大量的上下文切换

I have a crazy amount of context switches when I import something from 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 GB NearestNeighbors 对象中 c运行 时,我们会看到上下文切换的大量增加。

您绝对可以发现我们发送给 API 的 3 个查询。

以下是增加的预期:

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 在我们的笔记本电脑上撰写时,当我们 运行 它在游牧上 docker 时,就会发生这种情况。该 Web 应用程序使用 Flask 编写并使用 gunicorn 提供。

有什么方法可以让 scikit 更灵活地使用这些上下文切换?

我们的管理员担心它会降低部署到相同节点的所有应用程序。

我们正在使用 Python 3.6 和 scikit-learn 0.19.1

尝试通过 运行 来限制您的进程可以使用的线程数:

OMP_NUM_THREADS=1 python run.py

在此处查看完整说明: