案例分享 | 思科结合 SageMaker 与 Kubeflow 打造的混合机器学习工作流

image
Amazon SageMaker是一项可以帮助开发人员和数据科学家快速构建、训练和部署机器学习(ML)模型的托管服务;Kubeflow则是一个为Kubernetes构建的可组合、可移植、可扩展机器学习技术栈。这两者结合在一起能够玩出什么新花样?

下文将以思科的实践案例出发介绍他们的做法。

作为一家大型企业,思科旗下多个业务部门都在应用机器学习(ML)与人工智能(AI)技术。该公司中向CTO直接报告的思科AI团队主要负责在公司内部各业务部门中推广开源AI/ML最佳实践,同时也是Kubeflow开源项目与MLPerf/MLCommons的主要贡献者。

该部门希望在机器学习领域开发出要同时供思科业务部门与客户使用的工件与最佳实践,并以参考架构的形式共享这些解决方案。

背景介绍

由于业务需求(如本地化数据要求)限制,思科公司运营着一套混合云环境。模型训练在思科自己的UCS硬件上完成,但思科也有不少团队在使用云端资源执行推理,借此实现良好的可扩展性、地理冗余与弹性。然而由于在混合集成环境下构建并支持统一的AI/ML工作流往往对专业知识与使用技能提出严苛要求,因此客户在实际使用中可能面临巨大挑战。

为解决这个问题,思科使用Cisco Kubeflow入门包为混合云环境构建起机器学习管道,其中的云端模型推理服务正是由Amazon SageMaker负责提供。通过这样一套参考架构,思科希望帮助客户在复杂的基础设施中构建起无缝且统一的机器学习工作负载,进而解决他们可能面临的任何限制。

Kubeflow是一套用于Kubernetes上机器学习编排的流行开源库。如果用户同样使用了混合云环境,则可安装Cisco Kuberflow入门包在本地设施中开发、构建、训练并部署机器学习模型。此入门包中包含最新版本的Kubeflow以及示例应用程序捆绑包。

Amazon SageMaker则是一项托管机器学习服务,可帮助用户准备数据、处理数据、训练模型、跟踪模型实验、托管模型以及监控端点。通过使用SageMaker Components for Kubeflow Pipelines,任何人都可以像思科那样在混合机器学习项目中一样在Kubeflow管道中编排各项作业。通过这种方法即可无缝地从本地Kubeflow集群上实现对Amazon SageMaker托管服务的调用,以完成模型的训练与推理。此外,Amazon SageMaker还让用户的托管模型具备一系列企业级功能,例如自动规模伸缩、多模型端点、模型监控、高可用性以及安全合规等。

为了解释该用例如何工作,思科使用了完全公开的室内定位与导航BLE RSSI数据集重新创建场景。这套数据集中包含蓝牙低功耗(BLE)接收信号强度指示(RSSI)指标。整个管道将训练并部署模型,借以预测蓝牙设备的位置。在以下步骤中,将介绍Kubernetes集群如何与Amazon SageMaker交互以实现混合解决方案。操作中将使用运行在Cisco UCS服务器上的Kubeflow以训练由Apache MXNet编写的机器学习模型,借此满足思科的数据本地化要求,而后使用Amazon SageMaker将模型部署至AWS。

创建并训练完成的模型将被上传至Amazon Simple Storage Service(Amazon S3),而后使用Amazon SageMaker端点提供服务。下图所示为思科的端到端工作流程。
image

开发环境

首先,如果当前没有思科硬件,可以设置Amazon Elastic Kubernetes Service(Amazon EKS)以配合Kubeflow共同运行。关于具体操作说明,请参阅创建Amazon EKS集群部署Kubeflow管道

如果已经拥有一台UCS设备,则可在Kubernetes集群(v15.x或者更高版本)上使用Cisco Kubeflow入门包快速完成Kubeflow设置。要安装Kubeflow,请在该设备的IP地址中设定INGRESS_IP变量,并运行kubeflowup.bash安装脚本。具体参见以下代码:

export INGRESS_IP=
bash kubeflowup.bash

关于安装的更多详细信息,请参阅GitHub repo上的安装说明

准备混合管道

为了在Cisco UCS与AWS之间建立起无缝工作流,可使用Kubeflow Pipelines组件与Amazon SageMaker Kubeflow组件共同创建起一条混合型管道。

要使用各组件,需要首先导入Kubeflow Pipeline软件包,其中包括AWS软件包:

import kfp
import kfp.dsl as dsl
from kfp import components
from kfp.aws import use_aws_secret

关于配置及运行管道的完整代码,请参见GitHub repo

以下管道描述以图形形式呈现了工作流以及各组件之间的相互关系。管道配置包括运行管道所需要的输入(参数)定义,以及各组件的输入与输出。以下截屏为Kubeflow UI上已经完成的管道的直观表示。
image

这条管道将运行以下三个步骤:

1.训练模型。
2.创建模型资源。
3.部署模型。

训练模型

我们可以在本地设备中使用BLE数据训练模型、创建镜像、将镜像上传至S3存储桶,而后通过应用MXNet模型配置.yaml文件将模型注册至Amazon SageMaker。

将经过训练的模型上传至Amazon S3之后,Amazon SageMaker即可进一步将存储在S3中的模型部署至托管端点。Amazon SageMaker端点能够简化下游应用程序对模型的使用,同时帮助团队使用Amazon CloudWatch监控其运行状态。具体参见以下代码:

def blerssi_mxnet_train_upload_op(step_name='mxnet-train'):
 return dsl.ContainerOp(
 name='mxnet-train-upload-s3',
 image='ciscoai/mxnet-blerssi-train-upload:v0.2',
 command=['python', '/opt/mx-dnn.py', 'train'],
 arguments=['--bucket-name', bucket_name]
 ).apply(use_aws_secret(secret_name=aws_secret_name, aws_access_key_id_name='AWS_ACCESS_KEY_ID', aws_secret_access_key_name='AWS_SECRET_ACCESS_KEY'))

创建模型资源

在将MXNet模型与工件上传至Amazon S3时,请使用KF Pipeline CreateModel组件以创建一套Amazon SageMaker模型资源。

Amazon SageMaker端点API非常灵活并提供多种选项,可以将经过训练的模型部署至端点之上。例如,我们可以使用默认的Amazon SageMaker运行时管理模型部署、运行状况检查以及模型调用等操作。Amazon SageMaker还允许用户使用自定义容器与算法对运行时进行自定义。关于具体操作说明,请参阅Amazon SageMaker容器概述

在本用例中,我们希望在一定程度上对模型运行状况检查API与模型调用API加以控制。我们使用自定义方案替换掉默认Amazon SageMaker运行时,用于部署训练完成的模型。这套自定义预测器能够灵活调整传入请求的处理方式,并将其传递至模型以执行预测。具体参见以下代码:

sagemaker_model_op = components.load_component_from_url(model)

部署模型

我们可以使用KF Pipeline CreateModel组件将模型部署至Amazon SageMaker端点。

使用自定义容器进行推理,能够为团队提供最大程度的灵活性,借此任意调整运行状况检查与模型调用方式。当然,自定义容器也必须遵循Amazon SageMaker运行中关于API路径的原则性要求,具体参见以下代码:

sagemaker_deploy_op = components.load_component_from_url(deploy)

运行管道

要运行管道,请完成以下操作步骤:

l 配置Python代码,用于通过Amazon SageMaker组件定义这条混合管道:

@dsl.pipeline(
 name='MXNet Sagemaker Hybrid Pipeline',
 description='Pipeline to train BLERSSI model using mxnet and save in aws s3 bucket'
)
def mxnet_pipeline(
 region="",
 image="",
 model_name="",
 endpoint_config_name="",
 endpoint_name="",
 model_artifact_url="",
 instance_type_1="",
 role=""
):
 train_upload_model = blerssi_mxnet_train_upload_op()
 create_model = sagemaker_model_op(
 region=region,
 model_name=model_name,
 image=image,
 model_artifact_url=model_artifact_url,
 role=role
 ).apply(use_aws_secret(secret_name=aws_secret_name, aws_access_key_id_name='AWS_ACCESS_KEY_ID', aws_secret_access_key_name='AWS_SECRET_ACCESS_KEY'))
 create_model.after(train_upload_model)
 sagemaker_deploy=sagemaker_deploy_op(
 region=region,
 endpoint_config_name=endpoint_config_name,
 endpoint_name=endpoint_name,
 model_name_1=create_model.output,
 instance_type_1=instance_type_1
 ).apply(use_aws_secret(secret_name=aws_secret_name, aws_access_key_id_name='AWS_ACCESS_KEY_ID', aws_secret_access_key_name='AWS_SECRET_ACCESS_KEY'))
 sagemaker_deploy.after(create_model)

关于配置的更多详细信息,请参阅管道快速上手指南。要获取完整管道代码,请参阅GitHub repo

l 提供以下参数运行管道,借此执行管道功能:

run = client.run_pipeline(blerssi_hybrid_experiment.id, 'blerssi-sagemaker-pipeline-'+timestamp, pipeline_package_path='mxnet_pipeline.tar.gz', params={
 'region': aws_region,
 'image': inference_image,
 'model_name': model_name,
 'endpoint_config_name': endpoint_config_name,
 'endpoint_name': endpoint_name,
 'model_artifact_url': model_path,
 'instance_type_1': instance_type,
 'role': role_arn
})

到这里,BLE RSSI Amazon SageMaker管道已经顺利开始执行。在所有组件成功执行之后,检查sagemaker-deploy组件的日志以验证端点是否已经成功创建。以下截屏所示,为最后一步的日志记录以及指向已部署模型的URL。
image

验证模型

在将模型部署至AWS之后,我们使用这套模型的端点名称通过HTTP请求向其提交示例数据,借此验证模型的预测性能。以下截屏所示,为示例Jupyter notebook中的部分摘要。此Notebook带有Python客户端以及位置预测输出。
image

总结

Amazon SageMaker与Kubeflow Pipelines能够轻松被集成在统一的混合管道当中。Amazon SageMaker还提供完善的博客与教程集合,可帮助大家轻松通过Amazon SageMaker components for Kubeflow Pipelines创建起混合管道。其API亦非常丰富,涵盖了我们需要使用的所有关键组件,并允许大家开发自定义算法并与Cisco Kubeflow入门包进行集成。

通过将训练完成的机器学习模型上传至Amazon S3以供Amazon SageMaker在AWS中使用,思科将管理复杂机器学习生命周期的总体复杂度与总拥有成本降低约50%。此外,思科还还严格遵守企业隐私策略提出的最高标准,以可扩展方式实现模型交付,并在美国及世界各地的AWS区域内提供冗余保障。

image

你可能感兴趣的