使用 SageMaker 组件 - Amazon SageMaker

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 SageMaker 组件

在本教程中,您将使用适用于 Kubeflow Pipelines 的 SageMaker 组件运行管道,在数据集开启的情况下使用 Kmeans 训练分类模型。MNIST SageMaker该工作流程使用 Kubeflow Pipelines 作为协调器 SageMaker 来执行工作流程的每个步骤。该示例取自现有示 SageMaker 例,经过修改后可与 Kubeflow 流水线 SageMaker 组件配合使用。

你可以使用 Python 定义管道, AWS SDK for Python (Boto3) 然后使用KFP仪表板KFPCLI、或 Boto3 来编译、部署和运行工作流程。MNIST分类管道示例的完整代码可在 Kub eflow Github 存储库中找到。要使用该代码,请将 Python 文件克隆到您的网关节点。

你可以在上找到更多 SageMaker Kubeflow Pipelines 示例。 GitHub有关所用组件的信息,请参阅 Pipelin KubeFlow es GitHub 存储库

要运行分类管道示例,请创建一个 SageMaker IAM执行角色,授予您的训练作业访问 AWS 资源的权限,然后继续执行与您的部署选项相对应的步骤。

创建 SageMaker 执行角色

kfp-example-sagemaker-execution-roleIAM角色是由 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'

按照 K-Means MNIST 分类的SageMaker 训练管道教程中的说明进行操作。

准备数据集

要运行管道,您需要将数据提取预处理脚本上传到 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

从网关节点的命令行运行以下命令:

  1. KFPSDK按照 Kubeflow 管道文档中的说明进行安装。

  2. 使用以下命令验证KFPSDK是否已安装:

    pip show kfp
  3. 验证是否已正确安装 dsl-compile,如下所示:

    which dsl-compile

编译管道

您可以通过三个选项与 Kubeflow Pipelines 进行交互:KFP用户界面KFPCLI、或。KFP SDK以下各节说明了使用KFP用户界面和的工作流程CLI。

从网关节点完成以下步骤。

  1. 使用您的亚马逊 S3 存储桶名称和IAM角色修改您的 Python 文件ARN。

  2. 使用命令行中的 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将管道的运行组织为实验。您可以选择指定实验名称。如果您未指定名称,则运行将列在默认实验下。

  1. 按如下方式上传管道:

    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 ... ...
  2. 使用以下命令创建运行。r KFP CLI un 命令目前不支持在创建运行时指定输入参数。在编译之前,您需要更新 AWS SDK for Python (Boto3) 管道文件中的参数。将 <experiment-name><job-name> 替换为任意名称。将 <pipeline-id> 替换为所提交管道的 ID。<your-role-arn>替换为 o ARN f kfp-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 | +--------------------------------------+--------+----------+---------------------------+
  3. 导航到 UI 以检查作业的进度。

使用 KFP UI 上传并运行管道

  1. 在左侧面板上,选择管道选项卡。

  2. 在右上角,选择 +。UploadPipeline

  3. 输入管道名称和描述。

  4. 选择 “上传文件”,然后输入您使用CLI或创建的 tar.gz 文件的路径 AWS SDK for Python (Boto3)。

  5. 在左侧面板上,选择管道选项卡。

  6. 找到您创建的管道。

  7. 选择 + CreateRun

  8. 输入您的输入参数。

  9. 选择运行

运行预测

一旦部署了分类管道,就可以针对部署组件创建的端点运行分类预测。使用KFP用户界面检查输出工件sagemaker-deploy-model-endpoint_name。下载.tgz 文件以提取终端节点名称或查看您使用的区域中的 SageMaker 控制台。

配置运行预测的权限

如果您想从网关节点运行预测,请跳过本节。

要使用任何其他计算机运行预测,请将sagemaker:InvokeEndpoint权限分配给客户端计算机使用的IAM角色。
  1. 在您的网关节点上,运行以下命令来创建IAM策略文件:

    cat <<EoF > ./sagemaker-invoke.json {     "Version": "2012-10-17",     "Statement": [         {             "Effect": "Allow",             "Action": [                 "sagemaker:InvokeEndpoint"             ],             "Resource": "*"         }     ] } EoF
  2. 将策略附加到客户端节点的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>

运行预测

  1. 在您的客户端计算机上创建一个名为以下内容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)
  2. 按如下方式运行该 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>

清理

完成管道后,您需要清理资源。

  1. 在KFP控制面板中,如果您的管道运行未正常退出,请选择 “终止”,终止管道运行。

  2. 如果终止选项不起作用,请登录网关节点,然后手动终止由您的管道创建的所有 Pod,如下所示:

    kubectl get pods -n kubeflow kubectl delete pods -n kubeflow <name-of-pipeline-pod>
  3. 使用您的 AWS 帐户登录该 SageMaker 服务。手动停止所有训练、批量转换和HPO作业。删除模型、数据存储桶和端点,以免产生任何额外费用。终止管道运行并不能停止中的作业。 SageMaker