在计算集群上训练随机森林很慢
我有一个可以使用的计算集群,它运行在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
1 个回答
3
这可能不是你问题的根源(因为 n_jobs=-1
应该会自动检测并使用你主节点上的所有核心),但 Sklearn 会在你集群中单台机器的所有核心上并行运行。默认情况下,它不会在集群中不同机器的核心上运行,因为这需要了解你集群的架构并通过网络进行通信,而 Sklearn 并不知道如何做到这一点,因为每个集群的情况都不一样。
如果你想充分利用你的集群,就需要使用像 ipython parallel 这样的解决方案。如果你想了解更多,可以参考 Oliver Grisel 的 优秀教程。
我建议你把 Sklearn 更新到最新版本,先在本地试试你的代码(最好是在相同的操作系统和 Sklearn 版本下),通过设置 n_jobs=1,2,3...
来调试扩展行为和 CPU 使用率,并进行基准测试。例如,如果 n_jobs=1
在集群的一个核心上没有高的使用率,但在你的本地电脑上有,这就说明问题出在集群而不是代码。有时候,集群中的 top 命令表现得不同,你应该和管理员咨询一下。