发布于: Oct 14, 2022
本文中的解决方案提供由 Amazon 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 存储桶内创建的 manifest.json 文件将启动事件通知,并据此启动管道。该文件可由之前的数据准备作业生成,此作业将在定期生产运行期间创建训练及验证数据集。此文件的上传操作会触发一项 Amazon Lambda 函数,该函数从 manifest.json 文件以及 Amazon Systems Manager Parameter Store 中收集机器学习工作流运行期间的配置,并启动机器学习工作流。
在开始部署之前,请确保具备所有先决条件。部署并运行本文中的示例工作流涉及两种依赖项类型:
- 机器学习工作流基础设施部署:
- S3 存储桶 (
<s3bucket>
) - ml-parameters.json 文件
- hyperparameters.json 文件
- S3 存储桶 (
- 机器学习工作流执行中的依赖项:
- 在 Amazon ECR 中创建的训练与推理镜像
- Amazon SageMaker 算法资源
- 训练与验证数据集
- manifest.json 文件
本文所使用的基础设施全部由兼容 Amazon Web Services 无服务器应用程序模型(Amazon SAM)的 Amazon CloudFormation 模板所创建,此模板简化了无服务器应用程序中的函数、状态机及 API 定义流程。根据计算,在 eu-central-1 区域内进行本次测试演练的成本在 1 美元以内。关于具体安装说明,请参阅安装。
整个部署过程大约需要 2 分钟。在完成之后,所有栈状态都将转换为CREATE_COMPLETE
。
这些嵌套栈将创建三个无服务器应用程序:
- ml-parameter-provider,用于管理机器学习工作流所需要的参数。
- sagemaker-model-tuner,管理模型调优与训练过程。
- sagemaker-endpoint-deployer,管理自动规模伸缩模型端点的创建与更新过程。
Amazon SageMaker 在运行时内的 Amazon SageMaker 训练实例之上启动 Docker 镜像。这套镜像属于对 Amazon Web Services 合作伙伴 H2O.AI 所提供的开源 Docker 镜像库的小幅修改版本,该镜像对 Amazon Linux 2 Docker 镜像做了扩展。这里仅保留训练代码及其所需的依赖项;H2O 版本也得到升级,并添加了导出 MOJO 模型的功能。
在命令行中切换至 h2o-gbm-trainer repo。作为可选项,您可以在本地 PC 上进行测试。接下来,使用安装命令将这套模型训练 Docker 镜像构建并部署至 Amazon ECR。
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 服务
- 根据模型调用的频率,扩展系统的资源利用率
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 ECR 上发布模型训练及推理 Docker 镜像之后,即可创建名为h2o-gbm-algorithm
的 Amazon SageMaker 算法资源了。如下图所示,Amazon SageMaker 算法资源当中包含训练及推理 Docker 镜像 URI、Amazon SageMaker 实例类型、输入通道、受支持的超参数以及各项算法评估指标。
在命令行中切换至 h2o-gbm-algorithm-resource repo,而后运行安装命令以创建您的算法资源。
几秒钟之后,算法资源即创建完成。
现在所有必要基础设施组件都已部署完成,接下来可以运行机器学习管道来训练及部署 H2O 模型了。
要开始运行工作流,请完成以下步骤:
- 将 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/
2.将此文件上传至机器学习工作流部署期间指定的同一 S3 存储桶 s3:///manifests目录当中:
aws s3 cp examples/manifest.json s3:///manifests
在将 manifest.json 文件上传至 Amazon S3 之后,Step Functions 会将机器学习工作流转为 Running 状态。
要训练我们的 H2O 模型,需要完成以下操作步骤:
- 在 Step Functions 控制台上,切换至
ModelTuningWithEndpointDeploymentStateMachine
,确认其处于Running
状态并观察 Model Tuning Job 步骤。
- 在Amazon SageMaker控制台的 Training之下, 选择 Hyperparameter tuning jobs。
- 具体查看正在进行的调优作业。
在 4 分钟之后,所有训练作业及模型调优作业都将转换为Completed
状态。
以下截屏所示,为最佳训练作业中的性能及配置详情。
切换至 Amazon SageMaker 模型链接以展示模型定义详情。
以下截屏所示,为所创建 Amazon SageMaker 模型资源的具体设置信息。
要部署 MOJO 模型,请完成以下操作步骤:
- 在 Step Functions 控制台上,切换至
ModelTuningWithEndpointDeploymentStateMachine
,确认其处于Running
状态。 - 观察正在运行的 Deploy Auto-scaling Model Endpoint 步骤。
以下截屏所示,为部署期间的 Amazon SageMaker 模型端点。
启用自动规模伸缩的模型端点部署作业大约需要 5 到 6 分钟。在端点部署完成之后,Step Functions 工作流将成功结束。
- 切换至处于 InService 状态的模型端点;现在模型已经可以正常接收传入请求了。
- 具体查看模型端点详情信息,特别是端点运行时设置。
此模型端点的扩展区间在 1 到 4 个节点之间,所有节点皆处于 Amazon SageMaker Runtime 之后。
对于 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 模型端点之间的延迟进行测量时,请注意考虑到两端之间的网络传输情况。为了对模型调用性能做出客观评估,我们最好根据实际流量预期进行负载测试。
为了避免 Amazon Web Services 账户后续产生不必要的成本,请删除本文中创建的各项资源,具体请参阅资源清理。
在本文中,我们共同了解了如何使用 Amazon SageMaker 在生产规模的设计模式当中训练并支持 H2O 框架模型。通过这种方式,我们可以利用自定义容器运行一款使用数据科学脚本语言构建的完整模型训练应用程序,以及另外一款使用 Java 等低级语言构建的独立模型托管应用程序。根据实际测试,整套方案具有良好的健壮性与可重复性。大家还可以将这套设计模式应用到其他机器学习用例。您可以引用 Github repo 当中的代码并自主测试开源代码。关于 H2o 的更多资源,请参阅以下其他博文。
使用 H2O 在 Amazon Web Services 上训练及部署机器学习模型的四步走方案。
相关文章