H2O的核心是分布式内存计算平台。在分布式计算平台的基础上,实现了机器学习算法。在H2O,我们设计每一个操作,无论是数据转换,机器学习模型的训练,甚至分析,以利用分布式计算模型。为了快速处理大数据,这是必要的。
但是,单个操作通常不能最大限度地利用群集的计算资源。数据需要跨群集分布,许多操作需要任务的顺序执行,即使以分布式方式实现,任务也需要相互遵循,并且需要数据交换。这些和许多其他较小的因素,如果一起总结,可能会带来巨大的开销。
感兴趣的一个领域是机器学习模型培训的过程。机器学习算法构建模型需要更长的时间。根据算法本身,可以发现效率低下的情况。因此,将并发引入模型训练可能会提高群集资源的利用率,主要是 CPU 和/或 GPU。
您可能还需要阅读:
H2O 机器学习 – 数据科学家动手指南
构建大量模型的一个领域是网格搜索。网格搜索”遍”过超参数的空间,并构建相应的模型。步行策略可能有所不同,但它们都有相同的问题 – 有许多模型要构建。通常,生成过程受时间限制。构建的模型越多越好。
到目前为止,H2O 和其他机器学习平台一样,一次训练一个模型。自H2O版本以来 3.28.0.1
,我们为用户提供了一种并行使用网格搜索构建模型的方法。这实际上意味着可能有在 n > 1
群集上训练的模型。当一个模型在等待或执行不太可优化的计算时,其他模型可以同时利用群集资源。这导致更多的模型在更短的时间内构建。
如何使用并行网格搜索
默认情况下,网格搜索的并行模型生成将关闭。这种情况可能在不久的将来改变。我们引入了一 parallelism
个名为网格搜索的新参数。默认情况下,此类参数在”流”、”Python”和”R”中可用 parallelism = 1
。这意味着在执行网格搜索时按顺序生成模型。为了使用网格搜索并行构建模型,用户有两个选项:
- 设置
parallelism = n
位置n > 1
, - 设置
parallelism = 0
).但是,将其设置为 0
意味着 H2O 可以自由地使用内部启发式方法来确定一次要定型的最佳模型数量。我们称之为自适应模式。
目前,自适应模式没有严格的契约,内部启发式可能发生变化。自适应模式假定整个群集由具有相同可用资源的机器组成,只需训练比每个节点可用的 CPU 数量多两倍的模型。给定一个 n
节点群集,其中每个节点都有 c
CPU 数,则模型数将为 2 * c
。节点数或可用 CPU 总数不起任何作用。
Python
并行网格搜索可以通过简单地添加 parallelism = n
H2OGridSearch
构造函数参数来启用,其中 n = 0
自适应模式或 n > 1
精确控制并行性。指定 n = 1
表示限定模式。
xxxxxxxxx
6667px;”>
数据=h2o。import_file(路径="https://0xdata-public.s3.amazonaws.com/parallel-gs-benchmark/airlines_small.csv")
hyper_parameters=已订购()
hyper_parameters="树"= =15 50100|
hyper_parameters="max_depth"= =51015|
9896px;”>
网格。列车(x=列表(范围(4y=4training_frame=数据)
R
并行网格搜索可以通过简单地添加到 parallelism = n
h2o.grid
函数参数(自适应 n = 0
模式或 n > 1
精确控制并行性)来启用。指定 n = 1
表示限定模式。
xxxxxxxxx
6667px;”>
数据<-h2o.导入文件(路径="https://0xdata-public.s3.amazonaws.com/parallel-gs-benchmark/airlines_small.csv")
hyper_parameters=列表(ntree=c(1550100learn_rate=c(51015)
网格<-h2o.网格("gbm"grid_id="gbm_grid_test",
9896px;”>
training_frame=数据,
hyper_params=hyper_parameters,
并行性 =16=并行性=16表示一次生成16个模型
基准
GitHub 上提供了H2O 并行网格搜索基准。它包含实验的描述以及可重现性的脚本。
局限性和最终想法
在内存中构建大量模型是有代价的 。每个机器学习算法都需要一定量的 RAM 才能运行。构建多个模型意味着内存消耗的线性或近线性增长。根据我们的观察,包括基准中的观察,一次训练多个模型几乎总是带来显著的性能提升
模型越小(相对于群集的资源)越小,构建模型的速度越快,并行网格搜索就越有效。对于超重型模型(同样,这是相对于群集的资源),即使一次训练一个模型也几乎不能放入内存中,使用默认值 parallelism = 1
可能是训练模型的唯一方法。在所有其他情况下,使用并行网格搜索会带来潜在的显著优势。
即使至少使用 parallelism = 2
,也可能带来显著的加速。内存是约束。但是,训练太多模型可能会引入较大的上下文切换开销,这也是不需要的。生成的自适应模式的当前规则 2 * number of leader node's CPUs
是经验性地为大型超参数空间设置的,其中模型训练阶段相对较短。用户应尝试此数字。已经计划的改进之一是带来一个坚实的自适应系统,能够动态管理/适应集群的资源。敬请期待!
下列人员也参与了并行网格搜索功能,值得赞扬:米哈尔·科尔卡、扬·什塔巴、塞巴斯蒂安·波伊里尔。H2O.ai是开源的,可以在GitHub上找到。