文章目录
2.3.3 需要使用Java API与REST API混用方可支持所有需求
2.3.4 算子参数多、复杂、参数的联动性复杂对于前端开发需求高
一、 前言
传统机器学习模型大致可分为以下四个部分:数据采集、数据预处理、优化、应用;其中数据预处理与模型优化部分往往需要具备专业知识的数据科学家来完成,他们建立起了数据到计算的桥梁。然而,即使是数据科学家,也需要花费大量的精力来进行算法与模型的选择。机器学习在各种应用中的成功,导致对机器学习从业人员的需求不断增长,因此我们希望实现真正意义上的机器学习,让尽可能多的工作也能够被自动化完成,进一步降低机器学习的门槛,让没有该领域专业知识的人也可以使用机器学习来完成相关的工作。
AutoML应运而生,从传统机器学习模型出发,AutoML从特征工程、模型构建、超参优化三方面实现自动化;并且也提出了end-to-end的解决方案。
说明:本文是以开发自动化机器学习平台需求为背景对H2O框架进行预研分析。
二、预研结果分析
2.1 预研结论概述
通过对于AutoML原理理解,对H2O架构,特性,功能,接口,性能,部署等方面的了解和验证测试,初步认为当前技术方案可行,可用于作为自动化机器学习平台的底层框架;但是仍然存在一些二次改造的注意点与难点问题需要解决。
2.2 可行性依据分析
可行性依据分析主要从:“能否满足系统功能需求”、“学习成本及应用能力”、“能否便捷交付与运维”等方面进行分析。
2.2.1 功能需求满足分析
调研目的: 参考《自动化机器学习平台用户需求说明书.doc》分析用户需求,同步分析H2O框架能否有效支撑系统功能需求。
调研结果:H2O框架能够有效支撑数据的输入、数据解析、数据基本分析概览、数据操作转换、丰富算法支持、丰富算法参数配置、模型构建训练、交叉验证建模、模型评估、模型导出等功能。同时无论是在数据管理、算法管理、模型管理、预测分析等方面H2O都提供了丰富的、专业的、高覆盖度的能力支撑。从功能角度看,H2O能够有效满足系统的功能需求。
具体分析依据参考如下调研内容:
- 数据管理:3.6-数据加载 3.7-数据操作
- 算法管理:3.8-算法支持
- 模型训练:3.9-训练模型 3.10-交叉验证建模 3.15-模型管理
- 模型评估:3.14-性能与预测
2.2.2 学习改造能力分析
调研目的:在能够满足功能需求的前提下,我们需要进一步明确该方案的学习使用成本,而学习使用成本的分析主要看H2O框架本身提供的上手与改造的支撑能力了。
调研结果:首选H2O官方网站以及文档介绍较全面,文档内容较丰富,层次结构也清晰;其次H2O提供了R/PYTHON/JAVA/REST API的client对接方式,结合本团队的技术能力可以满足;同时文档中提供了详细的REST API列表以及各接口的输入输出模型说明,对于开发人员来说能够快速测试并使用;H2O中开发最困难的应该是算法、参数、指标的理解与展现部分,虽然开发人员不需要做数据科学家,但是需要对所有这些概念的术语还是需要理解,H2O中提供了丰富的文档已满足开发人员对齐理解并正确在开发过程中进行展示;H2O源码提交活跃,基本每天都有源码提交更新,同时社区活跃度也较可;H2O框架中提供给了丰富的案例与数据资源以供学习和使用操作流程;H2O提供了web flow可视化界面以Notebook方式来支持可视化的分析流程操作,同时提供了大量的日志与监控信息,使得能够更好、更直观的理解流程与原理,接口验证也更方便;等等。
具体分析依据参考如下调研内容:
- 接口文档丰富: 3.16-H2O开发
- 官网文档清晰:http://h2o-release.s3.amazonaws.com/h2o/rel-zeno/2/docs-website/h2o-docs/welcome.
2.2.3 交付运维能力分析
调研目的:本系统最终需要实现其企业级应用,除了对其能力需求外,我们还需要更好的维护好该服务,保持其稳定,提供持续服务能力。
调研结果:H2O可通过jvm和Hadoop两种方式进行单节点或多节点部署。其中通过jvm的部署方式部署流程简单、结构轻量,但其无法实现集群高可用。而通过Hadoop部署,部署流程相对复杂、结构较重,但H2O能依赖Hadoop相关组件实现高可用特性。通过Hadoop方式部署,对持久化文件管理服务的二次开发较为友好。
2.2.4 其他优势分析
调研目的:调研H2O框架本身技术先进性、稳定性、支撑性、活跃度、内涵性等。
调研结果:具体包括以下部分
1. 算法齐全参数完备:相对于现有产品中算子种类较少、可调参数单一的情况,H2O提供了大量监督与无监督学习算法,如深度学习、支持向量机、K-means聚类等,并支持自定义算法。H2O支持对每个算法进行基础、进阶、专家三个级别的参数配置。
2. 功能稳定较为成熟:H2O拥有庞大的国际专业团队,其技术水平在业内处于领先水平,产品稳定,可靠性高。相对于公司现有产品,还有很多功能模块未得到有效测试,系统不够稳定。
3. 改造工作量较低:相较于根据现有产品代码进行工程重构,由于H2O已经实现了各个核心功能模块,以 H2O为基础重新构建的工程量要低很多。
4. 社区文档丰富:H2O版本迭代升级频繁,社区活跃。文档丰富清晰。
2.3 问题风险及注意事项分析
2.3.1 完全基于内存的分析没有考虑过程数据的管理和复用
H2O服务重启后过程数据丢失,没有提供良好的持久化与管理功能。
2.3.2 高可用方案原生支持的并不可观
采用H2O独立组件集群,任意节点挂掉后 整体服务不可访问。并且一个节点挂掉后需要重启所有节点方可恢复服务。
当然:该部分可考虑使用K8S的部署方案,但是会增加部署实施成本。
2.3.3 需要使用Java API与REST API混用方可支持所有需求
REST API覆盖度并不全,数据处理 数据操作处理部分未提供有效REST API,如:列切片、行切片、空值填补等
2.3.4 算子参数多、复杂、参数的联动性复杂对于前端开发需求高
2.3.4 日志数据粒度不足
目前日志数据粒度是文件,而非是任务或者流程。
三、H2O调研详情
3.1 介绍
H2O是一个开源,内存中,分布式,快速且可扩展的机器学习和预测分析平台,它使您可以在大数据上构建机器学习模型,并在企业环境中轻松地将这些模型进行生产化。
H2O的核心代码是用Java编写的。在H2O内部,分布式键/值存储用于跨所有节点和机器访问和引用数据,模型,对象等。这些算法在H2O的分布式Map / Reduce框架之上实现,并利用Java Fork / Join框架进行多线程处理。并行读取数据,并将其分布在整个群集中,并以压缩的列式格式存储在内存中。H2O的数据解析器具有内置的智能功能,可以猜测传入数据集的模式,并支持从多种格式的多种来源提取数据。
H2O的REST API允许通过HTTP方式交换JSON格式数据实现所有功能的访问。REST API可以由H2O的Web界面(Flow UI),R(H2O-R)和Python(H2O-Python)调用。诸如深度学习,Tree Ensembles和GLRM之类的各种前沿的有监督和无监督算法的速度,质量,易用性和模型部署使H2O成为大数据数据科学API的追捧者。
H2O体系结构可以分为不同的层, 其中顶层是不同的API, 底层是H2O JVM。
如上图所示,H2O整体架构分为了多个层次,其中:
最上层:为API层, 提供了不同的客户端接入方式,支持JS, R , Python, Excel/Tableau以及Flow方式的接入。
最下层:H2O可以运行在不同的平台组件之上,以实现分布式与扩展性能力。可以运行与Spark集群之上,Hadoop集群之上,也可以独立容器运行。
其他层:灰色部分支持可扩展的算法代码集成。
3.3 数据流
3.4 部署
注意:集群形成的行为: 当一个任务在集群中启动后,集群会拒绝新节点的加入。
两种集群创建模式:
- 基于广播的: 在这种模式下,H2O使用IP多播来宣布H2O节点的存在。每个节点根据指定的共享群集名称选择相同的多播组和端口。
- 基于flatfile:flatfile描述了H2O集群的拓扑结构,flatfile中描述了一系列的节点Ip:port,每行代表一个。
3.5 启动
命令行启动参数说明:
参数类别 |
参数名 |
默认值 |
说明 |
JVM 参数 |
Xmx |
JVM分配最大内存 |
|
H2O参数 |
name |
加入的集s群名称 |
|
flatfile |
|
|
|
ip |
指定启动服务绑定的IP |
|
|
port |
指定REST服务端口 |
-port 8000 |
|
baseport |
指定自动寻找可用端口 |
-baseport |
|
network |
指定网络和掩码组集群 |
-network <ip/mask> |
|
ice_root |
指定目录存放h2o临时数据 |
|
|
log_dir |
指定目录存放日志 |
|
|
log_level |
指定日志级别 |
默认INFO |
|
flow_dir |
指定flow存放路径 |
|
|
nthreads |
指定低优先级队列中最大线程数 |
|
|
client |
以客户端形式运行 |
|
|
notify_local |
指定文件,当服务启动的时候将IP端口信息写入 |
|
|
context_path |
jetty的上下文路径 |
|
|
features |
禁用被认为是实验性或测试版本的功能,目前主要是针对算法 |
|
|
认证参数 |
jks |
指定java keystore文件 |
|
jks_pass |
指定java keystore密码 |
|
|
jks_alias |
可选,多个认证的时候 ,指定特定的 |
|
|
hash_login |
指定使用jetty hashlogin服务 |
默认false |
|
ladp_login |
指定使用jetty ldaplogin服务 |
默认false |
|
kerberos_login |
指定使用kerberos服务 |
默认false |
|
pam_login |
指定使用插件式认证模块登录服务 |
默认false |
|
form_auth |
启用flow中表单级认证 |
默认false |
|
session_timeout |
会话空闲时间(分钟) |
|
|
internal_security_conf |
安全配置文件 |
|
还有一种: 交给K8S启动维护
3.6 数据加载
构建和评估模型的第一步就是将