我目前正在运行h2o
的DRF算法和3节点EC2群集(h2o服务器跨越所有3个节点)。
我的数据集有1米行和41列(40个预测变量和1个响应)。
我使用R
绑定来控制群集,RF呼叫如下
model=h2o.randomForest(x=x,
y=y,
ignore_const_cols=TRUE,
training_frame=train_data,
seed=1234,
mtries=7,
ntrees=2000,
max_depth=15,
min_rows=50,
stopping_rounds=3,
stopping_metric="MSE",
stopping_tolerance=2e-5)
对于3节点集群(c4.8xlarge,已启用增强型网络),这需要大约240秒; CPU利用率在10-20%之间; RAM利用率在20-30%之间;网络传输在10-50MByte / sec(进出)之间。建造了300棵树,直到早早停止。
在单节点群集上,我可以在大约80秒内获得相同的结果。因此,对于3节点集群,我的速度提高了3倍,而不是预期的3倍速。
我做了一些研究,发现了一些报告相同问题的资源(虽然不像我的那样极端)。例如,见: https://groups.google.com/forum/#!topic/h2ostream/bnyhPyxftX8
具体而言,http://datascience.la/benchmarking-random-forest-implementations/的作者注意到
虽然不是本研究的重点,但有迹象表明该项研究正在进行中 多个分布式随机森林实施(例如H2O) 节点不能提供人们希望的速度效益(因为 在每次拆分时运输直方图的高成本 网络)。
同样https://www.slideshare.net/0xdata/rf-brighttalk指向2个不同的DRF实现,其中一个具有更大的网络开销。
我认为我遇到了上述链接中描述的相同问题。
如何在多节点群集上提高h2o
的DRF性能?
是否有可能改善运行时的设置?
任何帮助高度赞赏!
答案 0 :(得分:1)
如果您的随机森林在多节点H2O群集上较慢,则只表示您的数据集不够大,无法利用分布式计算。群集节点之间的通信开销很大,因此如果您可以在单个节点上成功训练模型,那么使用单个节点将始终更快。
多节点专为您的数据太大而无法在单个节点上进行训练而设计。只有这样,才能使用多个节点。否则,您只是无缘无故地添加通信开销,并且会看到您观察到的减速类型。
如果您的数据适合单台计算机上的内存(并且您可以成功训练模型而不会耗尽内存),那么加速培训的方法是切换到具有更多内核的计算机。您还可以使用某些参数值来影响训练速度,看看是否可以加快速度,但这通常会带来模型性能的代价。
答案 1 :(得分:1)
正如Erin所说,经常添加更多节点只会增加更大数据集的能力,而不是更快的学习。随机森林可能是最差的;通过深度学习,我得到了相当不错的结果(例如,4个节点快3倍,8个节点快5到6倍)。
在您对Erin的答案的评论中,您提到真正的问题是您想要加速超参数优化吗?令人沮丧的是h2o.grid()
并不支持并行构建模型,每个节点上有一个模型,当数据适合每个节点的内存时。但你可以自己做一些脚本:在每个节点上设置一个h2o集群,在每个节点上用超参数子集进行网格搜索,让它们将结果和模型保存到S3,然后带上结果导致并将它们组合在一起。 (如果进行随机网格搜索,则可以在每个群集上运行完全相同的网格,但最好在每个群集上明确使用不同的种子。)