【问题标题】:How to control number of cores of a method如何控制方法的核心数
【发布时间】:2022-11-17 05:59:09
【问题描述】:

我有以下代码:

from sklearn_extra.clusters import KMedoids

def _compute_medoids(df, k):
    k_medoids = KMedoids(n_clusters=k, metric='precomputed', init='k-medoids++').fit(df)
    medoid_index=k_medoids.medoid_indices_
    labels=k_medoids.labels_
    return medoid_index, labels


for k in range(1, 6):
    medoid_ids, labels = _compute_medoids(df, n_clusters=k)

以这种方式执行代码,我的表现很差。与sklearn 的模型不同,sklearn_extra.cluster.KMedoids 没有n_jobs 参数,并且检查核心使用情况,大多数时候进程只使用一个核心。

我尝试使用joblib

Parallel(n_jobs=os.cpu_count())(delayed(_compute_medoids)(df, k) for k in range(1, 6))

我的性能有所提高,但还不足以完成我的任务。而且,将核心数量从 4 个增加到 8 个或 16 个并没有带来成比例的性能提升。

据我了解,joblibmultiprocessing 等多处理库可以控制并行工作人员的数量,但不能控制处理功能的核心用法。我对吗?

我想知道是否有一种方法可以强制在固定数量的内核上执行_compute_medoids,以便我可以处理尽可能多的工作人员(示例 - 使用 16 个内核设置 4 个工作人员执行 4 个compute_medoids 方法,每个使用 4 个核心)。可能吗?

【问题讨论】:

    标签: python multiprocessing joblib


    【解决方案1】:

    kmedoids 包具有更快的算法,包括 FasterPAM 的并行版本。

    https://python-kmedoids.readthedocs.io/en/latest/#kmedoids.fasterpam

    def _compute_medoids(df, k):
      import kmedoids
      km = kmedoids.fasterpam(df, k)
      return km.medoids, km.labels
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      相关资源
      最近更新 更多