使用 H20、R 和 MinIO 进行机器学习
自 80 年代末以来,我一直在研究神经网络和机器学习。是的,我就这么老了。我购买的第一个产品是 California Scientific Software BrainMaker Professional。我喜欢那个产品,因为它让我开始使用神经网络。我仍然拥有它:

它是一个 3 层神经网络产品,带有 C 语言的源代码,用于执行它训练的模型。我买了它的源代码。我几乎不知道代码充满了错误,而且它不包括训练模型的代码。知道 C 后,我着手添加基于当时可用的数学文本训练模型的能力。我还把它变成了一个 DCE RPC 服务器,它具有跨节点的线程和分布式执行。当我向人们描述我在做什么,并用梯度下降解释收敛时,他们看着我,就像我有两个脑袋一样。我们在机器学习方面取得了长足的进步。现在 ML 平台可以在杂货店买到。好吧,不完全是,但你明白了。
如此多的 AI/ML 平台可供选择。我个人喜欢H2O。我发现它速度快、易于管理和使用,并且提供的功能非常齐全。我也喜欢在 R 中工作。当我处理数据和机器学习时,我发现 R 对我来说是最直观的。将这两者与 MinIO 对象存储相结合,它为数据科学家创建了一个非常强大的平台。
如果您不熟悉H2O,这里有一个摘要(来自网站):
面向所有人的开源分布式机器学习。H2O 是一个完全开源的分布式内存机器学习平台,具有线性可扩展性。H2O 支持最广泛使用的统计和机器学习算法,包括梯度提升机、广义线性模型、深度学习等。H2O 还具有行业领先的 AutoML 功能,可自动运行所有算法及其超参数,以生成最佳模型排行榜。H2O 平台被全球超过 18,000 家组织使用,并且在 R 和 Python 社区中都非常受欢迎。
如果您不熟悉R(来自维基百科):
“ R是一种用于统计计算和图形的编程语言,由 R 核心团队和 R 统计计算基金会提供支持。R 由统计学家Ross Ihaka和Robert Gentleman创建,数据挖掘者和统计学家使用 R进行数据分析和开发统计软件。用户创建了包来增强 R 语言的功能。”
当我处理数据、数据分析和机器学习时,我发现 R 对我来说是最直观的。
如果您不熟悉 MinIO,它是 100% 兼容的 Amazon S3 替代品:https://min.io
在本文中,我将设置 H2O、R 和 MinIO 以使用 H2O AutoML 功能训练模型。R 语言有一个名为 RStudio 的配套 IDE,我将使用它进行此开发:https://www.rstudio.com/。如果您想跟随,请安装 R 和 RStudio,并访问 H2O 集群。
R studio 为 R 开发提供了强大的 IDE。它通常看起来像这样:

使用非常大的训练和执行数据集的挑战之一是它们根本不适合内存。H2O 通过从 H2O 集群中的节点创建分布式计算平台来解决这个问题。如果给定的数据集对于您的集群来说太大,则只需添加更多具有更多 RAM 的节点。棒极了。这意味着低级数据科学家不需要在他们的每张桌子上都配备配备大量 RAM 的机器,而是可以利用大型 H2O 集群的集体 RAM 功能。
MinIO 提供高性能对象存储来持久化大型训练和执行集,并且 H2O 能够直接从/向 MinIO 读取和写入。十分简单。我有一个正在运行的 MinIO 集群,我通常用来从集群读取和写入集群的节点是端口 9000 上的“HP-Z230”。
我们首先将 .csv 文件加载到 MinIO 中的 S3 存储桶中。这可以通过 MinIO“mc”客户端或通过 MinIO 控制台来完成。
我在这里使用 H2O 教程中的动力装置数据:“ https://github.com/h2oai/h2o-tutorials/raw/master/h2o-world-2017/automl/data/powerplant_output.csv ”
我已经将该文件加载到一个名为test-dataMinIO 的存储桶中。您会注意到这个文件不是很大,但是这种方法也适用于非常大的文件——只是需要更长的时间。

将这些数据放入 MinIO 桶中是我们流程的起点。下一步是将 H2O 配置为能够读取和写入 MinIO s3 存储。有一些必要的配置步骤。
首先我们需要创建一个core-site.xml文件来指定H2O 在访问 MinIO s3 存储时应该使用的AccessKeyId和SecretAccessKey(凭据)。这是一个例子:
bcosta@bcosta-HP-Z230-Tower-Workstation:~/h2o/h2o-3.36.0.3$ more core-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <!-- <property> <name>fs.default.name</name> <value>s3://<your s3 bucket></value> </property> --> <property> <name>fs.s3.awsAccessKeyId</name> <value>minioadmin</value> </property> <property> <name>fs.s3.awsSecretAccessKey</name> <value>minioadmin</value> </property> </configuration>
然后需要在命令行上使用一些参数启动 H2O 程序,这些参数指示访问对象存储的位置。这是一个例子。我让 MinIO 在端口 9000 上名为“HP-Z230”的机器上运行。此外,还core-site.xml引用了该文件:
java -Dsys.ai.h2o.persist.s3.endPoint=http://HP-Z230:9000 -Dsys.ai.h2o.persist.s3.enable.path.style=true -jar h2o.jar -hdfs_config core-site.xml
H2O 应该成功启动。如果有许多 H2O 节点形成一个集群,那么应该在每个节点上执行这些步骤。如果在您的环境中您不希望在 H2O 配置文件中对凭据进行硬编码,则有一种方法可以从 R 动态设置它们,但通常由于 MinIO 集群和 H2O 集群都是基础设施的一部分,将它们静态绑定在一起是常见的。
上代码!第一步是加载所需的库并测试我们的连接。在这个块中,我加载了 aws.s3 和 h2o 库,设置了一些凭据,以便 R 可以看到 MinIO s3 集群,然后摇一摇看它是否工作。由于 MinIO 与 Amazon s3 100% 兼容,我们可以使用 AWS 库或使用 MinIO 库——这无关紧要。H2O 提供了一个与下载兼容的 R 库,应该用于访问 H2O 服务器。R 库和 H2O 服务器的版本必须匹配,否则init下面的调用将失败并显示相应的消息。
library(aws.s3)
library(h2o)
# set the credentials this r instances uses to access minio
Sys.setenv("AWS_ACCESS_KEY_ID" = "minioadmin", # enter your credentials
"AWS_SECRET_ACCESS_KEY" = "minioadmin", # enter your credentials
"AWS_S3_ENDPOINT" = "HP-Z230:9000") # change it to your specific minio IP and port to override default aws s3
# initialise the h2o server
h2o.init(ip="HP-Z230", port=54321,startH2O=FALSE)
#make a call from this r instance (ssl is off)
bucketlist(region = "", verbose = TRUE, use_https = FALSE)在 R Studio 中执行此代码应该会导致成功初始化 H2O 服务器,以及成功连接到 MinIO 集群和返回的桶列表。这测试了从 R 到 H2O 和 MinIO 的连通性。
下一步测试H2O直接访问MinIO集群的能力。请记住 - 我们将加载太大的文件,无法通过在我的笔记本电脑上运行的 R 环境传递它们。H2O 需要能够直接从 MinIO 读取大文件到它的分布式计算环境中。
# set the data_path for the object we will read data_path <- "s3://test-data/powerplant_output.csv" #import the file from minio directly into h2o and return a pointer to it df <- h2o.importFile(path = data_path) h2o.describe(df)
注意h2o.importFile()电话。这是在 R 中执行的,但指示 H2O 服务器将文件从 MinIO S3 存储直接加载到集群的内存中。如果这可行,那么你现在有 R 与 H2O 对话,R 与 MinIO 对话,H2O 与 MinIO 对话。世界是你的牡蛎!
接下来,我们将数据转换为 H2O 喜欢的格式,并使用对服务器的调用将其拆分 - 我们正在有效地远程执行针对大型数据集的数据操作调用。
#convert the raw dataframe on the server to a hex file and return a pointer to it data.hex <- as.h2o(df) y <- "HourlyEnergyOutputMW" splits <- h2o.splitFrame(data.hex, ratios = 0.8, seed = 1) train <- splits[[1]] test <- splits[[2]]
现在我们有了一些训练和测试数据,我们准备好对训练集执行一些 AutoML 来构建和比较一些模型。我使用了一些默认值,并将探索时间限制在 60 秒以下,但是可以为 H2O AutoML 功能设置大量参数——太多了,无法在此处介绍。完成后,代码将打印排行榜。
## Run AutoML stopping after 60 seconds. The `max_runtime_secs` argument provides a way to limit the AutoML run by time. When using a time-limited stopping criterion, the number of models train will vary between runs. If different hardware is used or even if the same machine is used but the available compute resources on that machine are not the same between runs, then AutoML may be able to train more models on one run vs another. aml <- h2o.automl(y = y, training_frame = train, leaderboard_frame = test, max_runtime_secs = 60, seed = 1, project_name = "powerplant_lb_frame") ## Leaderboard print(aml@leaderboard)

接下来我们通过 lead 模型发送测试数据以查看一些预测。这里是测试数据的头部。该模型将预测最后一列 - “HourlyEnergyOutputMW”:

## Predict Using Leader Model pred <- h2o.predict(aml, test) # predict(aml, test) and h2o.predict(aml@leader, test) also work head(pred)
再次注意,对于预测,H2O 直接从 MinIO S3 存储访问测试数据。假设有一个大型 H2O 集群,测试文件可能会非常大。

这些看起来很合理,最后我们可以评估模型的性能并将模型保存回 MinIO s3 存储:
perf <- h2o.performance(aml@leader, test) perf # save leader as bin h2o.saveModel(aml@leader, path = "s3://bin-models/powerplant_output_model_bin")

我已将模型保存到名为 的存储桶中bin-models,如果我查看控制台,我会看到模型存储在 MinIO 中:

H20 与 R 和 MinIO
这是一个使用 H2O 与 R 和 MinIO 来创建一个 AI/ML 平台的快速示例,该平台可以处理大文件并使用 AutoML 训练模型、测试它们、评估领导者的性能,并最终将模型保存在 MinIO S3 对象中存储以备将来使用。我希望它有帮助,我喜欢写它。