我正在运行一个Python程序,它调用H2O进行深度学习(培训和测试)。该程序以20次迭代的循环运行,并在每个循环中调用H2ODeepLearningEstimator()
4次并关联predict()
和model_performance()
。我正在做h2o.remove_all()
并在每次迭代后清理所有与数据相关的Python对象。
数据大小:训练集80,000具有122个特征(全部浮动),20%用于验证(10倍CV)。测试集20,000。做二进制分类。
机器1:Windows 7,4核心,至强,每核心3.5GHz,内存32 GB 大约需要24小时才能完成
机器2:CentOS 7,20核心,Xeon,每个核心2.0GHz,内存128 GB 大约需要17个小时才能完成 我正在使用h2o.init(nthreads = -1,max_mem_size = 96)
所以,加速并没有那么多。 我的问题: 1)加速是否典型? 2)我可以做些什么来实现大幅加速? 2.1)添加更多核心会有帮助吗? 2.2)我缺少任何H2O配置或提示吗?
非常感谢。 - 穆罕默德, 研究生
答案 0 :(得分:1)
如果训练时间是主要的努力,并且你有足够的记忆力,那么加速将与核心时间核心速度成正比。所以,你可能期望40/14 = 2.85加速(即你的24小时降到8-10小时范围内)。
你的h2o.init()中有一个拼写错误:96
应为"96g"
。但是,我认为在编写问题时这是一个拼写错误,因为h2o.init()
会返回错误消息。 (如果您尝试"96"
并使用引号但没有“g”,则H2O将无法启动。)
您没有显示h2o.deeplearning()
命令,但我猜您正在使用提前停止。这可能是不可预测的。所以,可能发生的事情是,你的第一次24小时运行,比如1000个时代,但你的第二个17小时运行确实有2000个时代。 (尽管如此,1000 vs. 2000将是一个非常极端的差异。)
可能是你花了太多时间得分。如果您没有触及默认值,则不太可能。但您可以尝试train_samples_per_iteration
(例如,将其设置为训练行数的10倍)。
我可以做些什么来实现大幅加速?
停止使用交叉验证。这可能有点争议,但我个人认为80,000个培训行足以将80%/ 10%/ 10%分成火车/有效/测试。那将快5到10倍。
如果是纸张,并且您希望对结果表现出更多信心,一旦您拥有最终模型,并且您已经检查了测试分数接近有效分数,那么使用它重建几次80/10/10拆分的不同种子,并确认您最终得到相同的指标。 (*)
*:顺便说一下,看看你已经制作的10个cv模型中的每一个的得分;如果他们彼此相当接近,那么这种方法应该运作良好。如果他们到处都是,您可能需要重新考虑列车/有效/测试拆分 - 或者只考虑数据中可能导致这种敏感性的内容。