如何控制一个方法的核心数量



我有以下代码:

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个核心(。有可能吗?

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

相关内容

  • 没有找到相关文章

最新更新