我们正在使用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对象中的数字时,我们看到上下文切换的大幅增加。
您绝对可以发现我们发送给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
答案 0 :(得分:1)
尝试通过运行来限制进程可以使用的线程数:
OMP_NUM_THREADS=1 python run.py
请参阅此处的完整说明: Use of OMP_NUM_THREADS=1 for Python Multiprocessing