亚马逊AWS官方博客

使用Amazon SageMaker训练H2O模型并对其服务化

原文链接:

https://aws.amazon.com/cn/blogs/machine-learning/training-and-serving-h2o-models-using-amazon-sagemaker/

 

模型训练与服务化可以说是成功建立端到端机器学习(ML)流程的两大基本环节。这两个步骤通常需要不同的软件与硬件设置,才能为生产环境提供最佳组合。模型训练优化的目标是低成本、训练时间长度可行、科学上的灵活性以及良好的模型可解释性等;而模型服务化的优化目标是低成本、高吞吐以及低延迟。

因此,目前使用的普遍方法是通过流行的数据科学语言(例如Python或R)训练模型,并创建某种模型格式,例如 Model Object, Optimized (MOJO), Predictive Model Markup Language (PMML) 或者 Open Neural Network Exchange (ONNX)等,并在基于Open Java Development Kit (OpenJDK)的微服务(例如Spring Boot应用程序)之上实现模型服务化。

本文将向大家演示如何使用Amazon SageMaker以端到端方式为流行开源机器学习框架H2O实施上述方法。Amazon SageMaker是一项完全托管服务,可为每位开发人员及数据科学家提供快速构建、训练及部署机器学习模型的能力。Amazon SageMaker是一项多功能机器学习服务,您可以在其中使用自己选定的机器学习框架及编程语言。H2O框架由AWS合作伙伴网络(APN)高级合作伙伴H2O.ai打造,您可以在多种选项中做出选择,借此在AWS云上训练及部署H2O模型。此外,H2O还提供一系列示例设计模式的示例以演示如何把H2O机器学习管道用于生产。

H2O框架支持三种模型格式,具体如下表所示。

维度 二进制模型 Plain Old Java Object (POJO) Model Object, Optimized (MOJO)
定义 H2二进制模型旨在使用由特定H2O版本支持的特征执行非生产机器学习实验。 POJO是一类普通Java对象,不受任何特殊限制。这是一种导出H2O内置模型并将其实现在Java应用程序当中的方法。 MOJO同样属于Java对象,但模型树不丰此对象之内,因为它使用通用Tree-Walker代码实现模型导航。这样能够进一步缩小模型的大小。
用例 用于交互式机器学习实验。 适用于生产环境。 适用于生产环境。
部署限制 模型托管镜像应运行一套H2O集群,外加与二进制模型相同的h2o版本。 在H2O中,模型文件不可超过1 GB。 对于H2O没有任何限制。
推理性能 高延迟(可高达几秒)——不推荐在生产中使用。 仅在二项式与回归模型中比MOJO略快一点。延迟通常在个位数毫秒级别。 对于多标称与大规模模型,推理效率大大高于POJO。延迟通常在个位数毫秒级别。

在本次试验当中,我们尝试了Amazon SageMaker管理的几种端到端设计模式,并将结果整理为下表。

ID 设计模式 优点 缺点
A

使用由H2O.ai提供的Amazon SageMaker Marketplace 算法进行模型训练及部署。

 

无需创建任何自定义容器及Amazon SageMaker算法资源。 存在一套较旧的h2o Python库版本。其他缺点与选项B一致。
B

使用自定义容器配合h2o Python库进行训练。模型将以H2O二进制模型格式导出。使用运行有Flask应用程序的自定义容器做模型服务化,并由h2o Python库运行推理。

 

可以使用h2o Python库的任意版本。 H2O二进制模型推理延迟明显高于MOJO模型。由于不兼容h2o Python库版本,因此容易出现故障。
C

使用自定义容器配合h2o Python库进行训练。模型将以MOJO格式导出。使用运行有Flask应用程序的自定义容器做模型服务化,并由pyH2oMojo运行推理。

 

由于支持MOJO模型格式,因此模型推理延迟低于选项B,而且可以使用h2o Python库的任意版本。 使用pyH2oMojo会导致延迟更高,而且由于无法全面支持快速更新的H2O版本而导致容易出现故障。
D 使用自定义容器配合h2o Python库进行训练。模型将以MOJO格式导出。使用运行有Spring Boot 应用程序以及h2o-genmodel Java库的 Amazon Corretto做模型服务化。 可以使用h2o Python及 h2o-genmodel库的任意版本。可实现最低的模型推理延迟。 大部分数据科学家更倾向于单纯使用脚本语言。

我们可以在之前的列表中添加其他一些选项,特别是在使用Sparkling Water运行分布式训练的情况下。在测试所有备选方案之后,本文得出结论,设计模式D是广泛适用于各类H2O生产级用例的最佳选择。设计模式D由包含h2o Python库的自定义模型训练容器配合包含Spring Boot应用程序以及h2o-genmodel Java库的自定义模型推理容器共同构成。在后文当中,我们将共同了解如何基于这套设计模式构建起机器学习工作流。

 

问题与数据集

大家可以使用由Kaggleencyclopedia-titanica发布的“泰坦尼克号旅客生存”公共数据集构建一套预测模型,借此分析哪些群体更有可能在灾难性的沉船事故当中幸存下来。其中使用11项独立变量(例如年龄、性别与乘客舱位等)预测二分类目标变量Survived。在本文中,我们将原始训练数据集以二八比例拆分开来,用以分别创建validation.csvtrain.csv输入文件。数据集位于父存储库的/exmaples目录之下。此数据集需要执行特征预处理操作,例如对Age特征进行空值数据插值、以及对SexEmbarked特征进行索引等,借此使用H2O的Gradient Boosting Machines(GBM)算法实现模型训练。

 

解决方案概述

本文中的解决方案提供由AWS Step Functions编排、并由Amazon SageMaker实现的机器学习训练与部署流程。下图所示,为这套工作流的基本架构。

此工作流采用基于JSON的Amazon State Language(ASL)语言开发而成。Step Functions API负责为Amazon SageMaker、子工作流以及其他服务提供服务集成。

设计模式D中提及的两套 ECR(Amazon Elastic Container Registry)镜像生成代码如下:

  • h2o-gbm-trainer – 运行有Python应用程序的H2O模型训练Docker镜像。
  • h2o-gbm-predictor – 运行有Spring Boot应用程序的H2O模型推理Docker镜像。

Amazon Simple Storage Service (Amazon S3)存储桶内创建的manifest.json文件将启动事件通知,并据此启动管道。该文件可由之前的数据准备作业生成,此作业将在定期生产运行期间创建训练及验证数据集。此文件的上传操作会触发一项AWS Lambda函数,该函数从manifest.json文件以及AWS Systems Manager Parameter Store中收集机器学习工作流运行期间的配置,并启动机器学习工作流。

 

先决条件

在开始部署之前,请确保具备所有先决条件。部署并运行本文中的示例工作流涉及两种依赖项类型:

 

部署机器学习工作流基础设施

本文所使用的基础设施全部由兼容AWS无服务器应用程序模型(AWS SAM)的AWS CloudFormation模板所创建,此模板简化了无服务器应用程序中的函数、状态机及API定义流程。根据计算,在eu-central-1区域内进行本次测试演练的成本在1美元以内。关于具体安装说明,请参阅安装

整个部署过程大约需要2分钟。在完成之后,所有栈状态都将转换为CREATE_COMPLETE

这些嵌套栈将创建三个无服务器应用程序:

创建一套模型训练Docker镜像

Amazon SageMaker在运行时内的Amazon SageMaker训练实例之上启动Docker镜像。这套镜像属于对AWS合作伙伴H2O.AI所提供的开源Docker镜像库的小幅修改版本,该镜像对Amazon Linux 2 Docker镜像做了扩展。这里仅保留训练代码及其所需的依赖项;H2O版本也得到升级,并添加了导出MOJO模型的功能。

在命令行中切换至h2o-gbm-trainer repo。作为可选项,您可以在本地PC上进行测试。接下来,使用安装命令将这套模型训练Docker镜像构建并部署至Amazon ECR。

 

创建一套模型推理Docker镜像

Amazon SageMaker endpoint 实例在运行时需要启动这个Docker推理镜像。为了能支持运行Spring Boot应用程序,需要对Amazon Corretto Docker镜像 (amazoncorretto:8)做扩展,增加了对Amazon Linux 2 Docker镜像与Java设置。

由于OpenJDK的开源发行版存在几个重大缺点,例如各次要发行版之间存在向下不兼容问题、错误修复延迟、安全漏洞(例如逆向移植)以及生产服务性能欠佳等等。因此,这里我们选择使用Amazon Corretto,即一套免费、多平台、安全、可直接用于生产的OpenJDK下游发行版。此外,Corretto相较于OpenJDK(openjdk:8-alpine)还带来了性能提升,这种性能优势在Spring Boot应用程序启动与模型推理延迟层面都有直接体现。再有,我们基于以下考量,优先选择Spring Boot框架来构建模型托管应用程序:

  • 能够轻松构建独立的生产级微服务
  • 对于Spring配置要求更低且易于部署
  • 易于构建RESTful Web服务
  • 根据模型调用的频率,扩展系统的资源利用率

下图所示,为H2O GBM模型预测器创建的Spring Boot应用程序类图。

SagemakerController类为此Spring Boot Java应用程序的入口,并由SagemakerLauncher类在模型推理Docker镜像中执行启动。SagemakerController类使用H2O设置从Amazon S3中加载H2O MOJO模型,借此在init()方法中进行服务初始化,并配合H2O设置以获取缺失模型评分输入特征并加载Predictor类。

SagemakerController类还提供Amazon SageMaker所需要的/ping/invocations REST API接口,在HTTPS请求并发到达SageMaker endpoint的过程中,这些接口会被异步的调用。在模型端点部署期间,Amazon SageMaker将保留用于运行状态检查的/ping路径。/invocations路径则被映射至invoke()方法,此方法将传入的模型调用请求异步转发至Predictor对象的predict()方法。凭借着非阻塞异步与并发调用,predict()方法能够有效使用专供模型推理Docker镜像的Amazon SageMaker实例资源。

在命令行中切换到h2o-gbm-predictor repo。作为可选项,您可以在本地PC上进行测试。接下来,使用安装命令将这套模型训练Docker镜像构建并部署至Amazon ECR。

 

创建自定义Amazon SageMaker算法资源

在Amazon ECR上发布模型训练及推理Docker镜像之后,即可创建名为h2o-gbm-algorithm的Amazon SageMaker算法资源了。如下图所示,Amazon SageMaker算法资源当中包含训练及推理Docker镜像URI、Amazon SageMaker实例类型、输入通道、受支持的超参数以及各项算法评估指标。

在命令行中切换至h2o-gbm-algorithm-resource repo,而后运行安装命令以创建您的算法资源。

几秒钟之后,算法资源即创建完成。

现在所有必要基础设施组件都已部署完成,接下来可以运行机器学习管道来训练及部署H2O模型了。

 

运行机器学习工作流

要开始运行工作流,请完成以下步骤:

  1. 将 train.csv 与 validation.csv文件上传至 <s3bucket> 存储桶内的专用目录当中(请将 <s3bucket> 替换为 manifest.json 文件中指定的S3存储桶名称):

aws s3 cp examples/train.csv s3://<s3bucket>/titanic/training/aws s3 cp examples/validation.csv s3://<s3bucket>/titanic/validation/

  1. 将此文件上传至机器学习工作流部署期间指定的同一S3存储桶 s3://<s3bucket>/manifests目录当中:

aws s3 cp examples/manifest.json s3://<s3bucket>/manifests

在将manifest.json文件上传至Amazon S3之后,Step Functions会将机器学习工作流转为Running状态。

 

使用Amazon SageMaker训练H2O模型

要训练我们的H2O模型,需要完成以下操作步骤:

  • 在Step Functions控制台上,切换至 ModelTuningWithEndpointDeploymentStateMachine,确认其处于 Running 状态并观察Model Tuning Job步骤。

  • 在Amazon SageMaker控制台的 Training之下, 选择 Hyperparameter tuning jobs
  • 具体查看正在进行的调优作业。

在4分钟之后,所有训练作业及模型调优作业都将转换为Completed状态。

以下截屏所示,为最佳训练作业中的性能及配置详情。

    1. 切换至Amazon SageMaker模型链接以展示模型定义详情。

以下截屏所示,为所创建Amazon SageMaker模型资源的具体设置信息。

 

将MOJO模型部署至启用自动规模伸缩的Amazon SageMaker模型端点

要部署MOJO模型,请完成以下操作步骤:

  • 在Step Functions控制台上,切换至 ModelTuningWithEndpointDeploymentStateMachine,确认其处于 Running 状态。
  • 观察正在运行的Deploy Auto-scaling Model Endpoint步骤。

以下截屏所示,为部署期间的Amazon SageMaker模型端点。

启用自动规模伸缩的模型端点部署作业大约需要5到6分钟。在端点部署完成之后,Step Functions工作流将成功结束。

  • 切换至处于 InService状态的模型端点;现在模型已经可以正常接收传入请求了。

  • 具体查看模型端点详情信息,特别是端点运行时设置。

此模型端点的扩展区间在1到4个节点之间,所有节点皆处于Amazon SageMaker Runtime之后。

 

测试Amazon SageMaker模型端点

对于Windows用户,请输入以下代码以调用模型端点:

aws sagemaker-runtime invoke-endpoint --endpoint-name survival-endpoint ^
--content-type application/jsonlines ^
--accept application/jsonlines ^
--body "{\"Pclass\":\"3\",\"Sex\":\"male\",\"Age\":\"22\",\"SibSp\":\"1\",\"Parch\":\"0\",\"Fare\":\"7.25\",\"Embarked\":\"S\"}"  response.json && cat response.json

 

对于Linux及MacOS用户,请输入以下代码以调用模型端点:

--content-type application/jsonlines \
--accept application/jsonlines \
--body "{\"Pclass\":\"3\",\"Sex\":\"male\",\"Age\":\"22\",\"SibSp\":\"1\",\"Parch\":\"0\",\"Fare\":\"7.25\",\"Embarked\":\"S\"}"  response.json --cli-binary-format raw-in-base64-out && cat response.json

 

如以下模型端点响应结果为示,根据训练后的模型做出的预测分析,三等舱男性乘客的幸存几率最低(预测为0):

{"calibratedClassProbabilities":"null","classProbabilities":"[0.686304913500942, 0.313695086499058]","prediction":"0","predictionIndex":0}

在首次调用时,往返延迟可能相对较高,但在后续调用中会逐渐降低。对您的PC到Amazon SageMaker模型端点之间的延迟进行测量时,请注意考虑到两端之间的网络传输情况。为了对模型调用性能做出客观评估,我们最好根据实际流量预期进行负载测试。

 

资源清理

为了避免AWS账户后续产生不必要的成本,请删除本文中创建的各项资源,具体请参阅资源清理

 

总结

在本文中,我们共同了解了如何使用Amazon SageMaker在生产规模的设计模式当中训练并支持H2O框架模型。通过这种方式,我们可以利用自定义容器运行一款使用数据科学脚本语言构建的完整模型训练应用程序,以及另外一款使用Java等低级语言构建的独立模型托管应用程序。根据实际测试,整套方案具有良好的健壮性与可重复性。大家还可以将这套设计模式应用到其他机器学习用例。您可以引用Github repo当中的代码并自主测试开源代码。关于H2o的更多资源,请参阅以下其他博文。

使用H2O在AWS上训练及部署机器学习模型的四步走方案

使用RStudio, H2O与Amazon Athena预测Billboard十大热门歌曲

 

 

 

本篇作者

Anil Sener

作为机器学习原型设计架构师,Anil Sener以机器学习、大数据分析以及数据流为基础构建原型方案,帮助EMEA(欧洲、中东与非洲)各大型客户在AWS上加速推进生产流程。他拥有管理信息系统与数据科学双硕士学位。