在 Rapids 容器内时出现 hdbscan 错误

问题描述

我在 Rapidsai docker 容器内结合使用 Rapids UMAP 和 HDBSCAN:rapidsai/rapidsai-core:0.18-cuda11.0-runtime-ubuntu18.04-py3.7

import cudf
import cupy
from cuml.manifold import UMAP
import hdbscan 
from sklearn.datasets import make_blobs
from cuml.experimental.preprocessing import StandardScaler

blobs,labels = make_blobs(n_samples=100000,n_features=10)
df_gpu=cudf.DataFrame(blobs)

scaler= StandardScaler()
cupy_scaled=scaler.fit_transform(df_gpu.values)


projector= UMAP(n_components=3,n_neighbors=2000)
cupy_projected=projector.fit_transform(cupy_scaled)


numpy_projected=cupy.asnumpy(cupy_projected)
clusterer= hdbscan.HDBSCAN(min_cluster_size=1000,prediction_data=True,gen_min_span_tree=True)#,core_dist_n_jobs=1) 
clusterer.fit(numpy_projected)

我收到一个错误,如果我使用 core_dist_n_jobs=1 会修复该错误,但会使代码变慢:

----------------------------------------------- ---------------------------- TerminatedWorkerError Traceback(最近一次调用 最后)在 1 clusterer= hdbscan.HDBSCAN(min_cluster_size=1000,prediction_data=True,gen_min_span_tree=True) ----> 2 clusterer.fit(numpy_projected)

/opt/conda/envs/rapids/lib/python3.7/site-packages/hdbscan/hdbscan_.py 合身(自我,X,Y) 第917话 第918话 --> 919 self._min_spanning_tree) = hdbscan(X,**kwargs) 920 第921话

/opt/conda/envs/rapids/lib/python3.7/site-packages/hdbscan/hdbscan_.py 在 hdbscan(X,min_cluster_size,min_samples,alpha,cluster_selection_epsilon,度量,p,leaf_size,算法,内存, approx_min_span_tree,gen_min_span_tree,core_dist_n_jobs,cluster_selection_method、allow_single_cluster、 match_reference_implementation,**kwargs) 第613话 第614话 --> 615 core_dist_n_jobs,**kwargs) 616 else: # 指标是有效的 BallTree 指标 617 # TO DO:需要启发式来决定什么时候去boruvka;

/opt/conda/envs/rapids/lib/python3.7/site-packages/joblib/memory.py 中 调用(self,*args,**kwargs) 350 351 def call(self,**kwargs): --> 352 返回 self.func(*args,**kwargs) 353 第 354 章

/opt/conda/envs/rapids/lib/python3.7/site-packages/hdbscan/hdbscan_.py 在 _hdbscan_boruvka_kdtree(X,metric,p,叶大小,approx_min_span_tree,gen_min_span_tree,core_dist_n_jobs, **夸格) 第276话 第277话 --> 278 n_jobs=core_dist_n_jobs,**kwargs) 第279话 280 # 按权重对 min_spanning_tree 的边进行排序

hdbscan/_hdbscan_boruvka.pyx 中 hdbscan._hdbscan_boruvka.KDTreeBoruvkaAlgorithm.init()

hdbscan/_hdbscan_boruvka.pyx 中 hdbscan._hdbscan_boruvka.KDTreeBoruvkaAlgorithm._compute_bounds()

/opt/conda/envs/rapids/lib/python3.7/site-packages/joblib/parallel.py 在 调用(self,iterable) 1052 1053 与 self._backend.retrieval_context(): -> 1054 self.retrieve() 1055 # 确保我们得到最后一条消息,告诉我们我们已经完成 1056
elapsed_time = time.time() - self._start_time

/opt/conda/envs/rapids/lib/python3.7/site-packages/joblib/parallel.py 在检索(自我) 931尝试: 第 932 章 --> 933 self._output.extend(job.get(timeout=self.timeout)) 934 其他: 第935话

/opt/conda/envs/rapids/lib/python3.7/site-packages/joblib/_parallel_backends.py 在 wrap_future_result(未来,超时) 540 AsyncResults.get from multiprocessing.""" 541尝试: --> 542 返回 future.result(timeout=timeout) 543 除了 CfTimeoutError 作为 e: 544 从 e

引发 TimeoutError

/opt/conda/envs/rapids/lib/python3.7/concurrent/futures/_base.py 中 结果(自我,超时) 第433回 434 elif self._state == 完成: --> 435 返回 self.__get_result() 436 其他: 第437话

/opt/conda/envs/rapids/lib/python3.7/concurrent/futures/_base.py 中 __get_result(self) 第382话 第383话 --> 384 引发 self._exception 385 其他: 第386回

TerminatedWorkerError: 一个由执行程序管理的工作进程是 意外终止。这可能是由分段错误引起的 在调用函数时或由于内存使用过多导致 操作系统杀死工人。

工人的退出代码是{EXIT(1)}

有没有办法解决这个问题,但仍然保持 HDBSCAN 的速度?

解决方法

尝试将 min_samples 设置为一个值

https://github.com/scikit-learn-contrib/hdbscan/issues/345#issuecomment-628749332 中,lmcinnes 说“如果您的 min_cluster_size 很大而您的 min_samples 未设置,您可能会遇到问题。您可以尝试将 min_samples 设置为较小的看看这是否有帮助。”我注意到您的代码中没有设置 min_samples