本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 SageMaker 组件
在本教程中,您将使用适用于 Kubeflow Pipelines 的 SageMaker 组件运行管道,在数据集开启的情况下使用 Kmeans 训练分类模型。MNIST SageMaker该工作流程使用 Kubeflow Pipelines 作为协调器 SageMaker 来执行工作流程的每个步骤。该示例取自现有示 SageMaker 例
你可以使用 Python 定义管道, AWS SDK for Python (Boto3) 然后使用KFP仪表板KFPCLI、或 Boto3 来编译、部署和运行工作流程。MNIST分类管道示例的完整代码可在 Kub eflow Github 存储库
你可以在上找到更多 SageMaker Kubeflow Pipelines 示例
要运行分类管道示例,请创建一个 SageMaker IAM执行角色,授予您的训练作业访问 AWS 资源的权限,然后继续执行与您的部署选项相对应的步骤。
创建 SageMaker 执行角色
该kfp-example-sagemaker-execution-role
IAM角色是由 SageMaker 作业承担的 AWS 用于访问资源的运行时角色。在以下命令中,您可以创建一个名为的IAM执行角色kfp-example-sagemaker-execution-role
,附加两个托管策略(AmazonSageMakerFullAccess,AmazonS3FullAccess),并与创建信任关系 SageMaker 以授予 SageMaker 任务访问这些 AWS 资源的权限。
运行管道时,您可以将此角色作为输入参数提供。
运行以下命令以创建角色。请ARN注意输出中返回的。
SAGEMAKER_EXECUTION_ROLE_NAME=kfp-example-sagemaker-execution-role TRUST="{ \"Version\": \"2012-10-17\", \"Statement\": [ { \"Effect\": \"Allow\", \"Principal\": { \"Service\": \"sagemaker.amazonaws.com\" }, \"Action\": \"sts:AssumeRole\" } ] }" aws iam create-role --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --assume-role-policy-document "$TRUST" aws iam attach-role-policy --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess aws iam attach-role-policy --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess aws iam get-role --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --output text --query 'Role.Arn'
准备数据集
要运行管道,您需要将数据提取预处理脚本上传到 Amazon S3 存储桶。此存储桶和本示例的所有资源必须位于 us-east-1
区域。有关创建存储桶的信息,请参阅创建存储桶。
从您在网关节点上克隆的 Kubeflow 存储库的 mnist-kmeans-sagemaker
文件夹中,运行以下命令以将 kmeans_preprocessing.py
文件上传到 Amazon S3 存储桶。将 <bucket-name>
更改为 Amazon S3 存储桶的名称。
aws s3 cp mnist-kmeans-sagemaker/kmeans_preprocessing.py s3://
<bucket-name>
/mnist_kmeans_example/processing_code/kmeans_preprocessing.py
编译和部署管道
定义管道后,必须将其编译为中间表示形式,然后才能将其提交给集群上的 Kubeflow Pipelines 服务。中间表示形式是一个工作流程规范,其形式是YAML压缩成 tar.gz 文件的文件。您需要使用KFPSDK来编译您的管道。
安装 KFP SDK
从网关节点的命令行运行以下命令:
-
KFPSDK按照 Kubeflow 管道文档
中的说明进行安装。 -
使用以下命令验证KFPSDK是否已安装:
pip show kfp
-
验证是否已正确安装
dsl-compile
,如下所示:which dsl-compile
编译管道
您可以通过三个选项与 Kubeflow Pipelines 进行交互:KFP用户界面KFPCLI、或。KFP SDK以下各节说明了使用KFP用户界面和的工作流程CLI。
从网关节点完成以下步骤。
-
使用您的亚马逊 S3 存储桶名称和IAM角色修改您的 Python 文件ARN。
-
使用命令行中的
dsl-compile
命令按如下方式编译管道。将<path-to-python-file>
替换为管道的路径,将<path-to-output>
替换为要将 tar.gz 文件放入的位置。dsl-compile --py
<path-to-python-file>
--output<path-to-output>
使用上传并运行管道 KFP CLI
从网关节点的命令行完成以下步骤。KFP将管道的运行组织为实验。您可以选择指定实验名称。如果您未指定名称,则运行将列在默认实验下。
-
按如下方式上传管道:
kfp pipeline upload --pipeline-name
<pipeline-name>
<path-to-output-tar.gz>
您的输出应与以下内容类似。记下管道
ID
。Pipeline 29c3ff21-49f5-4dfe-94f6-618c0e2420fe has been submitted Pipeline Details ------------------ ID 29c3ff21-49f5-4dfe-94f6-618c0e2420fe Name sm-pipeline Description Uploaded at 2020-04-30T20:22:39+00:00 ... ...
-
使用以下命令创建运行。r KFP CLI un 命令目前不支持在创建运行时指定输入参数。在编译之前,您需要更新 AWS SDK for Python (Boto3) 管道文件中的参数。将
<experiment-name>
和<job-name>
替换为任意名称。将<pipeline-id>
替换为所提交管道的 ID。<your-role-arn>
替换为 o ARN fkfp-example-pod-role
。将<your-bucket-name>
替换为所创建 Amazon S3 存储桶的名称。kfp run submit --experiment-name
<experiment-name>
--run-name<job-name>
--pipeline-id<pipeline-id>
role_arn="<your-role-arn>
" bucket_name="<your-bucket-name>
"您也可以使用作为
dsl-compile
命令输出创建的已编译管道包直接提交运行。kfp run submit --experiment-name
<experiment-name>
--run-name<job-name>
--package-file<path-to-output>
role_arn="<your-role-arn>
" bucket_name="<your-bucket-name>
"您的输出应与以下内容类似:
Creating experiment aws. Run 95084a2c-f18d-4b77-a9da-eba00bf01e63 is submitted +--------------------------------------+--------+----------+---------------------------+ | run id | name | status | created at | +======================================+========+==========+===========================+ | 95084a2c-f18d-4b77-a9da-eba00bf01e63 | sm-job | | 2020-04-30T20:36:41+00:00 | +--------------------------------------+--------+----------+---------------------------+
-
导航到 UI 以检查作业的进度。
使用 KFP UI 上传并运行管道
-
在左侧面板上,选择管道选项卡。
-
在右上角,选择 +。UploadPipeline
-
输入管道名称和描述。
-
选择 “上传文件”,然后输入您使用CLI或创建的 tar.gz 文件的路径 AWS SDK for Python (Boto3)。
-
在左侧面板上,选择管道选项卡。
-
找到您创建的管道。
-
选择 + CreateRun。
-
输入您的输入参数。
-
选择运行。
运行预测
一旦部署了分类管道,就可以针对部署组件创建的端点运行分类预测。使用KFP用户界面检查输出工件sagemaker-deploy-model-endpoint_name
。下载.tgz 文件以提取终端节点名称或查看您使用的区域中的 SageMaker 控制台。
配置运行预测的权限
如果您想从网关节点运行预测,请跳过本节。
要使用任何其他计算机运行预测,请将sagemaker:InvokeEndpoint
权限分配给客户端计算机使用的IAM角色。
-
在您的网关节点上,运行以下命令来创建IAM策略文件:
cat <<EoF > ./sagemaker-invoke.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sagemaker:InvokeEndpoint" ], "Resource": "*" } ] } EoF
-
将策略附加到客户端节点的IAM角色。
运行以下命令。
<your-instance-IAM-role>
替换为IAM角色的名称。将<path-to-sagemaker-invoke-json>
替换为所创建策略文件的路径。aws iam put-role-policy --role-name
<your-instance-IAM-role>
--policy-name sagemaker-invoke-for-worker --policy-document file://<path-to-sagemaker-invoke-json>
运行预测
-
在您的客户端计算机上创建一个名为以下内容
mnist-predictions.py
的 AWS SDK for Python (Boto3) 文件。替换ENDPOINT_NAME
变量。该脚本加载MNIST数据集,CSV根据这些数字创建,然后将其发送CSV到端点进行预测并打印结果。import boto3 import gzip import io import json import numpy import pickle ENDPOINT_NAME='
<endpoint-name>
' region = boto3.Session().region_name # S3 bucket where the original mnist data is downloaded and stored downloaded_data_bucket = f"jumpstart-cache-prod-{region}" downloaded_data_prefix = "1p-notebooks-datasets/mnist" # Download the dataset s3 = boto3.client("s3") s3.download_file(downloaded_data_bucket, f"{downloaded_data_prefix}/mnist.pkl.gz", "mnist.pkl.gz") # Load the dataset with gzip.open('mnist.pkl.gz', 'rb') as f: train_set, valid_set, test_set = pickle.load(f, encoding='latin1') # Simple function to create a csv from our numpy array def np2csv(arr): csv = io.BytesIO() numpy.savetxt(csv, arr, delimiter=',', fmt='%g') return csv.getvalue().decode().rstrip() runtime = boto3.Session(region).client('sagemaker-runtime') payload = np2csv(train_set[0][30:31]) response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME, ContentType='text/csv', Body=payload) result = json.loads(response['Body'].read().decode()) print(result) -
按如下方式运行该 AWS SDK for Python (Boto3) 文件:
python mnist-predictions.py
查看结果和日志
当管道正在运行时,您可以选择任何组件来查看执行详细信息,例如输入和输出。这将列出已创建资源的名称。
如果KFP请求成功处理并创建了作 SageMaker 业,则KFP用户界面中的组件日志将提供指向中创建的任务的链接 SageMaker。如果任务成功创建,还会提供 CloudWatch 日志。
如果您在同一集群上运行过多管道作业,则可能会看到一条错误消息,表明您没有足够的 Pod 可用。要解决此问题,请登录您的网关节点,然后删除由您未使用的管道创建的 Pod:
kubectl get pods -n kubeflow kubectl delete pods -n kubeflow
<name-of-pipeline-pod>
清理
完成管道后,您需要清理资源。
-
在KFP控制面板中,如果您的管道运行未正常退出,请选择 “终止”,终止管道运行。
-
如果终止选项不起作用,请登录网关节点,然后手动终止由您的管道创建的所有 Pod,如下所示:
kubectl get pods -n kubeflow kubectl delete pods -n kubeflow
<name-of-pipeline-pod>
-
使用您的 AWS 帐户登录该 SageMaker 服务。手动停止所有训练、批量转换和HPO作业。删除模型、数据存储桶和端点,以免产生任何额外费用。终止管道运行并不能停止中的作业。 SageMaker