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

使用 SageMaker 组件

在本教程中,您将使用 SageMaker Components for Kubeflow Pipelines 运行管道,在 SageMaker 上使用 Kmeans 和 MNIST 数据集训练分类模型。该工作流使用 Kubeflow Pipelines 作为编排工具,使用 SageMaker 来执行工作流的每个步骤。该示例取自现有的 SageMaker 示例,并进行了修改以与 SageMaker Components for Kubeflow Pipelines 配合使用。

您可以使用 Amazon SDK for Python (Boto3) 在 Python 中定义管道,然后使用 KFP 控制面板、KFP CLI 或 Boto3 来编译、部署和运行工作流。Kubeflow GitHub 存储库中提供了 MNIST 分类管道示例的完整代码。要使用该代码,请将 Python 文件克隆到您的网关节点。

您可以在 GitHub 上找到其他 SageMaker Kubeflow Pipelines 示例。有关所用组件的信息,请参阅 KubeFlow Pipelines GitHub 存储库

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

创建 SageMaker 执行角色

kfp-example-sagemaker-execution-role IAM 角色是由 SageMaker 作业代入的用于访问 Amazon 资源的运行时角色。在以下命令中,您可以创建一个名为 kfp-example-sagemaker-execution-role 的 IAM 执行角色,附加两个托管策略(AmazonSageMakerFullAccess、AmazonS3FullAccess),然后与 SageMaker 建立信任关系以授予 SageMaker 作业访问这些 Amazon 资源的权限。

运行管道时,您可以将此角色作为输入参数提供。

运行以下命令以创建角色。记下在输出中返回的 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 服务。中间表示形式是压缩成 tar.gz 文件的 YAML 文件形式的工作流规范。您需要 KFP SDK 来编译管道。

安装 KFP SDK

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

  1. 按照 Kubeflow Pipelines 文档中的说明安装 KFP SDK。

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

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

    which dsl-compile

编译管道

您可以通过三种方式与 Kubeflow Pipelines 进行交互:KFP UI、KFP CLI 或 KFP SDK。以下几节说明了使用 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 将管道的运行组织为实验。您可以选择指定实验名称。如果您未指定名称,则运行将列在默认实验下。

  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 运行命令目前不支持在创建运行时指定输入参数。进行编译之前,您需要更新 Amazon SDK for Python (Boto3) 管道文件中的参数。将 <experiment-name><job-name> 替换为任意名称。将 <pipeline-id> 替换为所提交管道的 ID。将 <your-role-arn> 替换为 kfp-example-pod-role 的 ARN。将 <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 或使用 Amazon SDK for Python (Boto3) 创建的 tar.gz 文件的路径。

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

  6. 找到您创建的管道。

  7. 选择 +CreateRun

  8. 输入您的输入参数。

  9. 选择运行

运行预测

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

配置运行预测的权限

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

要使用任何其他计算机运行预测,请为客户端计算机使用的 IAM 角色分配 sagemaker:InvokeEndpoint 权限。
  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 且包含以下内容的 Amazon 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. 按如下方式运行 Amazon SDK for Python (Boto3) 文件:

    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>

清理

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

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

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

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