【发布时间】: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 个并没有带来成比例的性能提升。
据我了解,joblib 或 multiprocessing 等多处理库可以控制并行工作人员的数量,但不能控制处理功能的核心用法。我对吗?
我想知道是否有一种方法可以强制在固定数量的内核上执行_compute_medoids,以便我可以处理尽可能多的工作人员(示例 - 使用 16 个内核设置 4 个工作人员执行 4 个compute_medoids 方法,每个使用 4 个核心)。可能吗?
【问题讨论】:
标签: python multiprocessing joblib