使用SageMaker组件 - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

使用SageMaker组件

在本教程中,您使用适用于 Kubeflow Pipelines 的 SageMaker 组件运行管道,以将 Kmeans 与 MNIST 数据集结合使用来训练分类模型。此工作流程使用 Kubeflow 管道作为编排器并SageMaker作为后端来运行工作流程中的步骤。有关此管道示例和其他管道示例的完整代码,请参阅示例 SageMaker Kubeflow 管道。有关所用组件的信息,请参阅 KubeFlow Pipelines GitHub 存储库

Setup

要使用 Kubeflow Pipelines (KFP),您需要一个 (Amazon Elastic Kubernetes Service)Amazon EKS 集群和一个网关节点来与该集群进行交互。以下部分说明了设置这些资源所需的步骤。

设置网关节点

网关节点用于创建Amazon EKS 集群和访问 Kubeflow Pipelines UI。使用本地计算机或Amazon EC2 实例作为网关节点。如果要使用新Amazon EC2实例,请使用启动和配置 DLAMI 中的步骤从 AWS 控制台使用最新的 Ubuntu 18.04 DLAMI 版本创建一个实例。

完成以下步骤以设置网关节点。根据您的环境,您可能已经配置了某些要求。

  1. 如果您没有现有Amazon EKS集群your_credentials,请使用在 AWS 账户创建 IAM 用户中的步骤创建一个名为 的用户。如果您有一个现有Amazon EKS集群,请使用有权访问该集群的 IAM 角色或用户的凭证。

  2. 使用更改 IAM 用户的权限中的步骤向您的用户添加以下权限:

  3. 在网关节点上安装以下内容以访问集群和 KFPAmazon EKS UI。

  4. 安装boto3

    pip install boto3

设置Amazon EKS 集群

从网关节点的命令行运行以下步骤以设置Amazon EKS 集群:

  1. 如果您没有现有Amazon EKS集群,请完成以下子步骤。如果您已有一个Amazon EKS 集群,请跳过此步骤。

    1. 从命令行运行以下命令以创建具有版本 1.14 或更高版本的Amazon EKS 集群。将 <your-cluster-name> 替换为集群的任何名称。

      eksctl create cluster --name <your-cluster-name> --region us-east-1 --auto-kubeconfig --timeout=50m --managed --nodes=1
    2. 集群创建完成后,请使用以下命令验证您是否有权访问集群。

      kubectl get nodes
  2. 使用以下命令验证当前kubectl上下文是否为要使用的集群。当前上下文在输出中标有星号 (*)。

    kubectl config get-contexts CURRENT NAME     CLUSTER *   <username>@<clustername>.us-east-1.eksctl.io   <clustername>.us-east-1.eksctl.io
  3. 如果所需的集群未配置为当前默认值,请使用以下命令更新默认值。

    aws eks update-kubeconfig --name <clustername> --region us-east-1

安装 Kubeflow 管道

从网关节点的命令行运行以下步骤以在集群上安装 Kubeflow Pipelines。

  1. 按照部署 Kubeflow 管道文档的步骤 1,在集群上安装 Kubeflow 管道。您的 KFP 版本必须为 0.5.0 或更高版本。

  2. 验证 Kubeflow Pipelines 服务和其他相关资源是否正在运行。

    kubectl -n kubeflow get all | grep pipeline

    您的输出应与以下内容类似。

    pod/ml-pipeline-6b88c67994-kdtjv                      1/1     Running            0          2d pod/ml-pipeline-persistenceagent-64d74dfdbf-66stk     1/1     Running            0          2d pod/ml-pipeline-scheduledworkflow-65bdf46db7-5x9qj    1/1     Running            0          2d pod/ml-pipeline-ui-66cc4cffb6-cmsdb                   1/1     Running            0          2d pod/ml-pipeline-viewer-crd-6db65ccc4-wqlzj            1/1     Running            0          2d pod/ml-pipeline-visualizationserver-9c47576f4-bqmx4   1/1     Running            0          2d service/ml-pipeline                       ClusterIP   10.100.170.170   <none>        8888/TCP,8887/TCP   2d service/ml-pipeline-ui                    ClusterIP   10.100.38.71     <none>        80/TCP              2d service/ml-pipeline-visualizationserver   ClusterIP   10.100.61.47     <none>        8888/TCP            2d deployment.apps/ml-pipeline                       1/1     1            1           2d deployment.apps/ml-pipeline-persistenceagent      1/1     1            1           2d deployment.apps/ml-pipeline-scheduledworkflow     1/1     1            1           2d deployment.apps/ml-pipeline-ui                    1/1     1            1           2d deployment.apps/ml-pipeline-viewer-crd            1/1     1            1           2d deployment.apps/ml-pipeline-visualizationserver   1/1     1            1           2d replicaset.apps/ml-pipeline-6b88c67994                      1         1         1       2d replicaset.apps/ml-pipeline-persistenceagent-64d74dfdbf     1         1         1       2d replicaset.apps/ml-pipeline-scheduledworkflow-65bdf46db7    1         1         1       2d replicaset.apps/ml-pipeline-ui-66cc4cffb6                   1         1         1       2d replicaset.apps/ml-pipeline-viewer-crd-6db65ccc4            1         1         1       2d replicaset.apps/ml-pipeline-visualizationserver-9c47576f4   1         1         1       2d

访问 KFP UI

Kubeflow Pipelines UI 用于管理和跟踪群集上的实验、作业和运行。您可以使用端口转发从网关节点访问 Kubeflow Pipelines UI。

设置到 KFP UI 服务的端口转发

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

  1. 使用以下命令验证 KFP UI 服务是否正在运行:

    kubectl -n kubeflow get service ml-pipeline-ui NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE ml-pipeline-ui   ClusterIP   10.100.38.71   <none>        80/TCP    2d22h
  2. 运行以下命令以设置到 KFP UI 服务的端口转发。这会将 KFP UI 转发到网关节点上的端口 8080,并允许您从浏览器访问 KFP UI。

    kubectl port-forward -n kubeflow service/ml-pipeline-ui 8080:80

    如果没有活动,远程计算机的端口转发将中断。如果您的控制面板无法获取日志或更新,请再次运行此命令。如果命令返回错误,请确保您尝试使用的端口上没有正在运行的进程。

访问 KFP UI 服务

访问 KFP UI 的方法取决于您的网关节点类型。

  • 作为网关节点的本地计算机

    1. 在浏览器中访问控制面板,如下所示:

      http://localhost:8080
    2. 选择 Pipelines (管道) 以访问管道 UI。

  • Amazon EC2 实例作为网关节点

    1. 您需要在Amazon EC2实例上设置 SSH 隧道,以便从本地计算机的浏览器访问 Kubeflow 控制面板。

      从本地计算机的新终端会话中,运行以下命令。将 <public-DNS-of-gateway-node> 替换为在 Amazon EC2 控制台中找到的实例的 IP 地址。您还可以使用公有 DNS。将<path_to_key> 替换为用于访问网关节点的 pem 密钥的路径。

      public_DNS_address=<public-DNS-of-gateway-node> key=<path_to_key> on Ubuntu: ssh -i ${key} -L 9000:localhost:8080 ubuntu@${public_DNS_address} or on Amazon Linux: ssh -i ${key} -L 9000:localhost:8080 ec2-user@${public_DNS_address}
    2. 在浏览器中访问控制面板。

      http://localhost:9000
    3. 选择 Pipelines (管道) 以访问 KFP UI。

为 KFP Pod 和 SageMaker 服务创建 IAM 用户/角色

现在,您有一个设置了 Kubeflow 的 Kubernetes 集群。要运行SageMaker适用于 Kubeflow Pipelines 的 组件,Kubeflow Pipeline Pod 需要访问 SageMaker。在本节中,您将创建将由 Kubeflow Pipeline Pod 和 使用的 IAM 用户/角色SageMaker。

创建 KFP 执行角色

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

  1. 使用以下命令在Amazon EKS集群上启用 OIDC 支持。将 <cluster_name> 替换为您的集群的名称,并将<cluster_region> 替换为您的集群所在的区域。

    eksctl utils associate-iam-oidc-provider --cluster <cluster-name> \         --region <cluster-region> --approve
  2. 运行以下命令以获取 OIDC 发布者 URL。此 URL 的格式为 https://oidc.eks.<region>.amazonaws.com/id/<OIDC_ID>

    aws eks describe-cluster --region <cluster-region> --name <cluster-name> --query "cluster.identity.oidc.issuer" --output text
  3. 运行以下命令以创建名为 trust.json的文件。将 <OIDC_URL>替换为您的 OIDC 发布者 URL。请勿在https:// OIDC 发布者 URL 中包含 。将 <AWS_account_number> 替换为您的 AWS 账号。

    OIDC_URL="<OIDC-URL>" AWS_ACC_NUM="<AWS-account-number>" # Run this to create trust.json file cat <<EOF > trust.json {   "Version": "2012-10-17",   "Statement": [     {       "Effect": "Allow",       "Principal": {         "Federated": "arn:aws:iam::${AWS_ACC_NUM}:oidc-provider/${OIDC_URL}"       },       "Action": "sts:AssumeRoleWithWebIdentity",       "Condition": {         "StringEquals": {           "${OIDC_URL}:aud": "sts.amazonaws.com",           "${OIDC_URL}:sub": "system:serviceaccount:kubeflow:pipeline-runner"         }       }     }   ] } EOF
  4. 使用以下命令创建名为kfp-example-pod-role 的 IAM trust.json 角色。KFP Pod 使用此角色从 KFP 组件创建SageMaker作业。记下输出中返回的 ARN。

    aws iam create-role --role-name kfp-example-pod-role --assume-role-policy-document file://trust.json aws iam attach-role-policy --role-name kfp-example-pod-role --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess aws iam get-role --role-name kfp-example-pod-role --output text --query 'Role.Arn'
  5. 使用以下命令编辑您的管道运行程序服务账户。

    kubectl edit -n kubeflow serviceaccount pipeline-runner
  6. 在 文件中,添加以下Amazon EKS角色注释并将 替换为<role_arn>您的角色 ARN。

    eks.amazonaws.com/role-arn: <role-arn>
  7. 添加角色注释后,Amazon EKS您的文件应类似于以下内容。保存文件。

    apiVersion: v1 kind: ServiceAccount metadata:   annotations:     eks.amazonaws.com/role-arn: <role-arn>     kubectl.kubernetes.io/last-applied-configuration: |       {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"labels":{"app":"pipeline-runner","app.kubernetes.io/component":"pipelines-runner","app.kubernetes.io/instance":"pipelines-runner-0.2.0","app.kubernetes.io/managed-by":"kfctl","app.kubernetes.io/name":"pipelines-runner","app.kubernetes.io/part-of":"kubeflow","app.kubernetes.io/version":"0.2.0"},"name":"pipeline-runner","namespace":"kubeflow"}}   creationTimestamp: "2020-04-16T05:48:06Z"   labels:     app: pipeline-runner     app.kubernetes.io/component: pipelines-runner     app.kubernetes.io/instance: pipelines-runner-0.2.0     app.kubernetes.io/managed-by: kfctl     app.kubernetes.io/name: pipelines-runner     app.kubernetes.io/part-of: kubeflow     app.kubernetes.io/version: 0.2.0   name: pipeline-runner   namespace: kubeflow   resourceVersion: "11787"   selfLink: /api/v1/namespaces/kubeflow/serviceaccounts/pipeline-runner   uid: d86234bd-7fa5-11ea-a8f2-02934be6dc88 secrets: - name: pipeline-runner-token-dkjrk

创建SageMaker执行角色

作业使用kfp-example-sagemaker-execution-role IAMSageMaker 角色访问 AWS 资源。有关更多信息,请参阅 IAM 权限部分。您在运行管道时提供此角色作为输入参数。

运行以下命令以创建角色。记下输出中返回的 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'

添加对其他 IAM 用户或角色的访问权限

如果您使用直观的 IDE(如 Jupyter)或希望组织中的其他人使用您设置的集群,您也可以向他们提供访问权限。以下步骤使用SageMaker笔记本运行此工作流程。笔记本实例是运行 JupyterSageMaker 笔记本应用程序的完全托管Amazon EC2的计算实例。您可以使用笔记本实例创建和管理 Jupyter 笔记本以创建 ML 工作流程。您可以使用 KFP Python 开发工具包或 CLI 定义、编译、部署和运行管道。如果您未使用 SageMaker 笔记本运行 Jupyter,则需要安装 AWS CLI 和最新版本的 kubectl

  1. 按照创建 SageMaker 笔记本实例中的步骤创建SageMaker笔记本实例(如果您还没有笔记本实例)。为此实例授予 IAM 角色 S3FullAccess 权限。

  2. Amazon EKS集群使用 IAM 用户和角色来控制对集群的访问。这些规则是在名为 的配置映射中实现的aws-auth。只有有权访问集群的用户/角色才能编辑此配置映射。从网关节点的命令行运行以下命令以获取您创建的笔记本实例的 IAM 角色。将 <instance-name> 替换为您的实例的名称。

    aws sagemaker describe-notebook-instance --notebook-instance-name <instance-name> --region <region> --output text --query 'RoleArn'

    此命令以 格式输出 IAMarn:aws:iam::<account-id>:role/<role-name> 角色 ARN。记下此 ARN。

  3. 运行以下命令以附加 IAM 角色的策略。将<role-name> <role-name> 替换为 ARN 中的 。

    aws iam attach-role-policy --role-name <role-name> --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess aws iam attach-role-policy --role-name <role-name> --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy aws iam attach-role-policy --role-name <role-name> --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
  4. eksctl 提供了用于读取和编辑aws-auth配置映射的命令。system:masters 是默认用户组之一。您将用户添加到此组。system:masters 组具有集群的超级用户权限。您还可以创建具有更严格权限的组,也可以将权限直接绑定到用户。将 <IAM-Role-arn> 替换为 IAM 角色的 ARN。<your_username> 可以是任何唯一用户名。

    eksctl create iamidentitymapping \     --cluster <cluster-name> \     --arn <IAM-Role-arn> \     --group system:masters \     --username <your-username> \     --region <region>
  5. 在实例上SageMaker打开 Jupyter 笔记本,然后运行以下命令以验证它是否有权访问集群。

    aws eks --region <region> update-kubeconfig --name <cluster-name> kubectl -n kubeflow get all | grep pipeline

运行 Kubeflow 管道

现在,网关节点和Amazon EKS集群的设置已完成,您可以创建分类管道。要创建管道,您需要定义并编译它。然后,您部署它并使用它来运行工作流程。您可以在 Python 中定义管道,并使用 KFP 控制面板、KFP CLI 或 Python 开发工具包来编译、部署和运行工作流程。Kubeflow Github 存储库中提供了 MNIST 分类管道示例的完整代码。要使用它,请将示例 Python 文件克隆到您的网关节点。

准备数据集

要运行管道,您需要将数据提取预处理脚本上传到 Amazon S3 存储桶。此存储桶和此示例的所有资源必须位于 us-east-1 Amazon 区域中。如果您没有存储桶,请使用创建存储桶中的步骤创建一个存储桶

从您在网关节点上克隆的 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

使用SageMaker组件创建 Kubeflow 管道

Kubeflow Github 存储库中提供了 MNIST 分类管道的完整代码。要使用它,请将示例 Python 文件克隆到您的网关节点。

输入参数

完整的 MNIST 分类管道具有特定于运行的参数,您必须在创建运行时为其提供值。您必须为管道的每个组件提供这些参数。使用其他管道时也可以更新这些参数。我们已为示例分类管道文件中的所有参数提供默认值。

以下是运行示例管道需要传递的唯一参数。要传递这些参数,请在创建新运行时更新其条目。

  • Role-ARN:这必须是在您的 AWS 账户中具有完全SageMaker访问权限的 IAM 角色的 ARN。使用 的 kfp-example-pod-roleARN。

  • Bucket (存储桶):这是您将Amazon S3文件上传到的kmeans_preprocessing.py存储桶的名称。

您可以使用 KFP UI 调整任何输入参数并再次触发运行。

编译和部署您的管道

在 Python 中定义管道后,必须先将管道编译为中间表示形式,然后才能将其提交到 Kubeflow Pipelines 服务。中间表示形式是 YAML 文件(压缩为 tar.gz 文件)形式的工作流程规范。您需要 KFP 开发工具包来编译管道。

安装 KFP 开发工具包

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

  1. 按照 Kubeflow 管道文档中的说明安装 KFP 开发工具包。

  2. 使用以下命令验证是否已安装 KFP 开发工具包:

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

    which dsl-compile

编译管道

您可以通过三种方式与 Kubeflow 管道进行交互:KFP UI、KFP CLI 或 KFP 开发工具包。以下部分说明了使用 KFP UI 和 CLI 的工作流程。

从网关节点完成以下操作以编译管道。

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

  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 将管道的运行组织为实验。您可以选择指定实验名称。如果您未指定运行,则运行将在 Default experiment (默认实验) 下列出。

  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. 使用以下命令创建运行。KFP CLI 运行命令当前不支持在创建运行时指定输入参数。您需要先更新 Python 管道文件中的参数,然后再进行编译。将<experiment-name><job-name> 替换为任何名称。将 <pipeline-id> 替换为您提交的管道的 ID。将 <your-role-arn> 替换为 的 kfp-example-pod-roleARN。将 <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. 在左侧面板中,选择 Pipelines (管道) 选项卡。

  2. 在右上角,选择 UploadPipeline

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

  4. 选择 Upload a file (上传文件) 并输入您使用 CLI 或 Python 开发工具包创建的 tar.gz 文件的路径。

  5. 在左侧面板中,选择 Pipelines (管道) 选项卡。

  6. 查找您创建的管道。

  7. 选择+CreateRun

  8. 输入您的输入参数。

  9. 选择运行

运行预测

部署分类管道后,您可以针对 Deploy (部署) 组件创建的终端节点运行分类预测。使用 KFP UI 检查输出构件sagemaker-deploy-model-endpoint_name。下载 .tgz 文件以提取终端节点名称或检查您使用的区域中的SageMaker 控制台。

配置权限以运行预测

如果要从网关节点运行预测,请跳过此部分。

  1. 要使用任何其他计算机运行预测,请将sagemaker:InvokeEndpoint 权限分配给客户端计算机使用的 IAM 角色或 IAM 用户。此权限用于运行预测。

  2. 在网关节点上,运行以下命令以创建策略文件:

    cat <<EoF > ./sagemaker-invoke.json {     "Version": "2012-10-17",     "Statement": [         {             "Effect": "Allow",             "Action": [                 "sagemaker:InvokeEndpoint"             ],             "Resource": "*"         }     ] } EoF
  3. 将策略附加到客户端节点的 IAM 角色或 IAM 用户。

  4. 如果您的客户端计算机附加了 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>
  5. 如果您的客户端计算机已配置 IAM 用户凭证,请运行以下命令。将 <your_IAM_user_name> 替换为客户端节点的 IAM 用户的名称。将 <path-to-sagemaker-invoke-json> 替换为您创建的策略文件的路径。

    aws iam put-user-policy --user-name <your-IAM-user-name> --policy-name sagemaker-invoke-for-worker --policy-document file://<path-to-sagemaker-invoke-json>

运行预测

  1. 从具有以下内容的客户端计算机创建一个名为mnist-predictions.py 的 Python 文件。替换ENDPOINT_NAME变量。此脚本加载 MNIST 数据集,然后从这些数字创建 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. 按如下所示运行 Python 文件:

    python mnist-predictions.py

查看结果和日志

当管道正在运行时,您可以选择任何组件来检查执行详细信息,例如输入和输出。这将列出创建的资源的名称。

如果成功处理了 KFP 请求并创建了 SageMaker 作业,则 KFP UI 中的组件日志会提供指向在 中创建的作业的链接SageMaker。如果成功创建作业,也会提供 CloudWatch 日志。

如果您在同一集群上运行的管道任务太多,则可能会看到一条错误消息,指示您没有足够的 Pod 可用。要解决此问题,请登录到您的网关节点并删除您未使用的管道创建的 Pod,如下所示:

kubectl get pods -n kubeflow kubectl delete pods -n kubeflow <name-of-pipeline-pod>

Cleanup

完成使用管道后,您需要清除资源。

  1. 从 KFP 控制面板中,选择 Terminate (终止) 以终止管道运行(如果管道未正确退出)。

  2. 如果 Terminate (终止) 选项不起作用,请登录网关节点并手动终止管道运行创建的所有 Pod,如下所示:

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