0

我们正在使用 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 在 nomad 上运行设置时,就会发生这种情况。Web 应用程序是用 Flask 编写的,并使用 gunicorn 提供服务。

有什么方法可以告诉 scikit 使用这些上下文切换更加机智吗?

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

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

4

1 回答 1

1

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

OMP_NUM_THREADS=1 python run.py

在此处查看完整说明: 使用 OMP_NUM_THREADS=1 进行 Python 多处理

于 2017-12-10T02:44:52.517 回答