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

时间:2017-11-24 16:16:19

标签: linux docker scikit-learn nomad

我们正在使用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输出。

very high contex switches after import

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

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

enter image description here

您绝对可以发现我们发送给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 compose运行我们的设置时,以及当我们使用docker在游牧时运行它时,会发生这种情况。这个网络应用程序是用Flask编写的,并配有gunicorn。

有没有办法告诉scikit使用这些上下文切换更有资源?

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

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

1 个答案:

答案 0 :(得分:1)

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

OMP_NUM_THREADS=1 python run.py

请参阅此处的完整说明: Use of OMP_NUM_THREADS=1 for Python Multiprocessing