当我从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
输出。
我们在导入之前和之后添加了一些睡眠,并将大量的上下文切换到这些行。
但是,当我们在处理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