H2O不能并行工作

时间:2017-08-22 13:43:48

标签: r parallel-processing h2o

我创建了一个DF并希望将其转换为H2O Frame。

为此,我这样做:

library(h2o)
h2o.init(nthreads=-1)
df<-data.table(matrix(0,ncol=46,nrow=30000))
df<-as.h2o(df)

当我在命令行上执行操作时,我发现只有4个处理器可用。不可能以其他方式做到吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

这里有两个因素在起作用。

1)首先是你正在使用John 3 Sam 2 Total 5 ,这是效率不高的&#34; push&#34;提取数据的方法(客户端将数据推送到服务器)。

这是为了小数据和方便(这种情况很好,因为你创建了一个包含30,000行的数据集,这是一个很小的数据)。

如果您希望H2O有效地摄取数据,您需要使用&#34; pull&#34;方法,其中H2O将数据从数据存储中提取到H2O的内存中。在R中,这将是as.h2o()

2)第二个因素是H2O使用数据块(数据集中的连续行)来获得数据并行性。每列的块数直接影响并行工作的线程数。一旦读入数据集,如果每列只有1个块,那么它将只能使用1个线程(因此1个核心)。通过查看H2O Flow Web UI中数据的解析方式,您可以查看每列的块数。

我在上面运行你的程序;查看生成的H2O框架的框架分布摘要如何显示每列的块数为1:

Frame Distribution Summary for 30,000 rows

使用3,000,000行再次运行相同的程序,每列产生66个块:

Frame Distribution Summary for 3,000,000 rows

这样做要好得多,因为现在一旦你尝试用H2O中的数据做事(比如训练一个模型),你将在分布式集群上并行运行多达66个线程。

[注意,对于更大的情况,数据摄取本身在我的笔记本电脑上花费了几分钟,并且仍然很慢并且是单线程的,因为它使用效率低下的h2o.importFile()&#34;推送&#34 ;做法。如果您将数据集写入csv文件,并让H2O使用as.h2o()&#34; pull&#34;解析它。方法,它会快得多。 ]