当我从scikit-learn中导入某些东西时,我有一个疯狂的上下文切换

我们正在使用scikit-learn来find类似的图像集群。 我们希望有一个内部的API,但是当我们从scikit导入对象或使用它时,我们会得到非常多的上下文切换。

这些import中的任何一个都创造了很多:

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

这里是我们的程序重新启动过程中的vmstat 1输出。

导入后非常高的contex开关

我们在导入之前和之后添加了一些睡眠,并将大量的上下文切换到这些行。

但是,当我们在处理3GB NearestNeighbors对象中的数字的时候,我们看到上下文切换的大幅度增加。

在这里输入图像说明

您绝对可以发现我们发送给我们的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上运行它时。 networking应用程序是用Flask写的,并与gunicorn。

有什么办法告诉scikit与这些上下文切换更足智多谋?

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

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

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

 OMP_NUM_THREADS=1 python run.py 

请参阅此处的完整说明: 对Python多处理使用OMP_NUM_THREADS = 1