关于机器学习:好消息Amazon-SageMaker-正式支持-Kubeflow-啦

2次阅读

共计 12016 个字符,预计需要花费 31 分钟才能阅读完成。


Kubeflow 是一款风行的开源机器学习(ML)工具包,实用于心愿构建自定义机器学习管道的 Kubernetes 用户。Kubeflow Pipelines 属于 Kubeflow 提供的附加组件,可帮忙咱们构建并部署具备良好可移植性与可扩展性的端到端机器学习工作流。但在应用 Kubeflow Pipelines 时,数据科学家往往须要消耗不少精力以实现各类生产力工具,例如数据标记工作流与模型调优工具。

另外,在应用 Kubeflow Pipelines 的过程中,MLOps 团队还须要治理 Kubernetes 集群中的 CPU 与 GPU 实例,思考如何放弃资源的高利用率,最终实现最佳投资回报。在数据迷信团队当中,充分利用集群资源是一项极为艰巨的挑战,同时也极大减少了 MLOps 团队的经营压力。例如,咱们须要保障仅应用 GPU 实例解决深度学习训练及推理等性能要求较高的工作,并将 CPU 实例用于执行数据预处理以及 Kubeflow 管道管制立体等性能要求绝对较低的工作。

最近,AWS 正式颁布了实用于 Kubeflow Pipelines 的 Amazon SageMaker Components。借此,Amazon SageMaker Components 可能帮忙咱们在 Kubeflow Pipelines 上实现弱小的 Amazon SageMaker 性能,以全托管服务的模式反对数据标记、大规模超参数调优以及分布式训练作业、一键式平安可扩大模型部署,并通过 Amazon Elastic Compute Cloud (Amazon EC2)竞价实例进行高老本效益训练等指标。

下文将介绍如何通过 Kubeflow Pipelines SDK,应用 Amazon SageMaker Components 构建出一个 Kubeflow 管道。

面向 Kubeflow Pipelines 的 Amazon SageMaker Components

咱们能够在 Kubeflow Pipelines 中应用 SageMaker Components,在机器学习工作流中的各个阶段调用相应 SageMaker 作业,且无需放心其在后盾的具体运行形式。作为数据科学家或机器学习开发人员,咱们能够借此将精力集中在通过可移植、可扩大管道内构建及运行机器学习试验身上。所谓管道组件,是指可能在容器化应用程序中实现复用的代码,大家能够依据需要进行代码共享以进步生产效率。

如果心愿应用 Amazon SageMaker 中的超参考调优性能,则能够应用超参数优化组件。在管道作业的运行过程中,相应的超参数调优步骤将在 Amazon SageMaker 全托管基础设施之上进行。在下一节中,咱们将具体介绍其工作形式;本节先来介绍 Amazon SageMaker Components 的基本原理。

在一条典型的 Kubeflow 管道中,各个组件负责将您的逻辑封装在容器镜像当中。作为开发人员或数据科学家,咱们须要将训练、数据预处理、模型服务或者其余逻辑打包在 Kubeflow Pipelines ContainerOp 函数中,由该函数将代码构建至新容器内。或者也可将代码搁置在自定义容器镜像中,而后将镜像推送至容器注册表(如 Amazon Elastic Container Registry,简称 Amazon ECR)。在管道运行时,负责运行 Kubeflow 的 Kubernetes 集群将指定一个工作节点对组件容器进行实例化,进而执行相干逻辑。管道组件可读取先前组件的输入,并生成管道中下一组件能够应用的输入。下图所示,为此管道工作流的根本架构。

在 Kubeflow Pipelines 中应用 Amazon SageMaker Components 时,大家不再须要将逻辑封装在自定义容器之内,而能够间接加载对应组件并应用 Kubeflow Pipelines SDK 形容管道。在管道运行时,其中的指令将被转换为 Amazon SageMaker 作业或部署。而后,工作负载将在 Amazon SageMaker 全托管基础设施之上运行,保障咱们充沛享受 Amazon SageMaker 的各项典型劣势,包含 Managed Spot Training、端点主动规模伸缩等。下图为这类加强管道的根本架构。

  • image
  • 在启动的同时,管道即可反对以下 Amazon SageMaker 性能:
  • Amazon SageMaker Ground Truth
  • 创立标记工作流
  • 训练作业
  • 模型部署
  • 批量转换作业

随着时间推移,AWS 将持续推出更多功能,倡议大家在官网 Kubeflow Pipelines GitHub repo 中收珍藏 Amazon SageMaker Components 目录链接。)

面向 Kubeflow Pipelines 的 Amazon SageMaker Components 应用入门

为了阐明如何在 Kubeflow 中应用 Amazon SageMaker Components,让咱们按下图所示构建一条小型管道。

理论场景中的管道往往更为高级,而且波及数据摄取、数据预处理、数据转换等其余步骤。但为简便起见,这里只应用最简略的管道设计。

大家能够在 YouTube 上观看本演练的视频版本:《在 Kubernetes 与 Kubeflow 上应用 SageMaker 实现机器学习规模扩大》(Scaling Machine Learning on Kubernetes and Kubeflow with SageMaker)。

上面来看管道中各个步骤的具体作用:
组件 1:超参数调优作业;
第一个组件,负责运行 Amazon SageMaker 超参数调优作业以优化以下超参数:

  • 学习率 – [0.0001, 0.1] log scale
  • 优化器 – [sgd, adam]
  • 批次大小 – [32, 128, 256]
  • 模型类型 – [resnet, custom model]

输出:N/A
输入:最佳超参数

组件 2:抉择最佳超参数
在上一步的超参数搜寻过程中,模型只须要训练 10 个轮次即可确定最佳性能超参数。而在第二步中,为了获取最佳超参数,咱们须要进行 80 轮更新,以保障最佳超参数可能进一步晋升模型准确率。
输出:最佳超参数
输入:通过 80 轮更新的最佳超参数

组件 3:应用最佳超参数执行训练作业
第三个组件将应用轮次最高的最佳超参数运行 Amazon SageMaker 训练作业。
输出:通过 80 轮更新的最佳超参数
输入:训练作业名称

组件 4:创立一套待部署模型
第四个组件将创立一套 Amazon SageMaker 模型工件。
输出:训练作业名称
输入:模型工件名称

组件 5:部署推理端点
最终组件将应用 Amazon SageMaker 实现模型部署。
输出:模型工件名称
输入:N/A

先决条件

要运行以下用例,须要做好如下筹备:

  • Kubernete 集群 —— 咱们能够间接应用现有集群,或者创立一个新集群。最快的启动与运行形式,是应用 eksctl 启动一个 Amazon Elastic Kubernetes Service (Amazon EKS)集群。对于具体操作阐明,请参阅 eskctl 入门教程。在这里,咱们创立一套蕴含双 CPU 节点的简略集群,节点类型为 c5.xlarge。这一配置曾经足以反对咱们的 Amazon SageMaker Component 容器以及 Kubeflow 工作负载。训练与部署作业将运行在 Amazon SageMaker 托管基础设施之上。
  • Kubeflow Pipelines —— 在集群上装置 Kubeflow Pipelines。对于具体操作阐明,请参阅部署 Kubeflow Pipelines 中的第一步。咱们应用的 Kubeflow Pipelines 版本应为 0.5.0 或者更高。另外,咱们也可依据需要抉择装置 Kubeflow 残缺版本,其中也将蕴含 Kubeflow Pipelines。
  • Amazon SageMaker Components 先决条件 —— 对于设置 AWS 身份与拜访治理(AWS Identity and Access Management,简称 IAM)角色与权限的操作阐明,请参阅[面向 Kubeflow Pipelines 的 Amazon SageMaker Components](https://sagemaker.readthedocs…

r_components_for_kubeflow_pipelines.html)。咱们须要以下两个 IAM 角色:

  1. Kubeflow 管道 Pod,用于拜访 Amazon SageMaker 并启动作业与部署。
  2. Amazon SageMaker,用于拜访 Amazon Simple Storage Service (Amazon S3)及 Amazon ECR 等其余 AWS 资源。

抉择一个网关实例以启动 Amazon EKS 集群

大家能够通过笔记本电脑、台式机、EC2 实例或者 Amazon SageMaker notebook 实例启动 Amazon EKS 集群。无论如何抉择,咱们通常将该实例称为“网关实例”。这是因为 Amazon EKS 提供齐全托管的管制立体,咱们只须要应用网关实例即可与 Kubernetes API 以及工作节点进行交互。在本示例中,咱们应用一个 c5.xlarge EC2 实例作为网关实例。

GitHub 上提供了本文中应用的代码、配置文件、Jupyter notebook 以及 Dockerfile。咱们将通过以下演示逐渐解释其中波及的各项外围概念。请不要在各步骤中复制代码,倡议大家间接运行 GitHub 上提供的现成 Jupyter notebook。

步骤 1:克隆示例 Repo

关上终端并通过 SSH 接入咱们用于创立 Amazon EKS 集群的 Amazon EC2 网关实例。在登录后,克隆该示例 Repo 以拜访示例 Jupyter notebook。详见以下代码:

cd

git clone https://github.com/shashankpr…

cd kubeflow-pipelines-sagemaker-examples

步骤 2:在网关实例上关上示例 Jupyter notebook

要在网关实例上关上 Jupyter notebook,请实现以下操作步骤:

l 在网关实例上启动 Jupyter,并应用以下代码通过本地设施拜访 Jupyter:

jupyter-lab

如果是在 EC2 实例上运行 Jupyterlab 服务器,请设置一条指向该 EC2 实例的通道,借此通过本地笔记本或者台式机拜访 Jupyterlab 客户端。详见以下代码:

ssh -N -L 0.0.0.0:8081:localhost:8081 -L 0.0.0.0:8888:localhost:8888 -i ~/.ssh/<key_pair>.pem ubuntu@<IP_ADDRESS>

如果应用 Amazon Linux 而非 Ubuntu,则必须应用 ec2-user 这一用户名。更新 EC2 实例的 IP 地址,并应用对应的密钥对。

至此,应该曾经能够在本地设施上通过 http://localhost:8888 拜访 Jupyterlab 了。

l 在网关实例上运行以下代码以拜访 Kubeflow 仪表板:

kubectl port-forward svc/istio-ingressgateway -n istio-system 8081:80

至此,应该曾经能够通过 http://localhost:8081 拜访 Kubeflow 仪表板了。

l 关上示例 Jupyter notebook。

Amazon SageMaker 反对两种训练作业模式(GitHub Repo 中别离为两种模式提供对应的 Jupyter notebook):

Ø 自带 Docker 容器镜像 —— 在这种模式下,咱们能够提供本人的 Docker 容器以执行训练。应用训练脚本构建容器,而后将其推送至 Amazon ECR 容器注册表。Amazon SageMaker 会提取该容器镜像,进行实例化,而后开始训练。kfp-sagemaker-custom-container.ipynb Jupyter notebook 采纳的即是这种办法。

Ø 自带训练脚本(即脚本模式)—— 在这种模式下,无需应用 Docker 容器。只有将机器学习训练脚本导入 TensorFlow、PyTorch、MXNet 或 XGBoost 等风行框架中,而后将框架上传至 Amazon S3 即可。Amazon SageMaker 会主动提取适当容器、下载训练脚本而后加以运行。如果不想应用 Docker 容器,那么这种模式显著更为实用。kfp-sagemaker-script-mode.ipynb Jupyter notebook 采纳的就是这种办法。

以下示例次要探讨第一种办法(自带 Docker 容器镜像)。本演练将带大家理解 kfp-sagemaker-custom-container.ipynb Jupyter notebook 中的各个重要步骤。在将其关上后,咱们即可轻松实现后续操作。

以下截屏所示,即 kfp-sagemaker-custom-container.ipynb notebook:

步骤 3:装置 Kubeflow Pipelines SDK 并加载 Amazon SageMaker 管道组件

要装置 SDK 并加载各管道组件,请实现以下操作步骤:

l 应用以下代表装置 Kubeflow Pipelines SDK:

pip install kfp –upgrade

l 应用以下代码在 Python 中导入 Kubeflow Pipelines 软件包:

import kfp

from kfp import components

from kfp.components import func_to_container_op

from kfp import dsl

l 应用以下代码在 Python 中加载 Kubeflow Pipelines Components:

sagemaker_hpo_op = components.load_component_from_url(‘https://raw.githubusercontent…’)

sagemaker_train_op = components.load_component_from_url(‘https://raw.githubusercontent…’)

sagemaker_model_op = components.load_component_from_url(‘https://raw.githubusercontent…’)

sagemaker_deploy_op = components.load_component_from_url(‘https://raw.githubusercontent…’)

在生产工作流中,倡议将组件固定至特定提交操作当中,而非间接应用 Master。这样能够保障任何可能导致兼容性毁坏的变更都不会对生产流程造成影响。

例如,要应用特定的提交版本,请在各加载组件中应用提交哈希替换掉 Master 局部:

sagemaker_train_op = components.load_component_from_url(‘https://raw.githubusercontent…’)

步骤 4:筹备训练数据集,将数据集上传至 Amazon S3

要筹备并上传数据集,请输出以下代码:

import sagemaker

import boto3

sess = boto3.Session()

account = boto3.client(‘sts’).get_caller_identity().get(‘Account’)

sm = sess.client(‘sagemaker’)

role = sagemaker.get_execution_role()

sagemaker_session = sagemaker.Session(boto_session=sess)

bucket_name = sagemaker_session.default_bucket()

job_folder = ‘jobs’

dataset_folder = ‘datasets’

local_dataset = ‘cifar10’

!python generate_cifar10_tfrecords.py —data-dir {local_dataset}

datasets = sagemaker_session.upload_data(path=’cifar10′, key_prefix=’datasets/cifar10-dataset’)

在以上代码中,咱们首先导入 Sagemaker 与 Boto3 软件包,借此拜访以后计算机的 IAM 角色与默认的 S3 存储桶。Python 脚本 generate_cifar10_tfrecords.py 应用 TensorFlow 下载相应数据,将其转换为 TFRecord 格局,而后上传至 Amazon S3。

步骤 5:构建 Docker 容器并将其推送至 Amazon ECR

Build_docker_push_to_ecr.ipynb Jupyter notebook 负责执行创立容器并将其推送至 Amazon ECR 的全副操作步骤。

Docker 目录中还蕴含 Dockerfile、训练与推理 Python 脚本,以及保留在需要文件中的各依赖项。以下截屏所示,为 Docker 文件夹的具体内容 —— Dockerfile 以及 build_docker_push_to_ecr.ipynb Jupyter notebook。

对于如何应用 Amazon SageMaker 运行自定义容器的更多详细信息,请参阅在 Amazon SageMaker 中应用您的自有算法或模型。

如果不打算构建本人的容器,能够指定由 Amazon SageMaker 替咱们治理容器。在这种办法下,咱们能够将训练脚本上传至 Amazon S3,如 kfp-sagemaker-script-mode.ipynb notebook 中所示。

步骤 6:应用 Amazon SageMaker Components 创立 Kubeflow 管道

咱们可将 Kubeflow 管道示意为由 @dsl.pipeline 装璜的函数,参见以下代码及 kfp-sagemaker-custom-container.ipynb 所示。对于更多详细信息,请参阅 Kubeflow Pipelines 概述。

@dsl.pipeline(

name=’cifar10 hpo train deploy pipeline’,

description=’cifar10 hpo train deploy pipeline using sagemaker’

)

def cifar10_hpo_train_deploy(region=’us-west-2′,

training_input_mode=’File’,

train_image=f'{account}.dkr.ecr.us-west-2.amazonaws.com/sagemaker-kubernetes:latest’,

serving_image=’763104351884.dkr.ecr.us-west-2.amazonaws.com/tensorflow-inference:1.15.2-cpu’,

volume_size=’50’,

max_run_time=’86400′,

instance_type=’ml.p3.2xlarge’,

network_isolation=’False’,

traffic_encryption=’False’,

在本文的示例代码中,咱们创立一项名为 cifar10_hpo_training_deploy ()的新函数,由其定义管道中各步骤间共通的参数。在该函数内,咱们还将定义以下五项管道组件。

组件 1:Amazon SageMaker 超参数调优作业

此组件形容了超参数调优作业中的相干选项。详见以下代码:

hpo = sagemaker_hpo_op(

region=region,

image=train_image,

training_input_mode=training_input_mode,

strategy=’Bayesian’,

metric_name=’val_acc’,

metric_definitions='{“val_acc”: “val_acc: ([0-9.]+)”}’,

metric_type=’Maximize’,

static_parameters='{

“epochs”: “1”,

“momentum”: “0.9”,

“weight-decay”: “0.0002”,

“model_dir”:”s3://’+bucket_name+’/jobs”,

“sagemaker_region”: “us-west-2”

}’,

continuous_parameters='[

{“Name”: “learning-rate”, “MinValue”: “0.0001”, “MaxValue”: “0.1”, “ScalingType”: “Logarithmic”}

]’,

categorical_parameters='[

{“Name”: “optimizer”, “Values”: [“sgd”, “adam”]},

{“Name”: “batch-size”, “Values”: [“32”, “128”, “256”]},

{“Name”: “model-type”, “Values”: [“resnet”, “custom”]}

]’,

channels=channels,

output_location=f’s3://{bucket_name}/jobs’,

instance_type=instance_type,

instance_count=’1′,

volume_size=volume_size,

max_num_jobs=’16’,

max_parallel_jobs=’4′

这些选项包含调优策略(贝叶斯)、优化指标(验证准确率)、间断超参数(学习率)、分类超参数(优化器、批次大小与模型类型)以及放弃不变的动态超参数(例如轮次数 =10)。

咱们将作业数量指定为 16。Amazon SageMaker 会配置 16 个 GPU 实例以运行这项超参数调优作业。

组件 2:用于更新轮次数的自定义组件

组件 1 的输入将被捕获在 hpo 变量中。组件 2 则采纳最佳超参数并更新轮次数,具体参见以下代码:

training_hyp = get_best_hyp_op(hpo.outputs[‘best_hyperparameters’])

为此,咱们须要定义一项自定义函数,由其获取此项输入并将轮次数更新为 80。这意味着咱们须要经验更长的训练工夫,但能够凭借最佳超参数晋升训练成果。具体参见以下代码:

def update_best_model_hyperparams(hpo_results, best_model_epoch = “80”) -> str:

import json

r = json.loads(str(hpo_results))

return json.dumps(dict(r,epochs=best_model_epoch))

get_best_hyp_op = func_to_container_op(update_best_model_hyperparams)

组件 3:Amazon SageMaker 训练作业

此组件负责形容 Amazon SageMaker 训练作业,此作业将应用最佳超参数与先前步骤中通过更新的轮次数。详见以下代码:

training = sagemaker_train_op(

region=region,

image=train_image,

training_input_mode=training_input_mode,

hyperparameters=training_hyp.output,

channels=channels,

instance_type=instance_type,

instance_count=’1′,

volume_size=volume_size,

max_run_time=max_run_time,

model_artifact_path=f’s3://{bucket_name}/jobs’,

network_isolation=network_isolation,

traffic_encryption=traffic_encryption,

spot_instance=spot_instance,

role=role,

)

组件 4:Amazon SageMaker 模型创立

此组件负责创立一套 Amazon SageMaker 模型工件,供大家作为推理端点进行部署与托管。详见以下代码:

create_model = sagemaker_model_op(

region=region,

model_name=training.outputs[‘job_name’],

image=serving_image,

model_artifact_url=training.outputs[‘model_artifact_url’],

network_isolation=network_isolation,

role=role

)

组件 5:Amazon SageMaker 模型部署

最初,此组件负责模型部署,详见以下代码:

prediction = sagemaker_deploy_op(

region=region,

model_name_1=create_model.output,

instance_type_1=’ml.m5.large’

)

管道编译与运行

应用 Kubeflow 管道编译器,大家能够编译此管道、创立试验并运行管道。详见以下代码:

kfp.compiler.Compiler().compile(cifar10_hpo_train_deploy,’sm-hpo-train-deploy-pipeline.zip’)

client = kfp.Client()

aws_experiment = client.create_experiment(name=’sm-kfp-experiment’)

exp_name = f’cifar10-hpo-train-deploy-kfp-{time.strftime(“%Y-%m-%d-%H-%M-%S”, time.gmtime())}’

my_run = client.run_pipeline(aws_experiment.id, exp_name, ‘sm-hpo-train-deploy-pipeline.zip’)

步骤 7:后果

以下截屏所示,为 Kubeflow 管道执行实现之后的后果(带有正文)。除了“自定义函数以更新轮次(Custom function to update epochs)”步骤之外,其余所有步骤皆由 Amazon SageMaker 在 Kubeflow 管道中实现。

咱们还能够在 Amazon SageMaker 管制台上监控各个步骤的以后进度。以下截屏所示,为用于执行超参数调优作业的 Amazon SageMaker 控制台。

端点测试

在管道整体运行结束之后,咱们的模型将作为推理端点承受托管,如以下截屏所示。

要测试该端点,请复制端点名称并应用 Boto3 SDK 获取预测后果:

import json, boto3, numpy as np

client = boto3.client(‘runtime.sagemaker’)

file_name = ‘1000_dog.png’

with open(file_name, ‘rb’) as f:

payload = f.read()

response = client.invoke_endpoint(EndpointName=’Endpoint-20200522021801-DR5P’,

ContentType=’application/x-image’,

Body=payload)

pred = json.loads(response[‘Body’].read())[‘predictions’]

labels = [‘airplane’,’automobile’,’bird’,’cat’,’deer’,’dog’,’frog’,’horse’,’ship’,’truck’]

for l,p in zip(labels, pred[0]):

print(l,”{:.4f}”.format(p*100))

在对蕴含小狗的图片进行剖析时,咱们应得出如下输入后果:

airplane 0.0000

automobile 0.0000

bird 0.0001

cat 0.0115

deer 0.0000

dog 99.9883

frog 0.0000

horse 0.0000

ship 0.0000

truck 0.0000

总结

本文介绍了如何配置 Kubeflow Pipelines 以通过 Amazon SageMaker 运行机器学习作业。Kubeflow Pipelines 是一套开源机器学习编排平台,在心愿立足 Kubernetes 构建并治理自定义机器学习工作流的开发者群体中广受欢迎。但不少开发人员及 MLOps 团队在 Kubeflow Pipelines 的理论经营中遭逢挑战,发现自己难以治理 Kubernetes 集群的机器学习优化工作,无奈取得良好的投资回报率或者承当极高的总体领有老本。

在面向 Kubeflow Pipelines 的 SageMaker Components 帮忙下,咱们能够持续在 Kubeflow Pipelines 中治理自有管道,并依附 Amazon SageMaker 的托管性能执行具体的机器学习工作。数据科学家与机器学习开发人员还能够应用 Amazon SageMaker 中的最新翻新成绩,例如全托管超参数调优、分布式训练、Managed Spot Training、主动规模伸缩等性能。咱们还展现了如何应用 Amazon SageMaker Components 创立并运行一条端到端 Kubeflow 示例管道。残缺示例请参阅 GitHub。

正文完
 0