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角色:
- Kubeflow管道Pod,用于拜访Amazon SageMaker并启动作业与部署。
- 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。