我有一个计算集群的帐户,而不是在 Linux 上运行。我正在使用 scikit-learn 在一个非常大的数据集上训练一个包含 1000 棵树的随机森林分类器。我尝试通过运行以下代码来使用计算集群的所有核心:
clf = RandomForestClassifier(n_estimators=1000, n_jobs=-1)
clf.fit(data, Y)
然而,当我运行代码时,我看到只有 1.2% 的 CPU 被使用!那么为什么它不使用所有存在的内核呢?以及如何解决这个问题?
编辑:我看到我的问题可能与此链接中的问题有关,但我无法理解解决方案。 https://github.com/scikit-learn/scikit-learn/issues/1053
最佳答案
这可能不是问题的根源(因为 n_jobs=-1
应该自动检测并使用主节点中的所有核心),但 Sklearn 将在集群中一台机器的所有核心中并行运行。默认情况下,它不会在集群中不同机器的内核上运行,因为这意味着了解集群的架构并通过网络进行通信,而 sklearn 不知道如何做,因为它因集群而异。
为此,您将不得不使用 ipython parallel 之类的解决方案。如果您想使用集群的全部功能,请参阅 Oliver Grisel 的 excellent tutorial。
我建议您将 sklearn 更新到最新版本,在本地尝试您的代码(最好在相同的 OS,sklearn 版本下),通过设置 n_jobs=1,2,3...
和基准测试来调试缩放行为和 CPU 利用率。例如,如果 n_jobs=1
在集群中的一个核心中的利用率不高,但在您的本地 PC 中却如此,这表明集群存在问题,而不是代码问题。有时集群中的 top 命令的行为会有所不同,您应该咨询管理员。
关于python - 在计算集群上训练 RandomForest 很慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22647344/