

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

# SageMaker AI 工作流程
工作流

在扩展机器学习 (ML) 操作时，您可以使用 Amazon A SageMaker I 完全托管的工作流程服务来实施机器学习生命周期的持续集成和部署 (CI/CD) 实践。利用 Pipelines SDK，您可以选择管道步骤并将其集成到统一的解决方案中，从而实现从数据准备到模型部署的模型构建流程自动化。对于基于 Kubernetes 的架构，你可以在 Kubernetes 集群上安装 SageMaker 人工智能运算符，使用 Kubernetes API 和命令行 Kubernetes 工具（例如）在本地创建 SageMaker 人工智能作业。`kubectl`借助 Kubeflow 管道的 SageMaker AI 组件，您可以通过 Kubeflow 管道创建和监控原生 SageMaker AI 作业。可从 Kubeflow Pipelines 用户界面访问 SageMaker 来自 AI 的作业参数、状态和输出。最后，如果要安排批处理作业，则可以使用 Amazon Batch 作业队列集成或基于 Jupyter 笔记本的工作流服务，按照您定义的计划启动独立运行或常规运行。

总而言之， SageMaker AI 提供了以下工作流程技术：
+ [管道](pipelines.md)：用于构建和管理机器学习管道的工具。
+ [Kubernetes 编排](kubernetes-workflows.md): Kubernetes 集群的 SageMaker AI 自定义运算符和 Kubeflow Pipelines 的组件。
+ [SageMaker 笔记本职位](notebook-auto-run.md)：按需或按计划非交互式批量运行 Jupyter 笔记本。

您还可以利用与 SageMaker AI 集成的其他服务来构建您的工作流程。这些选项包含以下服务：
+ [气流工作流程](https://sagemaker.readthedocs.io/en/stable/workflows/airflow/index.html)：导出 SageMaker APIs 用于创建和管理 Airflow 工作流程的配置。
+ [Amazon Step Functions](https://sagemaker.readthedocs.io/en/stable/workflows/step_functions/index.html)：Python 中的多步机器学习工作流程，无需单独配置资源即可编排 SageMaker AI 基础架构。
+ [Amazon Batch](https://docs.amazonaws.cn/batch/latest/userguide/getting-started-sagemaker.html)：将 SageMaker AI 训练作业提交到 Amazon Batch 作业队列，在那里你可以对作业进行优先级排序和安排，使其在计算环境中运行。

有关管理 SageMaker 训练和推理的更多信息，请参阅 [Amaz SageMaker on Python 软件开发工具包工作流程](https://sagemaker.readthedocs.io/en/stable/workflows/index.html)。

**Topics**
+ [

# 管道
](pipelines.md)
+ [

# Kubernetes 编排
](kubernetes-workflows.md)
+ [

# SageMaker 笔记本职位
](notebook-auto-run.md)
+ [

# 安排您的 ML 工作流程
](workflow-scheduling.md)
+ [

# Amazon Batch 支持 A SageMaker I 训练作业
](training-job-queues.md)

# 管道
ML Pipelines

Amaz SageMaker on Pipelines 是一项专门构建的工作流程编排服务，用于自动进行机器学习 (ML) 开发。

与其他 Amazon 工作流程产品相比，管道具有以下优势：

**自动扩展无服务器基础架构**您无需管理底层编排基础架构即可运行 Pipelines，这使您可以专注于核心机器学习任务。 SageMaker AI 会根据您的机器学习工作负载的要求自动配置、扩展和关闭管道编排计算资源。

**直观的用户体验**可以通过您选择的界面创建和管理管道：可视化编辑器 APIs、SDK 或 JSON。您可以 drag-and-drop在 Amazon SageMaker Studio 可视化界面中执行各种机器学习步骤来创作您的管道。下面的截图显示了 Studio 管道可视化编辑器。

![\[Studio 中流水线的可视 drag-and-drop界面屏幕截图。\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/pipelines/pipelines-studio-overview.png)


如果您更喜欢以编程方式管理机器学习工作流程， SageMaker Python SDK 可提供高级编排功能。有关更多信息，请参阅 Python 软件开发工具包[ SageMaker 文档中的 Amaz](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html) SageMaker on Pipelines。

**Amazon 集成** Pipelines 提供与所有 SageMaker AI 功能和其他 Amazon 服务的无缝集成，可自动执行数据处理、模型训练、微调、评估、部署和监控作业。您可以将 SageMaker AI 功能整合到您的管道中，并使用深度链接在这些功能中进行导航，从而大规模创建、监控和调试您的机器学习工作流程。

**降低成本**使用 Pipelines，您只需为 SageMaker Studio 环境和由管道编排的底层作业（例如 SageMaker 训练、 SageMaker 处理、 SageMaker AI 推理和 Amazon S3 数据存储）付费。

**可审计性和任务流水线追踪功能**：有了 Pipelines，您可以使用内置的版本控制功能来跟踪管道更新与执行的历史记录。Amazon SageMaker ML Lineage Tracking 可帮助您分析 end-to-end机器学习开发生命周期中的数据源和数据使用者。

**Topics**
+ [

# 管道概述
](pipelines-overview.md)
+ [

# Pipelines 操作
](pipelines-build.md)

# 管道概述
管道概述

Amazon SageMaker AI 管道是定向无环图 (DAG) 中一系列相互关联的步骤，这些步骤是使用 drag-and-drop UI 或 Pipelin [es SDK](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html) 定义的。您还可以使用[管道定义 JSON 模式](https://aws-sagemaker-mlops.github.io/sagemaker-model-building-pipeline-definition-JSON-schema/)构建管道。此 DAG JSON 定义提供了管道中每个步骤的要求和关系信息。管道 DAG 的结构由步骤之间的数据依赖关系决定。当一个步骤的输出属性作为输入传递给另一个步骤时，就会产生这些数据依赖关系。下图是管道 DAG 的示例：

![\[\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/pipeline-full.png)


**示例 DAG 包括以下步骤：**

1. `AbaloneProcess` 是[处理](https://docs.amazonaws.cn/sagemaker/latest/dg/build-and-manage-steps.html#step-type-processing)步骤的一个实例，在用于训练的数据上运行预处理脚本。例如，脚本可以填充缺失值，对数值数据进行规范化处理，或将数据分成训练数据集、验证数据集和测试数据集。

1. `AbaloneTrain` 是[训练](https://docs.amazonaws.cn/sagemaker/latest/dg/build-and-manage-steps.html#step-type-training)步骤的一个实例，用于配置超参数，并根据预处理的输入数据训练模型。

1. `AbaloneEval` 是[处理](https://docs.amazonaws.cn/sagemaker/latest/dg/build-and-manage-steps.html#step-type-processing)步骤的另一个实例，用于评估模型的准确性。本步骤展示了一个数据依赖的例子 - 本步骤使用 `AbaloneProcess` 的测试数据集输出。

1. `AbaloneMSECond`是 Condit [i](https://docs.amazonaws.cn/sagemaker/latest/dg/build-and-manage-steps.html#step-type-condition) on 步骤的一个实例，在本例中，该步骤进行检查以确保模型评估的 mean-square-error结果低于特定限制。如果模型不符合标准，管道运行就会停止。

1. 管道运行按以下步骤进行：

   1. `AbaloneRegisterModel`，其中 SageMaker AI 调用[RegisterModel](https://docs.amazonaws.cn/sagemaker/latest/dg/build-and-manage-steps.html#step-type-register-model)步骤将模型作为版本控制的模型包组注册到 Amazon SageMaker 模型注册表中。

   1. `AbaloneCreateModel`，其中 SageMaker AI 调用创建模型的[CreateModel](https://docs.amazonaws.cn/sagemaker/latest/dg/build-and-manage-steps.html#step-type-create-model)步骤，为批量转换做准备。在中`AbaloneTransform`， SageMaker AI 调用 “[转换](https://docs.amazonaws.cn/sagemaker/latest/dg/build-and-manage-steps.html#step-type-transform)” 步骤，对您指定的数据集生成模型预测。

以下主题介绍了 Pipelines 的基本概念。有关描述这些概念的实施的教程，请参阅[Pipelines 操作](pipelines-build.md)。

**Topics**
+ [

# 管道结构和执行
](build-and-manage-pipeline.md)
+ [

# IAM 访问管理
](build-and-manage-access.md)
+ [

# 为 Pipelines 设置跨账户支持
](build-and-manage-xaccount.md)
+ [

# Pipeline 参数
](build-and-manage-parameters.md)
+ [

# Pipelines 步骤
](build-and-manage-steps.md)
+ [

# Lift-and-shift 使用 @step 装饰器的 Python 代码
](pipelines-step-decorator.md)
+ [

# 在步骤之间传递数据
](build-and-manage-propertyfile.md)
+ [

# 缓存管道步骤
](pipelines-caching.md)
+ [

# 管道步骤的重试策略
](pipelines-retry-policy.md)
+ [

# 选择性执行管道步骤
](pipelines-selective-ex.md)
+ [

# 基准计算、偏差检测和生命周期以及 Amazon Pi ClarifyCheck pelin SageMaker es 中的 QualityCheck 步骤
](pipelines-quality-clarify-baseline-lifecycle.md)
+ [

# 安排管道运行
](pipeline-eventbridge.md)
+ [

# 亚马逊 SageMaker 实验集成
](pipelines-experiments.md)
+ [

# 使用本地模式运行管道
](pipelines-local-mode.md)
+ [

# 对亚马逊 SageMaker 管道进行故障排除
](pipelines-troubleshooting.md)

# 管道结构和执行
结构和执行

**Topics**
+ [

## 管线结构
](#build-and-manage-pipeline-structure)
+ [

## 使用并行配置执行管道
](#build-and-manage-pipeline-execution)

## 管线结构
结构

Amaz SageMaker on Pipelines 实例由`name`、`parameters`、和组成`steps`。`(account, region)` 对中的管道名称必须是唯一的。步骤定义中使用的所有参数都必须在管道中定义。列出的管道步骤会根据彼此之间的数据依赖关系自动确定其执行顺序。管道服务会解析数据依赖 DAG 中各步骤之间的关系，创建一系列执行完成的步骤。以下是管道结构的示例。

**警告**  
通过可视化编辑器或 SageMaker AI Python SDK 构建管道时，请勿在管道参数或任何步骤定义字段（例如环境变量）中包含敏感信息。这些字段在未来通过 `DescribePipeline` 请求返回时将可见。

```
from sagemaker.workflow.pipeline import Pipeline
  
  pipeline_name = f"AbalonePipeline"
  pipeline = Pipeline(
      name=pipeline_name,
      parameters=[
          processing_instance_type, 
          processing_instance_count,
          training_instance_type,
          model_approval_status,
          input_data,
          batch_data,
      ],
      steps=[step_process, step_train, step_eval, step_cond],
  )
```

## 使用并行配置执行管道
Execution

默认情况下，管线会执行所有可并行运行的步骤。创建或更新管线以及启动或重试管线执行时，您可以使用 `ParallelismConfiguration` 属性来控制此行为。

每个执行都会应用并行配置。例如，如果启动了两个执行，则每个执行最多可以同时运行 50 个步骤，总共可以同时运行 100 个步骤。此外，启动、重试或更新执行时指定的 `ParallelismConfiguration` 优先于管道中定义的并行配置。

**Example 使用 `ParallelismConfiguration` 创建管道执行**  

```
pipeline = Pipeline(
        name="myPipeline",
        steps=[step_process, step_train]
    )

  pipeline.create(role, parallelism_config={"MaxParallelExecutionSteps": 50})
```

# IAM 访问管理
访问控制

以下各节描述了亚马逊 SageMaker 管道的 Amazon Identity and Access Management (IAM) 要求。有关如何实施这些权限的示例，请参阅[先决条件](define-pipeline.md#define-pipeline-prereq)。

**Topics**
+ [

## 管道角色权限
](#build-and-manage-role-permissions)
+ [

## 管道步骤权限
](#build-and-manage-step-permissions)
+ [

## 使用 Amazon S3 存储桶进行 CORS 配置
](#build-and-manage-cors-s3)
+ [

## 自定义 Pipelines 作业的访问管理
](#build-and-manage-step-permissions-prefix)
+ [

## 自定义对管道版本的访问权限
](#build-and-manage-step-permissions-version)
+ [

## 使用管道的服务控制策略
](#build-and-manage-scp)

## 管道角色权限


您的管道需要一个 IAM 管道执行角色，该角色将在您创建管道时传递给管道。 您用于创建管道的 SageMaker AI 实例的角色必须具有指定管道执行角色的`iam:PassRole`权限的策略。这是因为实例需要权限才能将您的管道执行角色传递给 Pipelines 服务，以用于创建和运行管道。有关 IAM 角色的更多信息，请参阅 [IAM 角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html)。

您的管道执行角色需要以下权限：
+ 您可以为管道中的任何 SageMaker AI 任务步骤使用唯一角色或自定义角色（而不是默认使用的管道执行角色）。请确保您的管道执行角色已添加一个策略，该策略具有指定每个角色的`iam:PassRole`权限。
+  管道中每种作业类型的 `Create` 和 `Describe` 权限。
+  Amazon S3 使用 `JsonGet` 函数的权限。您可以使用基于资源的策略和基于身份的策略来控制对 Amazon S3 资源的访问。基于资源的策略会应用到 Amazon S3 存储桶，并授予 Pipelines 对存储桶的访问权限。基于身份的策略使您的管道能够从您的账户调用 Amazon S3。有关基于资源的策略和基于身份的策略的更多信息，请参阅[基于身份的策略和基于资源的策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)。

  ```
  {
      "Action": [
          "s3:GetObject"
      ],
      "Resource": "arn:aws:s3:::<your-bucket-name>/*",
      "Effect": "Allow"
  }
  ```

## 管道步骤权限


管道包括运行 A SageMaker I 作业的步骤。为了让管道步骤运行这些作业，需要在您的账户中设置一个 IAM 角色，以提供对所需资源的访问权限。此角色由您的管道传递给 SageMaker AI 服务主体。有关 IAM 角色的更多信息，请参阅 [IAM 角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html)。

默认情况下，每个步骤都扮演管道执行角色。您可以选择将不同的角色传递给管道中的任何步骤。这样可以确保每个步骤中的代码不会影响其他步骤中使用的资源，除非管道定义中指定的两个步骤之间存在直接关系。您可以在为步骤定义处理器或估算器时传递这些角色。有关如何在这些定义中包含这些角色的示例，请参阅 [SageMaker AI Python SDK 文档](https://sagemaker.readthedocs.io/en/stable/overview.html#using-estimators)。

## 使用 Amazon S3 存储桶进行 CORS 配置


为确保映像以可预测的方式从 Amazon S3 存储桶导入到管道中，必须向从中导入映像的 Amazon S3 存储桶添加 CORS 配置。此部分说明了如何为 Amazon S3 存储桶设置所需的 CORS 配置。Pipelines 所需的 XML `CORSConfiguration` 与[输入映像数据的 CORS 要求](sms-cors-update.md)中的不同，不过您仍可借助其中的信息，进一步了解 Amazon S3 存储桶的 CORS 要求。

对托管映像的 Amazon S3 存储桶使用以下 CORS 配置代码。有关如何配置 CORS 的说明，请参阅《Amazon Simple Storage Service 用户指南》中的[配置跨源资源共享（CORS）](https://docs.amazonaws.cn/AmazonS3/latest/user-guide/add-cors-configuration.html)。如果您使用 Amazon S3 控制台将策略添加到存储桶，则必须使用 JSON 格式。

**JSON**

```
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "Access-Control-Allow-Origin"
        ]
    }
]
```

**XML**

```
<CORSConfiguration>
 <CORSRule>
   <AllowedHeader>*</AllowedHeader>
   <AllowedOrigin>*</AllowedOrigin>
   <AllowedMethod>PUT</AllowedMethod>
   <ExposeHeader>Access-Control-Allow-Origin</ExposeHeader>
 </CORSRule>
</CORSConfiguration>
```

下面的 GIF 演示了 Amazon S3 文档中使用 Amazon S3 控制台添加 CORS 头策略的说明。

![\[关于如何使用 Amazon S3 管理控制台添加 CORS 标头策略的图片。\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/sms/gifs/cors-config.gif)


## 自定义 Pipelines 作业的访问管理


您可以进一步自定义 IAM 策略，以便组织中的选定成员可以运行任意或所有管道步骤。例如，您可以向某些用户授予创建训练作业的权限，向另一组用户授予创建处理作业的权限，以及向所有用户授予运行其余步骤的权限。要使用此特征，请选择一个以您的作业名称为前缀的自定义字符串。您的管理员在允许 ARNs 的前面加上前缀，而您的数据科学家则在管道实例化中包含此前缀。由于获允许用户的 IAM 策略包含带有指定前缀的作业 ARN，因此您的管道步骤的后续作业具有继续操作所需的权限。作业前缀默认情况下关闭，您必须在 `Pipeline` 类中启用此选项才能使用它。

对于关闭了前缀的作业，作业名称的格式如图所示，该名称由下表中所述的字段串联而成：

`pipelines-<executionId>-<stepNamePrefix>-<entityToken>-<failureCount>`


| 字段 | 定义 | 
| --- | --- | 
|  pipelines   |  静态字符串，始终前置。此字符串将管道编排服务标识为作业的来源。  | 
|  executionId  |  正在运行的管道实例的随机缓冲区。  | 
|  stepNamePrefix  |  用户指定的步骤名称（在管道步骤的 `name` 参数中给出），限于前 20 个字符。  | 
|  entityToken  |  随机令牌，用于确保步骤实体的幂等性。  | 
|  failureCount  |  当前为完成作业而尝试重试的次数。  | 

在这种情况下，作业名称前面没有自定义前缀，相应的 IAM 策略必须与此字符串匹配。

对于开启作业前缀的用户，底层作业名称采用以下形式，自定义前缀指定为 `MyBaseJobName`：

*<MyBaseJobName>*-*<executionId>*-*<entityToken>*-*<failureCount>*

自定义前缀取代了静态`pipelines`字符串，以帮助您缩小可以作为管道一部分运行 SageMaker AI 作业的用户的选择范围。

**前缀长度限制**

作业名称具有特定于各个管道步骤的内部长度限制。此约束还限定了允许的前缀长度。前缀长度要求如下：


| 管道步骤 | 前缀长度 | 
| --- | --- | 
|   `[TrainingStep](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#trainingstep)`, `[ModelStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#step-collections)`, `[TransformStep](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#transformstep)`, `[ProcessingStep](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#processingstep)`, `[ClarifyCheckStep](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#clarifycheckstep)`, `[QualityCheckStep](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#qualitycheckstep)`, `[RegisterModelStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#step-collections)`   |  38  | 
|  `[TuningStep](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#tuningstep)`, `[AutoML](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#automlstep)`  |  6  | 

### 将作业前缀应用于 IAM 策略


您的管理员创建 IAM 策略，允许具有特定前缀的用户创建作业。以下示例策略允许数据科学家在使用 `MyBaseJobName` 前缀的情况下创建训练作业。

```
{
    "Action": "sagemaker:CreateTrainingJob",
    "Effect": "Allow",
    "Resource": [
        "arn:aws:sagemaker:region:account-id:*/MyBaseJobName-*"
    ]
}
```

### 将作业前缀应用于管道实例化


您可以使用作业实例类的 `*base_job_name` 参数来指定前缀。

**注意**  
创建管道步骤之前，您可以将带有 `*base_job_name` 参数的作业前缀传递给作业实例。此作业实例包含使作业作为管道中的一个步骤运行的必要信息。该参数因所使用的作业实例而异。以下列表显示了每种管道步骤类型应使用的参数：  
对于 `[Estimator](https://sagemaker.readthedocs.io/en/stable/api/training/estimators.html)` (`[TrainingStep](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#trainingstep)`)、`[Processor](https://sagemaker.readthedocs.io/en/stable/api/training/processing.html)` (`[ProcessingStep](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#processingstep)`) 和 `[AutoML](https://sagemaker.readthedocs.io/en/stable/api/training/automl.html)` (`[AutoMLStep](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#automlstep)`) 类，使用 `base_job_name`
对于 `[Tuner](https://sagemaker.readthedocs.io/en/stable/api/training/tuner.html)` 类 (`[TuningStep](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#tuningstep)`)，使用 `tuning_base_job_name`
对于 `[Transformer](https://sagemaker.readthedocs.io/en/stable/api/inference/transformer.html)` 类 (`[TransformStep](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#transformstep)`)，使用 `transform_base_job_name`
对于 `[QualityCheckStep](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#qualitycheckstep)` (Quality Check) 和 `[ClarifyCheckstep](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#clarifycheckstep)` (Clarify Check) 类，使用 `[CheckJobConfig](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#checkjobconfig)` 的 `base_job_name`
对于 `[Model](https://sagemaker.readthedocs.io/en/stable/api/inference/model.html)` 类，使用的参数取决于您在将结果传递给 `[ModelStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#step-collections)` 之前是运行 `create` 还是 `register`  
如果您调用 `create`，则自定义前缀来自您构造模型（即 `Model(name=)`）时的 `name` 参数
如果您调用 `register`，则自定义前缀来自您调用 `register`（即 `my_model.register(model_package_name=)`）时的 `model_package_name` 参数

以下示例说明了如何为新的训练作业实例指定前缀。

```
# Create a job instance
xgb_train = Estimator(
    image_uri=image_uri,
    instance_type="ml.m5.xlarge",
    instance_count=1,
    output_path=model_path,
    role=role,
    subnets=["subnet-0ab12c34567de89f0"],
    base_job_name="MyBaseJobName"
    security_group_ids=["sg-1a2bbcc3bd4444e55"],
    tags = [ ... ]
    encrypt_inter_container_traffic=True, 
)

# Attach your job instance to a pipeline step
step_train = TrainingStep(
    name="TestTrainingJob",
    estimator=xgb_train, 
    inputs={
        "train": TrainingInput(...), 
        "validation": TrainingInput(...) 
    }
)
```

作业前缀默认情况下关闭。要选择使用此特征，请使用 `PipelineDefinitionConfig` 的 `use_custom_job_prefix` 选项，如以下代码片段所示：

```
from sagemaker.workflow.pipeline_definition_config import PipelineDefinitionConfig
        
# Create a definition configuration and toggle on custom prefixing
definition_config = PipelineDefinitionConfig(use_custom_job_prefix=True);

# Create a pipeline with a custom prefix
 pipeline = Pipeline(
     name="MyJobPrefixedPipeline",
     parameters=[...]
     steps=[...]
     pipeline_definition_config=definition_config
)
```

创建并运行管道。以下示例创建并运行管道，还演示了如何关闭作业前缀并重新运行管道。

```
pipeline.create(role_arn=sagemaker.get_execution_role())

# Optionally, call definition() to confirm your prefixed job names are in the built JSON
pipeline.definition()
pipeline.start()
      
# To run a pipeline without custom-prefixes, toggle off use_custom_job_prefix, update the pipeline 
# via upsert() or update(), and start a new run
definition_config = PipelineDefinitionConfig(use_custom_job_prefix=False)
pipeline.pipeline_definition_config = definition_config
pipeline.update()
execution = pipeline.start()
```

同样，您可以为现有管道开启该特征，然后启动使用作业前缀的新运行。

```
definition_config = PipelineDefinitionConfig(use_custom_job_prefix=True)
pipeline.pipeline_definition_config = definition_config
pipeline.update()
execution = pipeline.start()
```

最后，您可以在管道执行时调用 `list_steps` 来查看自定义前缀的作业。

```
steps = execution.list_steps()

prefixed_training_job_name = steps['PipelineExecutionSteps'][0]['Metadata']['TrainingJob']['Arn']
```

## 自定义对管道版本的访问权限


您可以使用`sagemaker:PipelineVersionId`条件键授予对特定版本的 Amazon Pi SageMaker pelines 的自定义访问权限。例如，以下策略仅允许对版本 ID 为 6 及以上的管道启动执行或更新管道版本。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Sid": "AllowStartPipelineExecution",
        "Effect": "Allow",
        "Action": [
            "sagemaker:StartPipelineExecution",
            "sagemaker:UpdatePipelineVersion"
        ],
        "Resource": "*",
        "Condition": {
            "NumericGreaterThanEquals": {
                "sagemaker:PipelineVersionId": 6
            }
        }
    }
}
```

------

有关支持的条件键的更多信息，请参阅 [Amazon A SageMaker I 的条件键](https://docs.amazonaws.cn//service-authorization/latest/reference/list_amazonsagemaker.html#amazonsagemaker-policy-keys)。

## 使用管道的服务控制策略


服务控制策略 (SCPs) 是一种组织策略，可用于管理组织中的权限。 SCPs 集中控制组织中所有账户的最大可用权限。通过在组织中使用 Pipelines，您可以确保数据科学家无需与 Amazon 控制台交互即可管理您的管道执行。 

如果您的 SCP 使用的 VPC 限制访问 Amazon S3，则需要采取措施允许您的管道访问其他 Amazon S3 资源。

要允许 Pipelines 使用 `JsonGet` 功能访问 VPC 外部的 Amazon S3，请更新组织的 SCP，确保使用 Pipelines 的角色可以访问 Amazon S3。为此，请使用主体标签和条件键为管道执行器通过管道执行角色使用的角色创建一个异常情况。

**允许 Pipelines 访问 VPC 以外的 Amazon S3**

1. 按照[标记 IAM 用户和角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_tags.html)中的步骤为管道执行角色创建唯一标签。

1. 使用您创建的标签的 `Aws:PrincipalTag IAM` 条件键，在您的 SCP 中授予一个例外。有关更多信息，请参阅[创建、更新和删除服务控制策略](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_scps_create.html)。

# 为 Pipelines 设置跨账户支持
建立跨账户支持

Amazon Pipel SageMaker ines 的跨账户支持使您能够与使用不同 Amazon 账户运营的其他团队或组织在机器学习管道上进行协作。通过设置跨账户管道共享，您可以对管道授予受控访问权限，允许其他账户查看管道详情、触发执行和监控运行。以下主题介绍如何设置跨账户管道共享、共享资源可用的不同权限策略，以及如何通过对 SageMaker AI 的直接 API 调用来访问共享管道实体并与之交互。

## 设置跨账户管道共享
设置跨账户管道共享

SageMaker AI 使用 R [es Amazon ource Access Manager](https://docs.amazonaws.cn/ram/latest/userguide/what-is.html) (Amazon RAM) 来帮助你安全地跨账户共享管道实体。

### 创建资源共享


1. 通过 [Amazon RAM 控制台](https://console.amazonaws.cn/ram/home)选择**创建资源共享**。

1. 指定资源共享详细信息时，请选择管道资源类型，并选择要共享的一个或多个管道。当您与任何其他账户共享管道时，其所有执行也会被隐式共享。

1. 将权限与资源共享关联。选择默认只读权限策略或扩展的管道执行权限策略。有关更多详细信息，请参阅 [Pipelines 资源的权限策略](#build-and-manage-xaccount-permissions)。
**注意**  
如果您选择扩展管道执行策略，请注意共享账户调用的任何启动、停止和重试命令都使用共享管道的 Amazon 账户中的资源。

1. 使用 Amazon 账户指定 IDs 要向其授予共享资源访问权限的账户。

1. 查看您的资源共享配置，然后选择**创建资源共享**。可能需要几分钟时间来完成资源共享和主体关联。

有关更多信息，请参阅《Amazon Resource Access Manager 用户指南》**中的[共享 Amazon 资源](https://docs.amazonaws.cn/ram/latest/userguide/getting-started-sharing.html)。

### 获取对资源共享邀请的回复


设置资源共享和主体关联后，指定的 Amazon 账户会收到加入资源共享的邀请。 Amazon 账户必须接受邀请才能访问任何共享资源。

有关通过接受资源共享邀请的更多信息 Amazon RAM，请参阅 [Resource Acc *ess Manager 用户指南*中的使用共享 Amazon 资源](https://docs.amazonaws.cn/ram/latest/userguide/getting-started-shared.html)。Amazon 

## Pipelines 资源的权限策略


创建资源共享时，请选择两个支持的权限策略之一，将其与 SageMaker AI 管道资源类型相关联。这两个策略都授予对任何选定管道及其所有执行的访问权限。

### 默认只读权限


`AWSRAMDefaultPermissionSageMakerPipeline` 策略允许执行以下只读操作：

```
"sagemaker:DescribePipeline"
"sagemaker:DescribePipelineDefinitionForExecution"   
"sagemaker:DescribePipelineExecution"
"sagemaker:ListPipelineExecutions"
"sagemaker:ListPipelineExecutionSteps"
"sagemaker:ListPipelineParametersForExecution"
"sagemaker:Search"
```

### 扩展的管道执行权限


`AWSRAMPermissionSageMakerPipelineAllowExecution` 策略包括默认策略中的所有只读权限，还允许共享账户启动、停止和重试管道执行。

**注意**  
使用扩展管道执行权限策略时，请注意 Amazon 资源使用情况。使用此策略时，允许共享账户启动、停止和重试管道执行。用于共享管道执行的所有资源均由拥有者账户使用。

扩展的管道执行权限策略允许执行以下操作：

```
"sagemaker:DescribePipeline"
"sagemaker:DescribePipelineDefinitionForExecution"   
"sagemaker:DescribePipelineExecution"
"sagemaker:ListPipelineExecutions"
"sagemaker:ListPipelineExecutionSteps"
"sagemaker:ListPipelineParametersForExecution"
"sagemaker:StartPipelineExecution"
"sagemaker:StopPipelineExecution"
"sagemaker:RetryPipelineExecution"
"sagemaker:Search"
```

## 通过直接 API 调用访问共享管道实体


跨账户渠道共享设置完成后，您可以使用管道 ARN 调用以下 SageMaker API 操作：

**注意**  
只有当 API 命令包含在与资源共享关联的权限中时，才能调用这些命令。如果您选择`AWSRAMPermissionSageMakerPipelineAllowExecution`策略，则启动、停止和重试命令将使用共享管道的 Amazon 账户中的资源。
+ [DescribePipeline](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribePipeline.html)
+ [DescribePipelineDefinitionForExecution](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribePipelineDefinitionForExecution.html)
+ [DescribePipelineExecution](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribePipelineExecution.html)
+ [ListPipelineExecutions](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_ListPipelineExecutions.html)
+ [ListPipelineExecutionSteps](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_ListPipelineExecutionSteps.html)
+ [ListPipelineParametersForExecution](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_ListPipelineParametersForExecution.html)
+ [StartPipelineExecution](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_StartPipelineExecution.html)
+ [StopPipelineExecution](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_StopPipelineExecution.html)
+ [RetryPipelineExecution](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_RetryPipelineExecution.html)

# Pipeline 参数


您可以使用参数在管道定义中引入变量。您可以在整个管道定义过程中引用您定义的参数。参数具有默认值，您可以在开始执行管道时通过指定参数值来覆盖该值。默认值必须是与参数类型匹配的实例。步骤定义中使用的所有参数都必须在管道定义中定义。本主题介绍可以定义的参数以及如何执行这些参数。

Amaz SageMaker on Pipelines 支持以下参数类型：
+  `ParameterString` - 表示字符串参数。
+  `ParameterInteger` - 表示整数参数。
+  `ParameterFloat` - 表示浮点参数。
+  `ParameterBoolean` - 表示布尔 Python 类型。

参数采用以下格式：

```
<parameter> = <parameter_type>(
    name="<parameter_name>",
    default_value=<default_value>
)
```

下面的示例显示了一个示例参数实施。

```
from sagemaker.workflow.parameters import (
    ParameterInteger,
    ParameterString,
    ParameterFloat,
    ParameterBoolean
)

processing_instance_count = ParameterInteger(
    name="ProcessingInstanceCount",
    default_value=1
)
```

创建管道时传递参数，如以下示例所示。

```
pipeline = Pipeline(
    name=pipeline_name,
    parameters=[
        processing_instance_count
    ],
    steps=[step_process]
)
```

还可将不同于默认值的参数值传递给管道执行，如以下示例所示。

```
execution = pipeline.start(
    parameters=dict(
        ProcessingInstanceCount="2",
        ModelApprovalStatus="Approved"
    )
)
```

你可以使用 SageMaker Python SDK 函数来操作参数，比如`[ sagemaker.workflow.functions.Join](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.functions.Join)`。有关参数的更多信息，请参阅[ SageMaker 管道参数](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#parameters)。

有关管道参数的已知限制，请参阅 Amaz [on Pyth SageMaker on](https://sagemaker.readthedocs.io/en/stable) SD *[K 中的限制-参数化](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#parameterization)*。

# Pipelines 步骤
Pipelines 步骤

Pipelines 由多个步骤组成。这些步骤使用属性定义管道采取的操作以及各步骤之间的关系。下一页将介绍步骤的类型、属性以及它们之间的关系。

**Topics**
+ [

# 增加一个步骤
](build-and-manage-steps-types.md)
+ [

# 添加集成
](build-and-manage-steps-integration.md)
+ [

## 步骤属性
](#build-and-manage-properties)
+ [

## 步骤并行
](#build-and-manage-parallelism)
+ [

## 步骤之间的数据依赖性
](#build-and-manage-data-dependency)
+ [

## 步骤之间的自定义依赖关系
](#build-and-manage-custom-dependency)
+ [

## 自定义映像一步到位
](#build-and-manage-images)

# 增加一个步骤


下文介绍了每种步骤类型的要求，并提供了步骤的实现示例，以及如何将步骤添加到 Pipelines 中。这些都不是可行的实施方案，因为它们没有提供所需的资源和投入。有关实施这些步骤的教程，请参阅[Pipelines 操作](pipelines-build.md)。

**注意**  
您还可以使用 `@step` 装饰器将本地机器学习代码转换为 Pipelines 步骤，从而从本地机器学习代码中创建步骤。有关更多信息，请参阅 [@step decorator](#step-type-custom)。

Amaz SageMaker on Pipelines 支持以下步骤类型：
+ [执行代码](#step-type-executecode)

  [Processing](#step-type-processing)
+ [训练](#step-type-training)
+ [优化](#step-type-tuning)
+ [AutoML](#step-type-automl)
+ [`Model`](#step-type-model)
+ [`Create model`](#step-type-create-model)
+ [`Register model`](#step-type-register-model)
+ [`Deploy model (endpoint)`](#step-type-deploy-model-endpoint)
+ [转换](#step-type-transform)
+ [条件](#step-type-condition)
+ [`Callback`](#step-type-callback)
+ [Lambda](#step-type-lambda)
+ [`ClarifyCheck`](#step-type-clarify-check)
+ [`QualityCheck`](#step-type-quality-check)
+ [EMR](#step-type-emr)
+ [笔记本作业](#step-type-notebook-job)
+ [Fail](#step-type-fail)

## @step decorator


如果您想在 Pipelines 用户界面中编排利用高级 SageMaker AI 功能或其他 Amazon 服务的自定义 ML 作业，请使用。 drag-and-drop [执行代码步骤](#step-type-executecode)

您可以使用 `@step` 装饰器从本地机器学习代码中创建一个步骤。测试代码后，您可以通过使用装饰器对其进行注释来将该函数转换为 SageMaker AI 管道步骤。`@step`当您将 `@step` 装饰功能的输出作为一个步骤传递给管道时，Pipelines 会创建并运行管道。您还可以创建一个多步骤 DAG 管道，其中包括一个或多个`@step`经过装饰的函数以及传统的 SageMaker AI 工作流步骤。有关如何使用 `@step` 装饰器创建步骤的更多详情，请参阅 [Lift-and-shift 使用 @step 装饰器的 Python 代码](pipelines-step-decorator.md)。

## 执行代码步骤
执行代码

在 Pipelines drag-and-drop UI 中，您可以使用 “**执行代码**” 步骤将自己的代码作为工作流步骤运行。您可以上传一个 Python 函数、脚本或笔记本，作为管道的一部分执行。如果您想编排利用高级 SageMaker AI 功能或其他 Amazon 服务的自定义 ML 作业，则应使用此步骤。

“**执行代码**” 步骤将文件上传到你的 Amazon A SageMaker I 默认 Amazon S3 存储桶。该存储桶可能未设置所需的跨源资源共享 (CORS) 权限。要了解有关配置 CORS 权限的更多信息，请参阅 [输入映像数据的 CORS 要求](sms-cors-update.md)。

“**执行代码”** 步骤使用 Amazon SageMaker 训练作业来运行您的代码。确保您的 IAM 角色具有 `sagemaker:DescribeTrainingJob` 和 `sagemaker:CreateTrainingJob` API 权限。要详细了解 Amazon A SageMaker I 的所有必需权限以及如何设置这些权限，请参阅[Amazon SageMaker AI API 权限：操作、权限和资源参考](api-permissions-reference.md)。

要使用管道设计器向管道添加执行代码步骤，请执行以下操作：

1. 按照中的说明打开 Amazon SageMaker Studio 控制台[启动亚马逊 SageMaker Studio](studio-updated-launch.md)。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. 选择**创建**。

1. 选择**空白**。

1. 在左侧边栏中选择**执行代码**，然后将其拖到画布上。

1. 在画布中，选择添加的**执行代码**步骤。

1. 在右侧边栏中，填写**设置**和**详情**标签中的表格。

1. 您可以上传单个文件来执行，也可以上传包含多个构件的压缩文件夹。

1. 对于单个文件上传，您可以为笔记本、python 函数或脚本提供可选参数。

1. 在提供 Python 函数时，必须以 `file.py:<function_name>` 格式提供处理程序。

1. 对于上传压缩文件夹，必须提供代码的相对路径，您还可以选择提供压缩文件夹内 `requirements.txt` 文件或初始化脚本的路径。

1. 如果画布上有任何步骤紧接在您添加的**执行代码**步骤之前，请单击并拖动光标从该步骤到**执行代码**步骤，以创建边缘。

1. 如果画布中包含任何紧接您添加的**执行代码**步骤的步骤，请单击并拖动光标从**执行代码**步骤到该步骤，以创建边缘。可以引用**执行代码**步骤的输出作为 Python 函数。

## 处理步骤
Processing

使用处理步骤创建用于数据处理的处理作业。有关处理作业的更多信息，请参阅[处理数据和评估模型](https://docs.amazonaws.cn/sagemaker/latest/dg/processing-job.html)。

------
#### [ Pipeline Designer ]

要使用管道设计器向管道添加处理步骤，请执行以下操作：

1. 按照中的说明打开 Amazon SageMaker Studio 控制台[启动亚马逊 SageMaker Studio](studio-updated-launch.md)。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. 选择**创建**。

1. 在左侧边栏中选择**处理数据**，然后将其拖到画布上。

1. 在画布中，选择添加的**处理数据**步骤。

1. 在右侧边栏中，填写**设置**和**详情**标签中的表格。有关这些选项卡中字段的信息，请参阅 [sagemaker.workflow.steps。 ProcessingStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.ProcessingStep)。

1. 如果画布上有任何步骤紧接在您添加的**处理数据**步骤之前，请单击并拖动光标从该步骤到**处理数据**步骤，以创建边缘。

1. 如果画布中包含任何紧接您添加的**处理数据**步骤的步骤，请单击并拖动光标从**处理数据**步骤到该步骤，以创建边缘。

------
#### [ SageMaker Python SDK ]

处理步骤需要处理器、定义处理代码的 Python 脚本、用于处理的输出以及作业参数。以下示例说明如何创建 `ProcessingStep` 定义。

```
from sagemaker.sklearn.processing import SKLearnProcessor

sklearn_processor = SKLearnProcessor(framework_version='1.0-1',
                                     role=<role>,
                                     instance_type='ml.m5.xlarge',
                                     instance_count=1)
```

```
from sagemaker.processing import ProcessingInput, ProcessingOutput
from sagemaker.workflow.steps import ProcessingStep

inputs = [
    ProcessingInput(source=<input_data>, destination="/opt/ml/processing/input"),
]

outputs = [
    ProcessingOutput(output_name="train", source="/opt/ml/processing/train"),
    ProcessingOutput(output_name="validation", source="/opt/ml/processing/validation"),
    ProcessingOutput(output_name="test", source="/opt/ml/processing/test")
]

step_process = ProcessingStep(
    name="AbaloneProcess",
    step_args = sklearn_processor.run(inputs=inputs, outputs=outputs,
        code="abalone/preprocessing.py")
)
```

**传递运行时参数**

以下示例说明如何将运行时参数从 PySpark处理器传递给`ProcessingStep`。

```
from sagemaker.workflow.pipeline_context import PipelineSession
from sagemaker.spark.processing import PySparkProcessor
from sagemaker.processing import ProcessingInput, ProcessingOutput
from sagemaker.workflow.steps import ProcessingStep

pipeline_session = PipelineSession()

pyspark_processor = PySparkProcessor(
    framework_version='2.4',
    role=<role>,
    instance_type='ml.m5.xlarge',
    instance_count=1,
    sagemaker_session=pipeline_session,
)

step_args = pyspark_processor.run(
    inputs=[ProcessingInput(source=<input_data>, destination="/opt/ml/processing/input"),],
    outputs=[
        ProcessingOutput(output_name="train", source="/opt/ml/processing/train"),
        ProcessingOutput(output_name="validation", source="/opt/ml/processing/validation"),
        ProcessingOutput(output_name="test", source="/opt/ml/processing/test")
    ],
    code="preprocess.py",
    arguments=None,
)


step_process = ProcessingStep(
    name="AbaloneProcess",
    step_args=step_args,
)
```

有关处理步骤要求的更多信息，请参阅 [sagemaker.workflow.steps。 ProcessingStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.ProcessingStep)文档。有关深入的示例，请参阅使用 [Amazon Pipelines 编排任务以训练和评估模型的 SageMaker 示例](https://github.com/aws/amazon-sagemaker-examples/blob/62de6a1fca74c7e70089d77e36f1356033adbe5f/sagemaker-pipelines/tabular/abalone_build_train_deploy/sagemaker-pipelines-preprocess-train-evaluate-batch-transform.ipynb)笔记本。*为特征工程定义处理步骤*部分包含更多信息。

------

## 训练步骤
训练

您可以使用训练步骤创建训练作业来训练模型。有关训练作业的更多信息，请参阅[使用 Amazon A SageMaker I 训练模型](https://docs.amazonaws.cn/sagemaker/latest/dg/how-it-works-training.html)。

训练步骤需要估算器以及训练和验证数据输入。

------
#### [ Pipeline Designer ]

要使用管道设计器向管道添加训练步骤，请执行以下操作：

1. 按照中的说明打开 Amazon SageMaker Studio 控制台[启动亚马逊 SageMaker Studio](studio-updated-launch.md)。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. 选择**创建**。

1. 选择**空白**。

1. 在左侧边栏中选择**训练模型**，然后将其拖到画布上。

1. 在画布中选择添加的**训练模型**步骤。

1. 在右侧边栏中，填写**设置**和**详情**标签中的表格。有关这些选项卡中字段的信息，请参阅 [sagemaker.workflow.steps。 TrainingStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.TrainingStep)。

1. 如果画布上有任何步骤紧接在您添加的**训练模型**步骤之前，请单击并拖动光标从该步骤到**训练模型**步骤，以创建边缘。

1. 如果画布上有任何步骤紧接着您添加的**训练模型**步骤，请单击并拖动光标从**训练模型**步骤到该步骤，以创建边缘。

------
#### [ SageMaker Python SDK ]

以下示例说明如何创建 `TrainingStep` 定义。有关训练步骤要求的更多信息，请参阅 [sagemaker.workflow.steps。 TrainingStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.TrainingStep)文档。

```
from sagemaker.workflow.pipeline_context import PipelineSession

from sagemaker.inputs import TrainingInput
from sagemaker.workflow.steps import TrainingStep

from sagemaker.xgboost.estimator import XGBoost

pipeline_session = PipelineSession()

xgb_estimator = XGBoost(..., sagemaker_session=pipeline_session)

step_args = xgb_estimator.fit(
    inputs={
        "train": TrainingInput(
            s3_data=step_process.properties.ProcessingOutputConfig.Outputs[
                "train"
            ].S3Output.S3Uri,
            content_type="text/csv"
        ),
        "validation": TrainingInput(
            s3_data=step_process.properties.ProcessingOutputConfig.Outputs[
                "validation"
            ].S3Output.S3Uri,
            content_type="text/csv"
        )
    }
)

step_train = TrainingStep(
    name="TrainAbaloneModel",
    step_args=step_args,
)
```

------

## 优化步骤
优化

您可以使用优化步骤来创建超参数优化作业，也称为超参数优化 (HPO)。超参数调整作业运行多个训练作业，每个作业产生一个模型版本。有关超参数优化的更多信息，请参阅[使用 SageMaker AI 自动调整模型](automatic-model-tuning.md)。

调优作业与管道的 SageMaker AI 实验相关联，而训练作业是作为试验创建的。有关更多信息，请参阅 [实验集成](pipelines-experiments.md)。

调整步骤需要[HyperparameterTuner](https://sagemaker.readthedocs.io/en/stable/api/training/tuner.html)和训练输入。您可以通过指定 `HyperparameterTuner` 的 `warm_start_config` 参数来再训练以前的优化作业。有关超参数优化和温启动的更多信息，请参阅[运行热启动超参数调优作业](automatic-model-tuning-warm-start.md)。

[你可以使用 sagemaker.workflow.step [s 的 get\$1top\$1model\$1s3\$1uri](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.TuningStep.get_top_model_s3_uri) 方法。 TuningStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.TuningStep)class，用于从性能最好的模型版本之一中获取模型工件。有关显示如何在 SageMaker AI 管道中使用调整步骤的笔记本，请参阅 [sagemaker-pipelines-tuning-step.ipynb。](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-pipelines/tabular/tuning-step/sagemaker-pipelines-tuning-step.ipynb)

**重要**  
Amaz SageMaker on Python SDK v2.48.0 和 Amazon Studio Classic v3.8.0 中引入了调整步骤。 SageMaker 使用调整步骤前必须更新 Studio Classic，否则不会显示管道 DAG。要更新 Studio Classic，请参阅 [关闭并更新 Amazon SageMaker Studio 经典版](studio-tasks-update-studio.md)。

以下示例说明如何创建 `TuningStep` 定义。

```
from sagemaker.workflow.pipeline_context import PipelineSession

from sagemaker.tuner import HyperparameterTuner
from sagemaker.inputs import TrainingInput
from sagemaker.workflow.steps import TuningStep

tuner = HyperparameterTuner(..., sagemaker_session=PipelineSession())
    
step_tuning = TuningStep(
    name = "HPTuning",
    step_args = tuner.fit(inputs=TrainingInput(s3_data="s3://amzn-s3-demo-bucket/my-data"))
)
```

**获取最佳模型版本**

以下示例说明如何使用 `get_top_model_s3_uri` 方法从优化作业中获取最佳模型版本。最多只能根据排名前50位的版本进行排名[HyperParameterTuningJobObjective](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_HyperParameterTuningJobObjective.html)。`top_k` 参数是版本的索引，其中 `top_k=0` 是性能最好的版本，`top_k=49` 是性能最差的版本。

```
best_model = Model(
    image_uri=image_uri,
    model_data=step_tuning.get_top_model_s3_uri(
        top_k=0,
        s3_bucket=sagemaker_session.default_bucket()
    ),
    ...
)
```

有关调整步骤要求的更多信息，请参阅 [sagemaker.workflow.steps。 TuningStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.TuningStep)文档。

## 微调步骤
微调

Fine-tuning 在新数据集上训练来自 Amaz SageMaker JumpStart on 的预训练基础模型。这个过程也称为转移学习，可以使用较小数据集和较短的训练时间生成准确模型。对模型进行微调时，可以使用默认数据集，也可以选择自己的数据。要了解有关微调基础模型的更多信息 JumpStart，请参阅[微调模型](jumpstart-fine-tune.md)。

微调步骤使用 Amazon SageMaker 训练作业自定义您的模型。确保您的 IAM 角色具有 `sagemaker:DescribeTrainingJob` 和 `sagemaker:CreateTrainingJob` API 权限，以便在管道中执行微调作业。API 权限，以便在管道中执行微调作业。要了解有关 Amazon A SageMaker I 所需权限以及如何设置权限的更多信息，请参阅[Amazon SageMaker AI API 权限：操作、权限和资源参考](api-permissions-reference.md)。

要使用 drag-and-drop编辑器向管道中添加 Fine-**Tune 模型**步骤，请执行以下步骤：

1. 按照 [启动亚马逊 SageMaker Studio](studio-updated-launch.md) 中的说明打开 Studio 管理控制台。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. 选择**创建**。

1. 选择**空白**。

1. 在左侧边栏中选择**微调模型**，然后将其拖动到画布上。

1. 在画布中，选择添加的**微调模型**步骤。

1. 在右侧边栏中，填写**设置**和**详情**标签中的表格。

1. 如果画布上有任何步骤紧接在您添加的**微调模型**步骤之前，请单击并拖动光标从该步骤到**微调模型**步骤，以创建边缘。

1. 如果画布上有任何步骤紧接着您添加的**微调模型**步骤，请单击并拖动光标从**微调模型**步骤到该步骤，以创建边缘。

## AutoML 步骤
AutoML

使用 [AutoML](https://sagemaker.readthedocs.io/en/stable/api/training/automl.html) API 创建 AutoML 作业以自动训练模型。有关 AutoML 任务的更多信息，请参阅[使用 Ama SageMaker zon Autopilot 自动开发模型](https://docs.amazonaws.cn/sagemaker/latest/dg/autopilot-automate-model-development.html)。

**注意**  
目前，AutoML 步骤仅支持[组合训练模式](https://docs.amazonaws.cn/sagemaker/latest/dg/autopilot-model-support-validation.html)。

以下示例说明如何使用 `AutoMLStep` 创建定义。

```
from sagemaker.workflow.pipeline_context import PipelineSession
from sagemaker.workflow.automl_step import AutoMLStep

pipeline_session = PipelineSession()

auto_ml = AutoML(...,
    role="<role>",
    target_attribute_name="my_target_attribute_name",
    mode="ENSEMBLING",
    sagemaker_session=pipeline_session) 

input_training = AutoMLInput(
    inputs="s3://amzn-s3-demo-bucket/my-training-data",
    target_attribute_name="my_target_attribute_name",
    channel_type="training",
)
input_validation = AutoMLInput(
    inputs="s3://amzn-s3-demo-bucket/my-validation-data",
    target_attribute_name="my_target_attribute_name",
    channel_type="validation",
)

step_args = auto_ml.fit(
    inputs=[input_training, input_validation]
)

step_automl = AutoMLStep(
    name="AutoMLStep",
    step_args=step_args,
)
```

**获取最佳模型版本**

AutoML 步骤会自动训练多个候选模型。使用 `get_best_auto_ml_model` 方法从 AutoML 作业中获取目标指标最佳的模型，如下所示。您还必须使用 IAM `role` 访问模型构件。

```
best_model = step_automl.get_best_auto_ml_model(role=<role>)
```

有关更多信息，请参阅 Pyth SageMaker on 软件开发工具包中的 [AutoML](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.automl_step.AutoMLStep) 步骤。

## 模型步骤
`Model`

`ModelStep`使用创建或注册 A SageMaker I 模型。有关`ModelStep`要求的更多信息，请参阅 sagemaker.workflow. [model\$1step。 ModelStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.model_step.ModelStep)文档。

### 创建模型


您可以使用创建 `ModelStep` A SageMaker I 模型。A `ModelStep` 需要模型工件和有关创建模型所需的 SageMaker AI 实例类型的信息。有关 SageMaker AI 模型的更多信息，请参阅使用 [Amazon A SageMaker I 训练模型](https://docs.amazonaws.cn/sagemaker/latest/dg/how-it-works-training.html)。

以下示例说明如何创建 `ModelStep` 定义。

```
from sagemaker.workflow.pipeline_context import PipelineSession
from sagemaker.model import Model
from sagemaker.workflow.model_step import ModelStep

step_train = TrainingStep(...)
model = Model(
    image_uri=pytorch_estimator.training_image_uri(),
    model_data=step_train.properties.ModelArtifacts.S3ModelArtifacts,
    sagemaker_session=PipelineSession(),
    role=role,
)

step_model_create = ModelStep(
   name="MyModelCreationStep",
   step_args=model.create(instance_type="ml.m5.xlarge"),
)
```

### 注册模型


您可以使用 a `ModelStep` 在 Amazon SageMaker 模型注册中注册`sagemaker.model.Model`或。`sagemaker.pipeline.PipelineModel``PipelineModel` 表示推理管道，是一个由处理推理请求的容器线性序列组成的模型。有关如何注册模型的更多信息，请参阅[利用模型注册中心进行模型注册部署](model-registry.md)。

以下示例说明如何创建一个注册 `PipelineModel` 的 `ModelStep`。

```
import time

from sagemaker.workflow.pipeline_context import PipelineSession
from sagemaker.sklearn import SKLearnModel
from sagemaker.xgboost import XGBoostModel

pipeline_session = PipelineSession()

code_location = 's3://{0}/{1}/code'.format(bucket_name, prefix)

sklearn_model = SKLearnModel(
   model_data=processing_step.properties.ProcessingOutputConfig.Outputs['model'].S3Output.S3Uri,
   entry_point='inference.py',
   source_dir='sklearn_source_dir/',
   code_location=code_location,
   framework_version='1.0-1',
   role=role,
   sagemaker_session=pipeline_session,
   py_version='py3'
)

xgboost_model = XGBoostModel(
   model_data=training_step.properties.ModelArtifacts.S3ModelArtifacts,
   entry_point='inference.py',
   source_dir='xgboost_source_dir/',
   code_location=code_location,
   framework_version='0.90-2',
   py_version='py3',
   sagemaker_session=pipeline_session,
   role=role
)

from sagemaker.workflow.model_step import ModelStep
from sagemaker import PipelineModel

pipeline_model = PipelineModel(
   models=[sklearn_model, xgboost_model],
   role=role,sagemaker_session=pipeline_session,
)

register_model_step_args = pipeline_model.register(
    content_types=["application/json"],
   response_types=["application/json"],
   inference_instances=["ml.t2.medium", "ml.m5.xlarge"],
   transform_instances=["ml.m5.xlarge"],
   model_package_group_name='sipgroup',
)

step_model_registration = ModelStep(
   name="AbaloneRegisterModel",
   step_args=register_model_step_args,
)
```

## 创建模型步骤
`Create model`

您可以使用 “创建模型” 步骤来创建 A SageMaker I 模型。有关 SageMaker AI 模型的更多信息，请参阅[使用 Amazon 训练模型 SageMaker](how-it-works-training.md)。

创建模型步骤需要模型工件和有关创建模型所需的 SageMaker AI 实例类型的信息。下面的示例展示了如何创建创建模型步骤定义。有关创建模型步骤要求的更多信息，请参阅 [sagemaker.workflow.steps。 CreateModelStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.CreateModelStep)文档。

------
#### [ Pipeline Designer ]

要在管道中添加创建模型步骤，请执行以下操作：

1. 按照 [启动亚马逊 SageMaker Studio](studio-updated-launch.md) 中的说明打开 Studio 管理控制台。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. 选择**创建**。

1. 选择**空白**。

1. 在左侧边栏中选择**创建模型**，然后将其拖到画布上。

1. 在画布中，选择添加的**创建模型**步骤。

1. 在右侧边栏中，填写**设置**和**详情**标签中的表格。有关这些选项卡中字段的信息，请参阅 [sagemaker.workflow.steps。 CreateModelStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.CreateModelStep)。

1. 如果画布上有任何步骤紧接在您添加的**创建模型**步骤之前，请单击并拖动光标从该步骤到**创建模型**步骤，以创建边缘。

1. 如果画布上有任何步骤紧接着您添加的**创建模型**步骤，请单击并拖动光标从**创建模型**步骤到该步骤，以创建边缘。

------
#### [ SageMaker Python SDK ]

**重要**  
从 AI SageMaker Py [模型步骤](#step-type-model) thon SDK 版本 2.90.0 起，我们建议使用创建模型。 `CreateModelStep`将继续在以前版本的 SageMaker Python SDK 中运行，但不再受支持。

```
from sagemaker.workflow.steps import CreateModelStep

step_create_model = CreateModelStep(
    name="AbaloneCreateModel",
    model=best_model,
    inputs=inputs
)
```

------

## 注册模型步骤
`Register model`

“注册模型” 步骤将模型注册到 “ SageMaker 模型注册表”。

------
#### [ Pipeline Designer ]

要使用管道设计器从管道中注册模型，请执行以下操作：

1. 按照中的说明打开 Amazon SageMaker Studio 控制台[启动亚马逊 SageMaker Studio](studio-updated-launch.md)。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. 选择**创建**。

1. 选择**空白**。

1. 在左侧边栏中选择**注册模型**，然后将其拖到画布上。

1. 在画布中，选择添加的**注册模型**步骤。

1. 在右侧边栏中，填写**设置**和**详情**标签中的表格。有关这些选项卡中字段的信息，请参阅 [sagemaker.workflow.step\$1collections。 RegisterModel](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.step_collections.RegisterModel)。

1. 如果画布上有任何步骤紧接在您添加的**注册模型**步骤之前，请单击并拖动光标从该步骤到**注册模型**步骤，以创建边缘。

1. 如果画布中包含任何紧接您添加的**注册模型**步骤的步骤，请单击并拖动光标从**注册模型**步骤到该步骤，以创建边缘。

------
#### [ SageMaker Python SDK ]

**重要**  
我们建议使用[模型步骤](#step-type-model)从 AI SageMaker Python SDK 版本 2.90.0 起注册模型。 `RegisterModel`将继续在以前版本的 SageMaker Python SDK 中运行，但不再受支持。

[你可以使用`RegisterModel`步骤注册 sagemaker.model.model 或 [sagemaker.pipeline。](https://sagemaker.readthedocs.io/en/stable/api/inference/model.html) PipelineModel](https://sagemaker.readthedocs.io/en/stable/api/inference/pipeline.html#pipelinemodel)使用 Amazon SageMaker 模型注册表。`PipelineModel` 表示推理管道，是一个由处理推理请求的容器线性序列组成的模型。

有关如何注册模型的更多信息，请参阅[利用模型注册中心进行模型注册部署](model-registry.md)。有关`RegisterModel`步骤要求的更多信息，请参阅 s [agemaker.workflow.step\$1collections。 RegisterModel](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.step_collections.RegisterModel)文档。

以下示例说明如何创建注册 `PipelineModel` 的 `RegisterModel` 步骤。

```
import time
from sagemaker.sklearn import SKLearnModel
from sagemaker.xgboost import XGBoostModel

code_location = 's3://{0}/{1}/code'.format(bucket_name, prefix)

sklearn_model = SKLearnModel(model_data=processing_step.properties.ProcessingOutputConfig.Outputs['model'].S3Output.S3Uri,
 entry_point='inference.py',
 source_dir='sklearn_source_dir/',
 code_location=code_location,
 framework_version='1.0-1',
 role=role,
 sagemaker_session=sagemaker_session,
 py_version='py3')

xgboost_model = XGBoostModel(model_data=training_step.properties.ModelArtifacts.S3ModelArtifacts,
 entry_point='inference.py',
 source_dir='xgboost_source_dir/',
 code_location=code_location,
 framework_version='0.90-2',
 py_version='py3',
 sagemaker_session=sagemaker_session,
 role=role)

from sagemaker.workflow.step_collections import RegisterModel
from sagemaker import PipelineModel
pipeline_model = PipelineModel(models=[sklearn_model,xgboost_model],role=role,sagemaker_session=sagemaker_session)

step_register = RegisterModel(
 name="AbaloneRegisterModel",
 model=pipeline_model,
 content_types=["application/json"],
 response_types=["application/json"],
 inference_instances=["ml.t2.medium", "ml.m5.xlarge"],
 transform_instances=["ml.m5.xlarge"],
 model_package_group_name='sipgroup',
)
```

如果未提供 `model`，则注册模型步骤需要使用估算器，如以下示例所示。

```
from sagemaker.workflow.step_collections import RegisterModel

step_register = RegisterModel(
    name="AbaloneRegisterModel",
    estimator=xgb_train,
    model_data=step_train.properties.ModelArtifacts.S3ModelArtifacts,
    content_types=["text/csv"],
    response_types=["text/csv"],
    inference_instances=["ml.t2.medium", "ml.m5.xlarge"],
    transform_instances=["ml.m5.xlarge"],
    model_package_group_name=model_package_group_name,
    approval_status=model_approval_status,
    model_metrics=model_metrics
)
```

------

## 部署模型（端点）步骤
`Deploy model (endpoint)`

在管道设计器中，使用部署模型（端点）步骤将模型部署到端点。您可以创建一个新端点或使用现有端点。实时推理非常适合有实时、交互式、低延迟要求的推理工作负载。您可以将模型部署到 SageMaker AI Hosting 服务，并获得可用于推理的实时终端节点。这些端点可完全托管，并支持自动扩缩。要了解有关 SageMaker AI 中实时推理的更多信息，请参阅[实时推理](realtime-endpoints.md)。

在管道中添加部署模型步骤之前，请确保您的 IAM 角色具有以下权限：
+ `sagemaker:CreateModel`
+ `sagemaker:CreateEndpointConfig`
+ `sagemaker:CreateEndpoint`
+ `sagemaker:UpdateEndpoint`
+ `sagemaker:DescribeModel`
+ `sagemaker:DescribeEndpointConfig`
+ `sagemaker:DescribeEndpoint`

要详细了解 SageMaker AI 所需的所有权限以及如何设置这些权限，请参阅[Amazon SageMaker AI API 权限：操作、权限和资源参考](api-permissions-reference.md)。

要在 drag-and-drop编辑器中向流水线添加模型部署步骤，请完成以下步骤：

1. 按照 [启动亚马逊 SageMaker Studio](studio-updated-launch.md) 中的说明打开 Studio 管理控制台。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. 选择**创建**。

1. 选择**空白**。

1. 在左侧边栏中选择**部署模型（端点）**，然后将其拖到画布上。

1. 在画布中，选择添加的**部署模型（端点）**步骤。

1. 在右侧边栏中，填写**设置**和**详情**标签中的表格。

1. 如果画布上有任何步骤紧接在您添加的**部署模型（端点）**步骤之前，请单击并拖动光标，从该步骤到**部署模型（端点）**步骤，以创建边缘。

1. 如果画布中包含任何紧接您添加的**部署模型（端点）**步骤的步骤，请单击并将光标从**部署模型（端点）**步骤拖动到该步骤，以创建边缘。

## 转换步骤
转换

您可以使用转换步骤进行批量转换，在整个数据集上运行推理。有关批量转换的更多信息，请参阅[利用推理管道进行批量转换](inference-pipeline-batch.md)。

转换步骤需要转换器和用于运行批量转换的数据。下面的示例显示了如何创建变换步骤定义。有关转换步骤要求的更多信息，请参阅 [sagemaker.workflow.steps。 TransformStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.TransformStep)文档。

------
#### [ Pipeline Designer ]

要使用 drag-and-drop可视化编辑器向管道添加批量转换步骤，请执行以下操作：

1. 按照 [启动亚马逊 SageMaker Studio](studio-updated-launch.md) 中的说明打开 Studio 管理控制台。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. 选择**创建**。

1. 选择**空白**。

1. 在左侧边栏中选择**部署模型（批量转换）**，然后将其拖到画布上。

1. 在画布中，选择添加的**部署模型（批量转换）**步骤。

1. 在右侧边栏中，填写**设置**和**详情**标签中的表格。有关这些选项卡中字段的信息，请参阅 [sagemaker.workflow.steps。 TransformStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.TransformStep)。

1. 如果画布上有任何步骤紧接在您添加的**部署模型（批量转换）**步骤之前，请单击并拖动光标从该步骤到**部署模型（批量转换）**步骤，以创建边缘。

1. 如果画布中包含任何紧接您添加的**部署模型（批量转换）**步骤的步骤，请单击并将光标从**部署模型（批量转换）**步骤拖动到该步骤，以创建边缘。

------
#### [ SageMaker Python SDK ]

```
from sagemaker.workflow.pipeline_context import PipelineSession

from sagemaker.transformer import Transformer
from sagemaker.inputs import TransformInput
from sagemaker.workflow.steps import TransformStep

transformer = Transformer(..., sagemaker_session=PipelineSession())

step_transform = TransformStep(
    name="AbaloneTransform",
    step_args=transformer.transform(data="s3://amzn-s3-demo-bucket/my-data"),
)
```

------

## 条件步骤
条件

您可以使用条件步骤来评估步骤属性的条件，以评估管道中下一步应该采取的操作。

需要一个条件步骤：
+ 一个条件列表。
+ 如果条件评估结果为 `true`，则要运行的步骤列表。
+ 如果条件评估结果为 `false`，则要运行的步骤列表。

------
#### [ Pipeline Designer ]

要使用 Pipeline Designer 向管道添加条件步骤，请执行以下操作：

1. 按照中的说明打开 Amazon SageMaker Studio 控制台[启动亚马逊 SageMaker Studio](studio-updated-launch.md)。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. 选择**创建**。

1. 选择**空白**。

1. 在左侧边栏中选择**条件**，然后将其拖到画布上。

1. 在画布中，选择添加的**条件**步骤。

1. 在右侧边栏中，填写**设置**和**详情**标签中的表格。有关这些选项卡中字段的信息，请参阅 [sagemaker.workflow.condition\$1step。 ConditionStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.condition_step.ConditionStep)。

1. 如果画布上有任何步骤紧接在您添加的**条件**步骤之前，请单击并拖动光标从该步骤到**条件**步骤，以创建边缘。

1. 如果画布中包含任何紧接您添加的**条件**步骤的步骤，请单击并拖动光标从**条件**步骤到该步骤，以创建边缘。

------
#### [ SageMaker Python SDK ]

 以下示例说明如何创建 `ConditionStep` 定义。

**限制**
+ 管道不支持使用嵌套条件步骤。不能将一个条件步骤作为另一个条件步骤的输入进行传递。
+ 一个条件步骤不能在两个分支中使用相同的步骤。如果需要在两个分支中使用相同的步骤功能，请复制该步骤并为其指定不同的名称。

```
from sagemaker.workflow.conditions import ConditionLessThanOrEqualTo
from sagemaker.workflow.condition_step import ConditionStep
from sagemaker.workflow.functions import JsonGet

cond_lte = ConditionLessThanOrEqualTo(
    left=JsonGet(
        step_name=step_eval.name,
        property_file=evaluation_report,
        json_path="regression_metrics.mse.value"
    ),
    right=6.0
)

step_cond = ConditionStep(
    name="AbaloneMSECond",
    conditions=[cond_lte],
    if_steps=[step_register, step_create_model, step_transform],
    else_steps=[]
)
```

有关`ConditionStep`要求的更多信息，请参阅 sagemaker.workflow.con [dition\$1step。 ConditionStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#conditionstep)API 参考。有关支持条件的更多信息，请参阅 *[A SageMaker I Python SDK 文档中的 Amazon Pipelin SageMaker es-条件](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#conditions)*。

------

## 回调步骤
`Callback`

使用`Callback`步骤向您的工作流程中添加并非由 Amazon Pipelines 直接提供的其他流程和 Amazon SageMaker 服务。当 `Callback` 步骤运行时，会发生以下过程：
+ Pipelines 向客户指定的 Amazon Simple Queue Service (Amazon SQS) 队列发送消息。该信息包含一个 Pipelines 生成的标记和客户提供的输入参数列表。发送信息后，Pipelines 会等待客户的回复。
+ 客户从 Amazon SQS 队列中检索消息并启动他们的自定义流程。
+ 该过程完成后，客户调用以下方法之一 APIs 并提交 Pipelines 生成的令牌：
  +  [SendPipelineExecutionStepSuccess](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_SendPipelineExecutionStepSuccess.html)，以及输出参数列表
  +  [SendPipelineExecutionStepFailure](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_SendPipelineExecutionStepFailure.html)，以及失败原因
+ API 调用会导致 Pipelines 继续执行管道流程或使流程失败。

有关`Callback`步骤要求的更多信息，请参阅 sagemaker.workflow.cal [lback\$1step。 CallbackStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.callback_step.CallbackStep)文档。有关完整的解决方案，请参阅[使用回调步骤扩展 SageMaker 管道以包含自定义步骤](https://www.amazonaws.cn/blogs/machine-learning/extend-amazon-sagemaker-pipelines-to-include-custom-steps-using-callback-steps/)。

**重要**  
`Callback`亚马逊 SageMaker Python SDK v2.45.0 和 Amazon SageMaker Studio Classic v3.6.2 中引入了步骤。在使用 `Callback` 步骤之前，您必须更新 Studio Classic，否则不会显示管道 DAG。要更新 Studio Classic，请参阅 [关闭并更新 Amazon SageMaker Studio 经典版](studio-tasks-update-studio.md)。

下面的示例展示了上述程序的执行过程。

```
from sagemaker.workflow.callback_step import CallbackStep

step_callback = CallbackStep(
    name="MyCallbackStep",
    sqs_queue_url="https://sqs.us-east-2.amazonaws.com/012345678901/MyCallbackQueue",
    inputs={...},
    outputs=[...]
)

callback_handler_code = '
    import boto3
    import json

    def handler(event, context):
        sagemaker_client=boto3.client("sagemaker")

        for record in event["Records"]:
            payload=json.loads(record["body"])
            token=payload["token"]

            # Custom processing

            # Call SageMaker AI to complete the step
            sagemaker_client.send_pipeline_execution_step_success(
                CallbackToken=token,
                OutputParameters={...}
            )
'
```

**注意**  
不得嵌套 `CallbackStep` 的输出参数。例如，如果您使用嵌套字典作为输出参数，则该字典将被视为单个字符串（例如 `{"output1": "{\"nested_output1\":\"my-output\"}"}`)。 如果您提供嵌套值，则当您尝试引用特定的输出参数时， SageMaker AI 会抛出不可重试的客户端错误。

**停止行为**

当 `Callback` 步骤运行时，管道进程不会停止。

当您使用正在运行的`Callback`步骤调用[StopPipelineExecution](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_StopPipelineExecution.html)管道进程时，Pipelines 会向 SQS 队列发送一条 Amazon SQS 消息。SQS 消息正文包含一个**状态**字段，该字段设置为 `Stopping`。以下是 SQS 消息正文示例。

```
{
  "token": "26vcYbeWsZ",
  "pipelineExecutionArn": "arn:aws:sagemaker:us-east-2:012345678901:pipeline/callback-pipeline/execution/7pinimwddh3a",
  "arguments": {
    "number": 5,
    "stringArg": "some-arg",
    "inputData": "s3://sagemaker-us-west-2-012345678901/abalone/abalone-dataset.csv"
  },
  "status": "Stopping"
}
```

您应该在 Amazon SQS 消息用户中添加逻辑，以便在收到消息后采取任何必要的措施（例如，资源清理）。然后添加对 `SendPipelineExecutionStepSuccess` 或 `SendPipelineExecutionStepFailure` 的调用。

只有当 Pipelines 收到这些调用时，它才会停止管道进程。

## Lambda 步骤
Lambda

您可以使用 Lambda 步骤来运行函数。 Amazon Lambda 您可以运行现有的 Lambda 函数，或者 SageMaker AI 可以创建并运行新的 Lambda 函数。如果您选择使用现有 Lambda 函数，则该函数必须与 SageMaker AI 管 Amazon Web Services 区域 道相同。[有关展示如何在 SageMaker AI 管道中使用 Lambda 步骤的笔记本，请参阅 sagemaker-pipelines-lambda-step .ipynb。](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-pipelines/tabular/lambda-step/sagemaker-pipelines-lambda-step.ipynb)

**重要**  
亚马逊 Pyth SageMaker on SDK v2.51.0 和亚马 SageMaker 逊 Studio Classic v3.9.1 中引入了 Lambda 步骤。您必须在使用 Lambda 步骤之前更新 Studio Classic，否则不会显示管道 DAG。要更新 Studio Classic，请参阅 [关闭并更新 Amazon SageMaker Studio 经典版](studio-tasks-update-studio.md)。

SageMaker AI 提供了 [sagemaker.lambda\$1Helper.Lambda 类来创建、更新、调用和删除 Lambda 函](https://sagemaker.readthedocs.io/en/stable/api/utility/lambda_helper.html)数。 `Lambda`具有以下签名。

```
Lambda(
    function_arn,       # Only required argument to invoke an existing Lambda function

    # The following arguments are required to create a Lambda function:
    function_name,
    execution_role_arn,
    zipped_code_dir,    # Specify either zipped_code_dir and s3_bucket, OR script
    s3_bucket,          # S3 bucket where zipped_code_dir is uploaded
    script,             # Path of Lambda function script
    handler,            # Lambda handler specified as "lambda_script.lambda_handler"
    timeout,            # Maximum time the Lambda function can run before the lambda step fails
    ...
)
```

sagemaker. [workflow.lambda\$1step。 LambdaStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.lambda_step.LambdaStep)类的`lambda_func`参数类型为`Lambda`。要调用现有 Lambda 函数，唯一的要求是将函数的 Amazon 资源名称 (ARN) 提供给 `function_arn`。如果不提供 `function_arn` 的值，则必须指定 `handler` 和以下内容之一：
+ `zipped_code_dir` - 压缩后的 Lambda 函数的路径

  `s3_bucket` - 要上传 `zipped_code_dir` 的 Amazon S3 存储桶
+ `script` - Lambda 函数脚本文件的路径

以下示例说明如何创建调用现有 Lambda 函数的 `Lambda` 步骤定义。

```
from sagemaker.workflow.lambda_step import LambdaStep
from sagemaker.lambda_helper import Lambda

step_lambda = LambdaStep(
    name="ProcessingLambda",
    lambda_func=Lambda(
        function_arn="arn:aws:lambda:us-west-2:012345678910:function:split-dataset-lambda"
    ),
    inputs={
        s3_bucket = s3_bucket,
        data_file = data_file
    },
    outputs=[
        "train_file", "test_file"
    ]
)
```

以下示例说明如何创建 `Lambda` 步骤定义，该定义使用 Lambda 函数脚本创建和调用 Lambda 函数。

```
from sagemaker.workflow.lambda_step import LambdaStep
from sagemaker.lambda_helper import Lambda

step_lambda = LambdaStep(
    name="ProcessingLambda",
    lambda_func=Lambda(
      function_name="split-dataset-lambda",
      execution_role_arn=execution_role_arn,
      script="lambda_script.py",
      handler="lambda_script.lambda_handler",
      ...
    ),
    inputs={
        s3_bucket = s3_bucket,
        data_file = data_file
    },
    outputs=[
        "train_file", "test_file"
    ]
)
```

**输入和输出**

如果您的 `Lambda` 函数有输入或输出，则还必须在 `Lambda` 步骤中定义这些输入或输出。

**注意**  
不得嵌套输入和输出参数。例如，如果您使用嵌套字典作为输出参数，则该字典将被视为单个字符串（例如 `{"output1": "{\"nested_output1\":\"my-output\"}"}`）。如果您提供嵌套值并尝试稍后再引用该值，则会引发不可重试的客户端错误。

定义 `Lambda` 步骤时，`inputs` 必须是键值对的字典。`inputs` 字典的每个值都必须是基元类型（字符串、整数或浮点数）。不支持嵌套对象。如果 `inputs` 值未定义，则默认为 `None`。

`outputs` 值必须是键列表。这些键是指 `Lambda` 函数输出中定义的字典。比如 `inputs`，这些键必须是基元类型，并且不支持嵌套对象。

**超时和停止行为**

`Lambda` 类有一个 `timeout` 参数，用于指定 Lambda 函数可以运行的最长时间。默认值为 120 秒，最大值为 10 分钟。如果在达到超时条件时 Lambda 函数正在运行，则 Lambda 步骤将失败；但 Lambda 函数会继续运行。

当 Lambda 步骤正在运行时，无法停止管道进程，因为无法停止 Lambda 步骤调用的 Lambda 函数。如果您在 Lambda 函数运行时停止进程，管道会等待函数完成或超时。这取决于哪个先发生。进程随即停止。如果 Lambda 函数完成，则管道进程状态为 `Stopped`。如果达到超时，则管道进程状态为 `Failed`。

## ClarifyCheck 步
`ClarifyCheck`

您可以使用 `ClarifyCheck` 步骤对照先前的基准进行基准偏差检查，以进行偏差分析和实现模型可解释性。然后，您可以使用 `model.register()` 方法生成和[注册基准](https://docs.amazonaws.cn/sagemaker/latest/dg/pipelines-quality-clarify-baseline-lifecycle.html#pipelines-quality-clarify-baseline-calculations)，并使用 `[step\$1args](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#model-step)` 将该方法的输出传递给 [模型步骤](#step-type-model)。Amazon SageMaker 模型监控器可以将这些偏差检查基准用于您的模型终端节点。因此，您无需单独提出[基线](https://docs.amazonaws.cn/sagemaker/latest/dg/model-monitor-create-baseline.html)建议。

`ClarifyCheck` 步骤还可以从模型注册表中提取偏差检查基准。该`ClarifyCheck`步骤使用 Clari SageMaker fy 预建容器。该容器提供一系列模型监测功能，包括约束建议和根据给定基线进行约束验证。有关更多信息，请参阅 [预建的 SageMaker 澄清容器](clarify-processing-job-configure-container.md)。

### 配置 ClarifyCheck 步骤
配置 `ClarifyCheck`

您可以将 `ClarifyCheck` 步骤配置为每次在管道中使用时仅执行以下一种类型的检查。
+ 数据偏差检查
+ 模型偏差检查
+ 模型可解释性检查

为此，请将 `clarify_check_config` 参数设置为以下检查类型值之一：
+ `DataBiasCheckConfig`
+ `ModelBiasCheckConfig`
+ `ModelExplainabilityCheckConfig`

该`ClarifyCheck`步骤启动一个处理作业，该作业运行 SageMaker AI Clarify 预建容器，并且需要[为支票和处理作业进行专用配置](https://docs.amazonaws.cn/sagemaker/latest/dg/clarify-configure-processing-jobs.html)。 `ClarifyCheckConfig`和`CheckJobConfig`是这些配置的辅助函数。这些辅助函数与 Clarify 处理 SageMaker 作业的计算方式一致，用于检查模型偏差、数据偏差或模型可解释性。有关更多信息，请参阅 [运行 Cl SageMaker arify 处理作业以实现偏见分析和可解释性](clarify-processing-job-run.md)。

### 控制偏差检查的步骤行为
配置 `ClarifyCheck`

`ClarifyCheck` 步骤需要以下两个布尔标志来控制其行为：
+ `skip_check`：此参数表示是否跳过针对先前基准的偏差检查。如果将其设置为 `False`，则配置的检查类型的先前基准必须可用。
+ `register_new_baseline`：此参数表示是否可以通过步骤属性 `BaselineUsedForDriftCheckConstraints` 访问新计算的基准。如果将其设置为 `False`，则配置的检查类型的先前基准也必须可用。这可以通过 `BaselineUsedForDriftCheckConstraints` 属性访问。

有关更多信息，请参阅 [基准计算、偏差检测和生命周期以及 Amazon Pi ClarifyCheck pelin SageMaker es 中的 QualityCheck 步骤](pipelines-quality-clarify-baseline-lifecycle.md)。

### 使用基准
基准

您可以选择指定 `model_package_group_name` 来定位现有基线。然后，`ClarifyCheck` 步骤在模型软件包组中最新批准的模型软件包上提取 `DriftCheckBaselines`。

或者，您可以通过 `supplied_baseline_constraints` 参数提供先前的基准。如果同时指定 `model_package_group_name` 和 `supplied_baseline_constraints`，则 `ClarifyCheck` 步骤将使用 `supplied_baseline_constraints` 参数指定的基准。

有关使用`ClarifyCheck`步骤要求的更多信息，请参阅 [sagemaker.workflow.steps。 ClarifyCheckStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.clarify_check_step.ClarifyCheckStep)在适用于 *Python 的亚马逊 SageMaker AI SageMaker 人工智能开发工具包*中。有关展示如何使用 Pipelines 中`ClarifyCheck`步骤的 Amazon SageMaker Studio Classic 笔记本，请参阅 [sagemaker-pipeline-model-monitor-clarify-steps.ipynb](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-pipelines/tabular/model-monitor-clarify-pipelines/sagemaker-pipeline-model-monitor-clarify-steps.ipynb)。

**Example 创建 `ClarifyCheck` 步骤以进行数据偏差检查**  

```
from sagemaker.workflow.check_job_config import CheckJobConfig
from sagemaker.workflow.clarify_check_step import DataBiasCheckConfig, ClarifyCheckStep
from sagemaker.workflow.execution_variables import ExecutionVariables

check_job_config = CheckJobConfig(
    role=role,
    instance_count=1,
    instance_type="ml.c5.xlarge",
    volume_size_in_gb=120,
    sagemaker_session=sagemaker_session,
)

data_bias_data_config = DataConfig(
    s3_data_input_path=step_process.properties.ProcessingOutputConfig.Outputs["train"].S3Output.S3Uri,
    s3_output_path=Join(on='/', values=['s3:/', your_bucket, base_job_prefix, ExecutionVariables.PIPELINE_EXECUTION_ID, 'databiascheckstep']),
    label=0,
    dataset_type="text/csv",
    s3_analysis_config_output_path=data_bias_analysis_cfg_output_path,
)

data_bias_config = BiasConfig(
    label_values_or_threshold=[15.0], facet_name=[8], facet_values_or_threshold=[[0.5]]  
)

data_bias_check_config = DataBiasCheckConfig(
    data_config=data_bias_data_config,
    data_bias_config=data_bias_config,
)h

data_bias_check_step = ClarifyCheckStep(
    name="DataBiasCheckStep",
    clarify_check_config=data_bias_check_config,
    check_job_config=check_job_config,
    skip_check=False,
    register_new_baseline=False
   supplied_baseline_constraints="s3://sagemaker-us-west-2-111122223333/baseline/analysis.json",
    model_package_group_name="MyModelPackageGroup"
)
```

## QualityCheck 步
`QualityCheck`

使用 `QualityCheck` 步骤对管道中的数据质量或模型质量进行[基线建议](https://docs.amazonaws.cn/sagemaker/latest/dg/model-monitor-create-baseline.html)和漂移检查。然后，您可以使用 `model.register()` 方法生成和[注册基准](https://docs.amazonaws.cn/sagemaker/latest/dg/pipelines-quality-clarify-baseline-lifecycle.html#pipelines-quality-clarify-baseline-calculations)，并使用 `[step\$1args](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#model-step)` 将该方法的输出传递给 [模型步骤](#step-type-model)。

Model Monitor 可以将这些偏差检查基准用于模型端点，这样您就无需单独提出基准建议。`QualityCheck` 步骤还可以从模型注册表中提取偏差检查基准。该`QualityCheck`步骤利用了 Amazon A SageMaker I 模型监控器预先构建的容器。该容器具有一系列模型监测功能，包括约束建议、统计数据生成和对照基线进行约束验证。有关更多信息，请参阅 [Amazon SageMaker 模型监控器预建容器](model-monitor-pre-built-container.md)。

### 配置 QualityCheck 步骤
配置 `QualityCheck`

您可以对 `QualityCheck` 步骤进行配置，使其每次在管道中使用时只运行以下一种检查类型。
+ 数据质量检查
+ 模型质量检查

您可以通过将 `quality_check_config` 参数设置为以下检查类型值之一来实现此目的：
+ `DataQualityCheckConfig`
+ `ModelQualityCheckConfig`

`QualityCheck` 步骤会启动一个处理作业，该作业运行 Model Monitor 预构建容器，并且需要专门的用于检查和处理作业的配置。`QualityCheckConfig` 和 `CheckJobConfig` 是这些配置的辅助功能。这些辅助功能与模型监控器为模型质量或数据质量监控创建基线的方式一致。有关 Model Monitor 基准建议的更多信息，请参阅[创建基准](model-monitor-create-baseline.md)和[创建模型质量基线](model-monitor-model-quality-baseline.md)。

### 控制偏差检查的步骤行为
配置 `QualityCheck`

`QualityCheck` 步骤需要以下两个布尔标志来控制其行为：
+ `skip_check`：此参数表示是否跳过针对先前基准的偏差检查。如果将其设置为 `False`，则配置的检查类型的先前基准必须可用。
+ `register_new_baseline`：此参数表示是否可以通过步骤属性 `BaselineUsedForDriftCheckConstraints` 和 `BaselineUsedForDriftCheckStatistics` 访问新计算的基准。如果将其设置为 `False`，则配置的检查类型的先前基准也必须可用。它们可以通过 `BaselineUsedForDriftCheckConstraints` 和 `BaselineUsedForDriftCheckStatistics` 属性进行访问。

有关更多信息，请参阅[基准计算、偏差检测和生命周期以及 Amazon Pi ClarifyCheck pelin SageMaker es 中的 QualityCheck 步骤](pipelines-quality-clarify-baseline-lifecycle.md)。

### 使用基准
基准

您可以通过 `supplied_baseline_statistics` 和 `supplied_baseline_constraints` 参数直接指定上一条基线。您还可以指定 `model_package_group_name` 和 `QualityCheck` 步骤，在模型软件包组中最新批准的模型软件包上拉动 `DriftCheckBaselines`。

指定以下内容时，`QualityCheck` 步骤将使用 `supplied_baseline_constraints` 和 `supplied_baseline_statistics` 在 `QualityCheck` 步骤的校验类型上指定的基线。
+ `model_package_group_name`
+ `supplied_baseline_constraints`
+ `supplied_baseline_statistics`

有关使用`QualityCheck`步骤要求的更多信息，请参阅 [sagemaker.workflow.steps。 QualityCheckStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.quality_check_step.QualityCheckStep)在适用于 *Python 的亚马逊 SageMaker AI SageMaker 人工智能开发工具包*中。有关展示如何使用 Pipelines 中`QualityCheck`步骤的 Amazon SageMaker Studio Classic 笔记本，请参阅 [sagemaker-pipeline-model-monitor-clarify-steps.ipynb](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-pipelines/tabular/model-monitor-clarify-pipelines/sagemaker-pipeline-model-monitor-clarify-steps.ipynb)。

**Example 创建 `QualityCheck` 步骤以进行数据质量检查**  

```
from sagemaker.workflow.check_job_config import CheckJobConfig
from sagemaker.workflow.quality_check_step import DataQualityCheckConfig, QualityCheckStep
from sagemaker.workflow.execution_variables import ExecutionVariables

check_job_config = CheckJobConfig(
    role=role,
    instance_count=1,
    instance_type="ml.c5.xlarge",
    volume_size_in_gb=120,
    sagemaker_session=sagemaker_session,
)

data_quality_check_config = DataQualityCheckConfig(
    baseline_dataset=step_process.properties.ProcessingOutputConfig.Outputs["train"].S3Output.S3Uri,
    dataset_format=DatasetFormat.csv(header=False, output_columns_position="START"),
    output_s3_uri=Join(on='/', values=['s3:/', your_bucket, base_job_prefix, ExecutionVariables.PIPELINE_EXECUTION_ID, 'dataqualitycheckstep'])
)

data_quality_check_step = QualityCheckStep(
    name="DataQualityCheckStep",
    skip_check=False,
    register_new_baseline=False,
    quality_check_config=data_quality_check_config,
    check_job_config=check_job_config,
    supplied_baseline_statistics="s3://sagemaker-us-west-2-555555555555/baseline/statistics.json",
    supplied_baseline_constraints="s3://sagemaker-us-west-2-555555555555/baseline/constraints.json",
    model_package_group_name="MyModelPackageGroup"
)
```

## EMR 步骤
EMR

使用 Amazon P [ip SageMaker elines EMR 步骤可](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-overview.html)以：
+ 在运行中的 Amazon EMR 集群上处理 [Amazon EMR 步骤](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-work-with-steps.html)。
+ 让管道为您创建和管理 Amazon EMR 集群。

有关 Amazon EMR 的更多信息，请参阅 [Amazon EMR 入门](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-gs.html)。

EMR 步骤要求 `EMRStepConfig` 包括 Amazon EMR 集群使用的 JAR 文件的位置以及要传递的任何参数。如果您要在运行中的 EMR 集群上运行该步骤，还需提供 Amazon EMR 集群 ID。您还可以通过集群配置，在它为您创建、管理和终止的集群上运行 EMR 步骤。以下几节包括演示这两种方法的示例笔记本的示例和链接。

**注意**  
EMR 步骤要求传递给管道的角色具有其他权限。将 [Amazon 托管式策略附加到管道角色：`AmazonSageMakerPipelinesIntegrations`](https://docs.amazonaws.cn/sagemaker/latest/dg/security-iam-awsmanpol-pipelines.html#security-iam-awsmanpol-AmazonSageMakerPipelinesIntegrations) 到管道角色，或确保角色包含该策略中的权限。
如果您在运行中的集群上处理 EMR 步骤，则只能使用处于以下状态之一的集群：  
`STARTING`
`BOOTSTRAPPING`
`RUNNING`
`WAITING`
如果您在正在运行的集群上处理 EMR 步骤，则在 EMR 集群上最多可以有 256 个处于 `PENDING` 状态的 EMR 步骤。提交的 EMR 步骤超过此限制会导致管道执行失败。您可以考虑使用[管道步骤的重试策略](pipelines-retry-policy.md)。
您可以指定集群 ID 或集群配置，但不能同时指定两者。
EMR 步骤依靠 Amazon EventBridge 来监控 EMR 步骤或集群状态的变化。如果您在正在运行的集群上处理 Amazon EMR 作业，则 EMR 步骤将使用 `SageMakerPipelineExecutionEMRStepStatusUpdateRule` 规则来监控 EMR 步骤的状态。如果您在 EMR 步骤创建的集群上处理作业，则该步骤会使用 `SageMakerPipelineExecutionEMRClusterStatusRule` 规则监控集群状态的变化。如果您在 Amazon 账户中看到其中任何一条 EventBridge 规则，请不要将其删除，否则您的 EMR 步骤可能无法完成。

**在您的管道中添加 Amazon EMR 步骤**

要向您的管道添加 EMR 步骤，请执行以下操作：
+ 按照[启动 Amazon Studio 中的说明打开 SageMaker Studio](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-updated-launch.html) 控制台。
+ 在左侧导航窗格中，选择 **Pipelines**。
+ 选择**创建**。
+ 选择**空白**。
+ 在左侧边栏中选择**处理数据**，然后将其拖到画布上。
+ 在画布中，选择添加的**处理数据**步骤。
+ 在右侧边栏的 “模式” 下，选择 “**EMR（托管）**”。
+ 在右侧边栏中，填写 “**设置” 和 “详细信息**” 选项卡中的表单。有关这些选项卡中字段的信息，请参阅 [sagemaker.workflow.fail\$1step。 EMRstep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.emr_step.EMRStep)。

**在正在运行的 Amazon EMR 集群上启动新作业**

要在运行中的 Amazon EMR 集群上启动新作业，请将集群 ID 作为字符串传递给 `EMRStep` 的 `cluster_id` 参数。以下示例演示了此过程。

```
from sagemaker.workflow.emr_step import EMRStep, EMRStepConfig

emr_config = EMRStepConfig(
    jar="jar-location", # required, path to jar file used
    args=["--verbose", "--force"], # optional list of arguments to pass to the jar
    main_class="com.my.Main1", # optional main class, this can be omitted if jar above has a manifest 
    properties=[ # optional list of Java properties that are set when the step runs
    {
        "key": "mapred.tasktracker.map.tasks.maximum",
        "value": "2"
    },
    {
        "key": "mapreduce.map.sort.spill.percent",
        "value": "0.90"
   },
   {
       "key": "mapreduce.tasktracker.reduce.tasks.maximum",
       "value": "5"
    }
  ]
)

step_emr = EMRStep (
    name="EMRSampleStep", # required
    cluster_id="j-1ABCDEFG2HIJK", # include cluster_id to use a running cluster
    step_config=emr_config, # required
    display_name="My EMR Step",
    description="Pipeline step to execute EMR job"
)
```

有关指导您完成完整示例的示例笔记本，请参阅[运行 EMR 集群的 Pipelines EMR 步骤](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-pipelines/tabular/emr-step/sagemaker-pipelines-emr-step-with-running-emr-cluster.ipynb)。

**在新的 Amazon EMR 集群上启动新作业**

要在 `EMRStep` 为您创建的新集群上启动新作业，请将集群配置作为字典提供。字典必须与[RunJobFlow](https://docs.amazonaws.cn/emr/latest/APIReference/API_RunJobFlow.html)请求具有相同的结构。但是，请勿在集群配置中包含以下字段：
+ [`Name`]
+ [`Steps`]
+ [`AutoTerminationPolicy`]
+ [`Instances`][`KeepJobFlowAliveWhenNoSteps`]
+ [`Instances`][`TerminationProtected`]

所有其他 `RunJobFlow` 参数均可在您的集群配置中使用。有关请求语法的详细信息，请参阅[RunJobFlow](https://docs.amazonaws.cn/emr/latest/APIReference/API_RunJobFlow.html)。

下面的示例将集群配置传递给 EMR 步骤定义。这将提示在新的 EMR 集群上启动新作业的步骤。此示例中的 EMR 集群配置包括主节点和核心 EMR 集群节点的规范。有关 Amazon EMR 节点类型的更多信息，请参阅[了解节点类型：主节点、核心节点和任务节点](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-master-core-task-nodes.html)。

```
from sagemaker.workflow.emr_step import EMRStep, EMRStepConfig

emr_step_config = EMRStepConfig(
    jar="jar-location", # required, path to jar file used
    args=["--verbose", "--force"], # optional list of arguments to pass to the jar
    main_class="com.my.Main1", # optional main class, this can be omitted if jar above has a manifest 
    properties=[ # optional list of Java properties that are set when the step runs
    {
        "key": "mapred.tasktracker.map.tasks.maximum",
        "value": "2"
    },
    {
        "key": "mapreduce.map.sort.spill.percent",
        "value": "0.90"
   },
   {
       "key": "mapreduce.tasktracker.reduce.tasks.maximum",
       "value": "5"
    }
  ]
)

# include your cluster configuration as a dictionary
emr_cluster_config = {
    "Applications": [
        {
            "Name": "Spark", 
        }
    ],
    "Instances":{
        "InstanceGroups":[
            {
                "InstanceRole": "MASTER",
                "InstanceCount": 1,
                "InstanceType": "m5.2xlarge"
            },
            {
                "InstanceRole": "CORE",
                "InstanceCount": 2,
                "InstanceType": "m5.2xlarge"
            }
        ]
    },
    "BootstrapActions":[],
    "ReleaseLabel": "emr-6.6.0",
    "JobFlowRole": "job-flow-role",
    "ServiceRole": "service-role"
}

emr_step = EMRStep(
    name="emr-step",
    cluster_id=None,
    display_name="emr_step",
    description="MyEMRStepDescription",
    step_config=emr_step_config,
    cluster_config=emr_cluster_config
)
```

有关指导您完成完整示例的示例笔记本，请参阅[使用集群生命周期管理的管道 EMR 步骤](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-pipelines/tabular/emr-step/sagemaker-pipelines-emr-step-with-cluster-lifecycle-management.ipynb)。

## EMR 无服务器步骤
EMR 无服务器步骤

要向您的管道中添加 EMR 无服务器步骤，请执行以下操作：
+ 按照[启动 Amazon Studio 中的说明打开 SageMaker Studio](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-updated-launch.html) 控制台。
+ 在左侧导航窗格中，选择 **Pipelines**。
+ 选择**创建**。
+ 选择**空白**。
+ 在左侧边栏中选择**处理数据**，然后将其拖到画布上。
+ 在画布中，选择添加的**处理数据**步骤。
+ 在右侧边栏的模式下，选择 **EMR（无服务器）**。
+ 在右侧边栏中，填写 “**设置” 和 “详细信息**” 选项卡中的表单。

## 笔记本作业步骤
笔记本作业

使用`NotebookJobStep`以非交互方式运行您的 SageMaker Notebook Job 作为工作流步骤。如果您在 Pipelines drag-and-drop 用户界面中构建管道，请使用[执行代码步骤](#step-type-executecode)来运行您的笔记本。有关 SageMaker 笔记本作业的更多信息，请参阅[SageMaker 笔记本职位](notebook-auto-run.md)。

`NotebookJobStep` 至少需要输入笔记本、映像 URI 和内核名称。有关 Notebook Job 步骤要求以及可以设置为自定义步骤的其他参数的更多信息，请参阅 [sagemaker.workflow.steps。 NotebookJobStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.notebook_job_step.NotebookJobStep)。

下面的示例使用最小参数定义了 `NotebookJobStep`。

```
from sagemaker.workflow.notebook_job_step import NotebookJobStep


notebook_job_step = NotebookJobStep(
    input_notebook=input_notebook,
    image_uri=image_uri,
    kernel_name=kernel_name
)
```

您的工作`NotebookJobStep`流步骤被视为 SageMaker 笔记本作业。因此，在 Studio Classic UI 笔记本作业控制面板中，通过使用 `tags` 参数包含特定标签来跟踪执行状态。有关包含标签的更多详情，请参阅 [在 Studio UI 面板上查看笔记本作业](create-notebook-auto-run-sdk.md#create-notebook-auto-run-dash)。

此外，如果您使用 SageMaker Python SDK 安排笔记本作业，则只能指定某些图像来运行笔记本作业。有关更多信息，请参阅 [SageMaker AI Python SDK 笔记本作业的图像限制](notebook-auto-run-constraints.md#notebook-auto-run-constraints-image-sdk)。

## Fail 步骤
Fail

当未达到所需条件或状态时，使用 “失败” 步骤停止 Amazon Pipelin SageMaker es 的执行。在 Fail 步骤中还可以输入自定义错误信息，说明管道执行失败的原因。

**注意**  
当一个 Fail 步骤和其他管道步骤同时执行时，管道在所有并发步骤完成之前不会终止。

### 使用 Fail 步骤的限制
Fail 步骤限制
+ 您不能将 Fail 步骤添加到其他步骤的 `DependsOn` 列表中。有关更多信息，请参阅 [步骤之间的自定义依赖关系](build-and-manage-steps.md#build-and-manage-custom-dependency)。
+ 其他步骤不能引用 Fail 步骤。它*始终* 是管道执行的最后一步。
+ 您不能重试以 Fail 步骤结束的管道执行。

您可以创建静态文本字符串形式的 Fail 步骤错误信息。另外，如果您使用 SDK，也可以使用 [Pipeline Parameters](https://docs.amazonaws.cn/sagemaker/latest/dg/build-and-manage-parameters.html)、[Join](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html?highlight=Join#sagemaker.workflow.functions.Join) 操作或其他[步骤属性](https://docs.amazonaws.cn/sagemaker/latest/dg/build-and-manage-steps.html#build-and-manage-properties)来创建信息量更大的错误信息。

------
#### [ Pipeline Designer ]

要在管道中添加 Fail 步骤，请执行以下操作：

1. 按照 [启动亚马逊 SageMaker Studio](studio-updated-launch.md) 中的说明打开 Studio 管理控制台。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. 选择**创建**。

1. 选择**空白**。

1. 在左侧边栏中选择 **Fail**，然后将其拖到画布上。

1. 在画布中，选择添加的 **Fail** 步骤。

1. 在右侧边栏中，填写**设置**和**详情**标签中的表格。有关这些选项卡中字段的信息，请参阅 [sagemaker.workflow.fail\$1step。 FailStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.fail_step.FailStep)。

1. 如果画布上有任何步骤紧接在您添加的 **Fail** 步骤之前，请单击并拖动光标从该步骤到 **Fail** 步骤，以创建边缘。

1. 如果画布上有任何步骤紧接着您添加的 **Fail** 步骤，请单击并拖动光标从 **Fail** 步骤到该步骤，以创建边缘。

------
#### [ SageMaker Python SDK ]

**Example**  
以下示例代码片段使用了一个 `FailStep`（带有 `ErrorMessage`，并配置了管道参数）和一项 `Join` 操作。  

```
from sagemaker.workflow.fail_step import FailStep
from sagemaker.workflow.functions import Join
from sagemaker.workflow.parameters import ParameterInteger

mse_threshold_param = ParameterInteger(name="MseThreshold", default_value=5)
step_fail = FailStep(
    name="AbaloneMSEFail",
    error_message=Join(
        on=" ", values=["Execution failed due to MSE >", mse_threshold_param]
    ),
)
```

------

# 添加集成


MLflow 集成允许您 MLflow 与管道一起使用来选择跟踪服务器或无服务器应用程序、选择实验和记录指标。

## 重要概念


**默认应用程序创建**-当您进入管道可视化编辑器时，将创建默认 MLflow 应用程序。

**集成面板**-包含一个新的集成面板 MLflow，您可以选择和配置该面板。

**更新应用程序和实验**-在管道执行期间覆盖所选应用程序和实验的选项。

## 工作原理

+ 前往**管道可视化编辑器**
+ 在工具栏上选择 “**集成**”
+ 选择 **MLflow**
+ 配置 MLflow 应用程序并进行实验

## 屏幕截图示例


集成侧面板

![\[待办事项描述。\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/screenshot-pipeline-1.png)


MLflow 配置

![\[待办事项描述。\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/screenshot-pipeline-2.png)


如何在管道执行期间重写实验

![\[待办事项描述。\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/screenshot-pipeline-3.png)


## 步骤属性


使用 `properties` 属性在管道中的步骤之间添加数据依赖关系。管道使用这些数据依赖关系来根据管道定义构建 DAG。这些属性可以作为占位符值引用，并在运行时解析。

Pi `properties` pelines 步骤的属性与`Describe`调用相应 SageMaker AI 作业类型返回的对象相匹配。对于每种作业类型，`Describe` 调用都会返回以下响应对象：
+ `ProcessingStep` – [DescribeProcessingJob](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribeProcessingJob.html)
+ `TrainingStep` – [DescribeTrainingJob](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribeTrainingJob.html)
+ `TransformStep` – [DescribeTransformJob](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribeTransformJob.html)

要在创建数据依赖关系期间查看每种步骤类型哪些属性是可引用的，请参阅 [Amaz SageMaker on Python SDK](https://sagemaker.readthedocs.io/en/stable) 中的*[数据依赖关系-属性参考](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#data-dependency-property-reference)*。

## 步骤并行


当一个步骤不依赖于任何其他步骤时，它会在管道执行后立即运行。但是，并行执行过多的管道步骤可能会很快耗尽可用资源。使用 `ParallelismConfiguration` 控制管道执行的并发步骤数。

以下示例使用 `ParallelismConfiguration` 将并发步骤数限制设置为 5。

```
pipeline.create(
    parallelism_config=ParallelismConfiguration(5),
)
```

## 步骤之间的数据依赖性


您可以通过指定步骤之间的数据关系来定义 DAG 的结构。要在步骤之间创建数据依赖关系，请将一个步骤的属性作为输入传递给管道中的另一个步骤。接收输入的步骤要等到提供输入的步骤完成运行后才会开始。

数据依赖关系使用以下格式的 JsonPath 符号。这种格式会遍历 JSON 属性文件。这意味着您可以根据需要追加任意数量的*<property>*实例，以达到文件中所需的嵌套属性。有关 JsonPath 符号的更多信息，请参阅 [JsonPath repo](https://github.com/json-path/JsonPath)。

```
<step_name>.properties.<property>.<property>
```

以下内容说明了如何使用处理步骤的 `ProcessingOutputConfig` 属性指定 Amazon S3 存储桶。

```
step_process.properties.ProcessingOutputConfig.Outputs["train_data"].S3Output.S3Uri
```

要创建数据依赖关系，请按如下方式将存储桶传递给训练步骤。

```
from sagemaker.workflow.pipeline_context import PipelineSession

sklearn_train = SKLearn(..., sagemaker_session=PipelineSession())

step_train = TrainingStep(
    name="CensusTrain",
    step_args=sklearn_train.fit(inputs=TrainingInput(
        s3_data=step_process.properties.ProcessingOutputConfig.Outputs[
            "train_data"].S3Output.S3Uri
    ))
)
```

要在创建数据依赖关系期间查看每种步骤类型哪些属性是可引用的，请参阅 [Amaz SageMaker on Python SDK](https://sagemaker.readthedocs.io/en/stable) 中的*[数据依赖关系-属性参考](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#data-dependency-property-reference)*。

## 步骤之间的自定义依赖关系


指定数据依赖关系时，Pipelines 会在各步骤之间提供数据连接。另外，一个步骤可以访问前一个步骤的数据，而无需直接使用管道。在这种情况下，您可以创建一个自定义依赖关系，告诉 Pipelines 在另一个步骤运行完之前不要启动该步骤。您可以通过指定步骤的 `DependsOn` 属性来创建自定义依赖关系。

例如，以下内容定义了步骤 `C`，该步骤在步骤 `A` 和步骤 `B` 都完成运行后才开始。

```
{
  'Steps': [
    {'Name':'A', ...},
    {'Name':'B', ...},
    {'Name':'C', 'DependsOn': ['A', 'B']}
  ]
}
```

如果依赖关系会产生循环依赖关系，Pipelines 会抛出验证异常。

以下示例创建了一个在处理步骤完成运行后开始的训练步骤。

```
processing_step = ProcessingStep(...)
training_step = TrainingStep(...)

training_step.add_depends_on([processing_step])
```

以下示例创建了一个训练步骤，该步骤要等到两个不同的处理步骤完成运行后才会开始。

```
processing_step_1 = ProcessingStep(...)
processing_step_2 = ProcessingStep(...)

training_step = TrainingStep(...)

training_step.add_depends_on([processing_step_1, processing_step_2])
```

下面提供了另一种创建自定义依赖关系的方法。

```
training_step.add_depends_on([processing_step_1])
training_step.add_depends_on([processing_step_2])
```

以下示例创建了一个训练步骤，该步骤接收来自一个处理步骤的输入，然后等待另一个处理步骤完成运行。

```
processing_step_1 = ProcessingStep(...)
processing_step_2 = ProcessingStep(...)

training_step = TrainingStep(
    ...,
    inputs=TrainingInput(
        s3_data=processing_step_1.properties.ProcessingOutputConfig.Outputs[
            "train_data"
        ].S3Output.S3Uri
    )

training_step.add_depends_on([processing_step_2])
```

以下示例说明如何检索步骤的自定义依赖关系的字符串列表。

```
custom_dependencies = training_step.depends_on
```

## 自定义映像一步到位


 在管道中创建步骤时，您可以使用任何可用的 SageMaker AI [深度学习容器镜像](https://github.com/aws/deep-learning-containers/blob/master/available_images.md)。

您还可以在管道步骤中使用自己的容器。由于无法在 Studio Classic 中创建映像，因此在使用 Pipelines 之前，必须使用其他方法创建映像。

要在为管道创建步骤时使用自己的容器，请在估算器定义中包含映像 URI。有关将自己的容器与 SageMaker AI 配合使用的更多信息，请参阅将 [Docker 容器与 SageMaker AI 配合使用](https://docs.amazonaws.cn/sagemaker/latest/dg/docker-containers.html)。

# Lift-and-shift 使用 @step 装饰器的 Python 代码


`@step` 装饰器是将本地机器学习 (ML) 代码转换为一个或多个管道步骤的功能。您可以像编写任何 ML 项目一样编写 ML 函数。在本地测试或使用装饰器作为训练作业进行测试后，您可以通过添加`@remote`装饰器将该函数转换为 A SageMaker I 管道步骤。`@step`然后，您可以将 `@step` 装饰函数调用的输出作为一个步骤传递给 Pipelines，以创建并运行管道。您还可以使用 `@step` 装饰器串联一系列函数，创建多步骤有向无环图 (DAG) 管道。

使用 `@step` 装饰器的设置与使用 `@remote` 装饰器的设置相同。关于如何[设置环境](https://docs.amazonaws.cn/sagemaker/latest/dg/train-remote-decorator.html#train-remote-decorator-env)和[使用配置文件](https://docs.amazonaws.cn/sagemaker/latest/dg/train-remote-decorator-config.html)设置默认值，请参阅远程功能文档。有关 `@step` 装饰器的更多信息，请参阅 [sagemaker.workflow.function\$1step.step](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.function_step.step)。

要查看演示如何使用 `@step` 装饰器的示例笔记本，请参阅 [@step 装饰器示例笔记本](https://github.com/aws/amazon-sagemaker-examples/tree/main/sagemaker-pipelines/step-decorator)。

下文将介绍如何使用 `@step` 装饰器注释本地 ML 代码以创建步骤、使用步骤创建和运行管道，以及如何根据使用场景定制体验。

**Topics**
+ [

# 使用 `@step` 装饰函数创建管道
](pipelines-step-decorator-create-pipeline.md)
+ [

# 运行管道
](pipelines-step-decorator-run-pipeline.md)
+ [

# 配置您的管道
](pipelines-step-decorator-cfg-pipeline.md)
+ [

# 最佳实践
](pipelines-step-decorator-best.md)
+ [

# 限制
](pipelines-step-decorator-limit.md)

# 使用 `@step` 装饰函数创建管道


您可以使用 `@step` 装饰器将 Python 函数转换为管道步骤，在这些函数之间创建依赖关系以创建管道图（或有向无环图 (DAG)），并将该图的叶节点作为步骤列表传递给管道，从而创建管道。下文将结合示例详细解释这一程序。

**Topics**
+ [

## 将函数转换为步骤
](#pipelines-step-decorator-run-pipeline-convert)
+ [

## 在各步骤之间建立依赖关系
](#pipelines-step-decorator-run-pipeline-link)
+ [

## 使用 `ConditionStep` 和 `@step` 装饰步骤
](#pipelines-step-decorator-condition)
+ [

## 使用步骤的 `DelayedReturn` 输出定义管道
](#pipelines-step-define-delayed)
+ [

## 创建管道
](#pipelines-step-decorator-pipeline-create)

## 将函数转换为步骤


要使用 `@step` 装饰器创建一个步骤，请使用 `@step` 对功能进行注释。下面的示例展示了一个预处理数据的 `@step` 装饰功能。

```
from sagemaker.workflow.function_step import step

@step
def preprocess(raw_data):
    df = pandas.read_csv(raw_data)
    ...
    return procesed_dataframe
    
step_process_result = preprocess(raw_data)
```

当你调用`@step`装饰过的函数时， SageMaker AI 会返回一个`DelayedReturn`实例，而不是运行该函数。`DelayedReturn` 实例是该功能实际返回值的代理。`DelayedReturn` 实例可以作为参数传递给其他函数，也可以作为步骤直接传递给管道实例。有关该`DelayedReturn`课程的信息，请参阅 [sagemaker.workflow.function\$1step。 DelayedReturn](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.function_step.DelayedReturn)。

## 在各步骤之间建立依赖关系


在两个步骤之间创建依赖关系时，就在管道图中的步骤之间创建了连接。下文将介绍在管道步骤之间创建依赖关系的多种方法。

### 通过输入参数实现数据依赖


将一个函数的 `DelayedReturn` 输出作为另一个函数的输入，会自动在管道 DAG 中创建数据依赖关系。在下面的示例中，将 `preprocess` 函数的 `DelayedReturn` 输出传递给 `train` 函数会在 `preprocess` 和 `train` 之间产生依赖关系。

```
from sagemaker.workflow.function_step import step

@step
def preprocess(raw_data):
    df = pandas.read_csv(raw_data)
    ...
    return procesed_dataframe

@step
def train(training_data):
    ...
    return trained_model

step_process_result = preprocess(raw_data)    
step_train_result = train(step_process_result)
```

上一个示例定义了一个训练函数，该函数用 `@step` 修饰。调用该函数时，它会接收预处理管道步骤的 `DelayedReturn` 输出作为输入。调用训练函数会返回另一个 `DelayedReturn` 实例。该实例保存了该函数中定义的所有先前步骤的信息（即本例中的 `preprocess` 步骤），这些步骤构成了管道 DAG。

在上一个示例中，`preprocess` 函数返回一个值。有关列表或元组等更复杂的返回类型，请参阅 [限制](pipelines-step-decorator-limit.md)。

### 定义自定义依赖关系


在上一个示例中，`train` 函数接收了 `preprocess` 的 `DelayedReturn` 输出，并创建了一个依赖关系。如果想明确定义依赖关系，而不传递前一步的输出结果，请在步骤中使用 `add_depends_on` 函数。您可以使用 `get_step()` 函数从其 `DelayedReturn` 实例中获取基础步骤，然后将依赖关系作为输入调用 `add_depends_on`\$1on。要查看 `get_step()` 函数定义，请参阅 [sagemaker.workflow.step\$1outputs.get\$1step](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.step_outputs.get_step)。下面的示例演示了如何使用 `get_step()` 和 `add_depends_on()` 在 `preprocess` 和 `train` 之间创建依赖关系。

```
from sagemaker.workflow.step_outputs import get_step

@step
def preprocess(raw_data):
    df = pandas.read_csv(raw_data)
    ...
    processed_data = ..
    return s3.upload(processed_data)

@step
def train():
    training_data = s3.download(....)
    ...
    return trained_model

step_process_result = preprocess(raw_data)    
step_train_result = train()

get_step(step_train_result).add_depends_on([step_process_result])
```

### 将数据从 `@step` 装饰函数传递到传统管道步骤


您可以创建一个包含 `@step` 装饰步骤和传统管道步骤的管道，并在两者之间传递数据。例如，您可以使用 `ProcessingStep` 处理数据，并将处理结果传递给 `@step` 装饰的训练函数。在下面的示例中，`@step` 装饰的训练步骤引用了处理步骤的输出。

```
# Define processing step

from sagemaker.sklearn.processing import SKLearnProcessor
from sagemaker.processing import ProcessingInput, ProcessingOutput
from sagemaker.workflow.steps import ProcessingStep

sklearn_processor = SKLearnProcessor(
    framework_version='1.2-1',
    role='arn:aws:iam::123456789012:role/SagemakerExecutionRole',
    instance_type='ml.m5.large',
    instance_count='1',
)

inputs = [
    ProcessingInput(source=input_data, destination="/opt/ml/processing/input"),
]
outputs = [
    ProcessingOutput(output_name="train", source="/opt/ml/processing/train"),
    ProcessingOutput(output_name="validation", source="/opt/ml/processing/validation"),
    ProcessingOutput(output_name="test", source="/opt/ml/processing/test")
]

process_step = ProcessingStep(
    name="MyProcessStep",
    step_args=sklearn_processor.run(inputs=inputs, outputs=outputs,code='preprocessing.py'),
)
```

```
# Define a @step-decorated train step which references the 
# output of a processing step

@step
def train(train_data_path, test_data_path):
    ...
    return trained_model
    
step_train_result = train(
   process_step.properties.ProcessingOutputConfig.Outputs["train"].S3Output.S3Uri,
   process_step.properties.ProcessingOutputConfig.Outputs["test"].S3Output.S3Uri,
)
```

## 使用 `ConditionStep` 和 `@step` 装饰步骤


管道支持一个 `ConditionStep` 类，该类会评估前几个步骤的结果，以决定在管道中采取什么行动。您也可以在 `@step` 装饰的步骤中使用 `ConditionStep`。要使用 `ConditionStep` 中任何 `@step` 装饰步骤的输出，请将该步骤的输出作为 `ConditionStep` 的参数输入。在下面的示例中，条件步骤接收 `@step` 装饰模型评测步骤的输出。

```
# Define steps

@step(name="evaluate")
def evaluate_model():
    # code to evaluate the model
    return {
        "rmse":rmse_value
    }
    
@step(name="register")
def register_model():
    # code to register the model
    ...
```

```
# Define ConditionStep

from sagemaker.workflow.condition_step import ConditionStep
from sagemaker.workflow.conditions import ConditionGreaterThanOrEqualTo
from sagemaker.workflow.fail_step import FailStep

conditionally_register = ConditionStep(
    name="conditional_register",
    conditions=[
        ConditionGreaterThanOrEqualTo(
            # Output of the evaluate step must be json serializable
            left=evaluate_model()["rmse"],  # 
            right=5,
        )
    ],
    if_steps=[FailStep(name="Fail", error_message="Model performance is not good enough")],
    else_steps=[register_model()],
)
```

## 使用步骤的 `DelayedReturn` 输出定义管道


无论是否使用 `@step` 装饰器，定义管道的方式都是一样的。向管道传递 `DelayedReturn` 实例时，无需传递完整的步骤列表来构建管道。SDK 会根据您定义的依赖关系自动推导出前面的步骤。您传递给管道的所有上一步骤 `Step` 对象或相关 `DelayedReturn` 对象都包含在管道图中。在下面的示例中，管道为 `train` 函数接收 `DelayedReturn` 对象。 SageMaker AI 将该`preprocess`步骤作为上一步添加到管道图中。`train`

```
from sagemaker.workflow.pipeline import Pipeline

pipeline = Pipeline(
    name="<pipeline-name>",
    steps=[step_train_result],
    sagemaker_session=<sagemaker-session>,
)
```

如果步骤之间没有数据或自定义依赖关系，并且并行运行多个步骤，管道图就会有多个叶节点。如下例所示，将所有这些叶节点以列表形式传递给管道定义中的 `steps` 参数：

```
@step
def process1():
    ...
    return data
    
@step
def process2():
   ...
   return data
   
step_process1_result = process1()
step_process2_result = process2()

pipeline = Pipeline(
    name="<pipeline-name>",
    steps=[step_process1_result, step_process2_result],
    sagemaker_session=sagemaker-session,
)
```

管道运行时，两个步骤并行。

您只需将图的叶节点传递给管道，因为叶节点包含通过数据或自定义依赖关系定义的所有先前步骤的信息。在编译管道时， SageMaker AI 还会推断出构成管道图的所有后续步骤，并将每个步骤作为单独的步骤添加到管道中。

## 创建管道


通过调用 `pipeline.create()` 创建管道，如以下代码所示。有关 `create()` 的详细信息，请参阅 [sagemaker.workflow.pipeline.Pipeline.create](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.pipeline.Pipeline.create)。

```
role = "pipeline-role"
pipeline.create(role)
```

当你调用时`pipeline.create()`， SageMaker AI 会编译所有定义为管道实例一部分的步骤。 SageMaker AI 将序列化函数、参数和所有其他与步骤相关的项目上传到 Amazon S3。

数据按照以下结构存放在 S3 存储桶中：

```
s3_root_uri/
    pipeline_name/
        sm_rf_user_ws/
            workspace.zip  # archive of the current working directory (workdir)
        step_name/
            timestamp/
                arguments/                # serialized function arguments
                function/                 # serialized function
                pre_train_dependencies/   # any dependencies and pre_execution scripts provided for the step       
        execution_id/
            step_name/
                results     # returned output from the serialized function including the model
```

`s3_root_uri`在 SageMaker AI 配置文件中定义，适用于整个管道。如果未定义，则使用默认 SageMaker AI 存储桶。

**注意**  
每次 SageMaker AI 编译管道时， SageMaker AI 都会将步骤的序列化函数、参数和依赖项保存在带有当前时间戳的文件夹中。每次运行 `pipeline.create()`、`pipeline.update()`、`pipeline.upsert()` 或 `pipeline.definition()` 时都会出现这种情况。

# 运行管道


以下页面介绍如何使用 Amazon Pipelines 运行 SageMaker 管道，无论是使用 SageMaker AI 资源还是本地运行。

使用该`pipeline.start()`函数开始新的管道运行，就像传统的 A SageMaker I 管道运行一样。有关 `start()` 函数的信息，请参阅 [sagemaker.workflow.pipeline.Pipeline.start](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.pipeline.Pipeline.start)。

**注意**  
使用 `@step` 装饰器定义的步骤将作为训练作业运行。因此，请注意以下限制：  
账户中的实例限制和训练作业限制。相应更新您的限制，以避免任何节流或资源限制问题。
管道中每运行一个训练步骤的相关货币成本。有关更多详情，请参阅 [Amazon SageMaker 定价](https://www.amazonaws.cn/sagemaker/pricing/)。

## 从本地运行的管道中读取结果


要查看管道运行的任何步骤的结果，请使用 [execution.result()](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.pipeline._PipelineExecution.result           )，如以下代码段所示：

```
execution = pipeline.start()
execution.result(step_name="train")
```

**注意**  
Pipelines 在本地模式下不支持 `execution.result()`。

每次只能检索一个步骤的结果。如果步骤名称由 SageMaker AI 生成，则可以通过以下方式调用`list_steps`来检索步骤名称：

```
execution.list_step()
```

## 在本地运行管道


您可以像运行传统管道步骤一样，在本地运行带有 `@step` 装饰步骤的管道。有关本地模式管道运行的详细信息，请参阅 [使用本地模式运行管道](pipelines-local-mode.md)。要使用本地模式，请在管道定义中使用 `LocalPipelineSession` 代替 `SageMakerSession`，如下例所示：

```
from sagemaker.workflow.function_step import step
from sagemaker.workflow.pipeline import Pipeline
from sagemaker.workflow.pipeline_context import LocalPipelineSession

@step
def train():
    training_data = s3.download(....)
    ...
    return trained_model
    
step_train_result = train()

local_pipeline_session = LocalPipelineSession()

local_pipeline = Pipeline(
    name="<pipeline-name>",
    steps=[step_train_result],
    sagemaker_session=local_pipeline_session # needed for local mode
)

local_pipeline.create(role_arn="role_arn")

# pipeline runs locally
execution = local_pipeline.start()
```

# 配置您的管道


建议您使用 SageMaker AI 配置文件来设置管道的默认值。有关 SageMaker AI 配置文件的信息，请参阅[在 SageMaker Python SDK 中配置和使用默认值](https://sagemaker.readthedocs.io/en/stable/overview.html#configuring-and-using-defaults-with-the-sagemaker-python-sdk)。添加到配置文件中的任何配置都适用于管道中的所有步骤。如果您要覆盖任何步骤的选项，请在 `@step` 装饰器参数中提供新值。下面的主题介绍了如何设置配置文件。

配置文件中 `@remote` 装饰器的配置与 `@step` 装饰器的配置完全相同。要在配置文件中设置管道角色 ARN 和管道标签，请使用以下代码段中的 `Pipeline` 部分：

```
SchemaVersion: '1.0'
SageMaker:
  Pipeline:
    RoleArn: 'arn:aws:iam::555555555555:role/IMRole'
    Tags:
    - Key: 'tag_key'
      Value: 'tag_value'
```

在配置文件中设置的大部分默认值，都可以通过向 `@step` 装饰器传递新值来覆盖。例如，您可以覆盖配置文件中为预处理步骤设置的实例类型，如下例所示：

```
@step(instance_type="ml.m5.large")
def preprocess(raw_data):
    df = pandas.read_csv(raw_data)
    ...
    return procesed_dataframe
```

一些参数不是`@step`装饰器参数列表的一部分，只能通过 SageMaker AI 配置文件为整个管道配置这些参数。它们列举如下：
+ `sagemaker_session`(`sagemaker.session.Session`): SageMaker AI 委托服务调用的底层 SageMaker AI 会话。如果未指定，则使用默认配置创建会话，如下所示：

  ```
  SageMaker:
    PythonSDK:
      Modules:
        Session:
          DefaultS3Bucket: 'default_s3_bucket'
          DefaultS3ObjectKeyPrefix: 'key_prefix'
  ```
+ `custom_file_filter`（`CustomFileFilter)`：`CustomFileFilter` 对象，用于指定要包含在管道步骤中的本地目录和文件。如果未指定，默认为 `None`。要使 `custom_file_filter` 生效，您必须将 `IncludeLocalWorkdir` 设置为 `True`。下面的示例显示了忽略所有笔记本文件以及名为 `data` 的文件和目录的配置。

  ```
  SchemaVersion: '1.0'
  SageMaker:
    PythonSDK:
      Modules:
        RemoteFunction:
          IncludeLocalWorkDir: true
          CustomFileFilter: 
            IgnoreNamePatterns: # files or directories to ignore
            - "*.ipynb" # all notebook files
            - "data" # folder or file named "data"
  ```

  有关如何使用 `IncludeLocalWorkdir` 和 `CustomFileFilter` 的更多详情，请参阅 [将模块化代码用于 @remote 装饰器](train-remote-decorator-modular.md)。
+ `s3_root_uri (str)`：Amazon S3 根文件夹， SageMaker AI 将代码档案和数据上传到该文件夹。如果未指定，则使用默认 SageMaker AI 存储桶。
+ `s3_kms_key (str)`：用于加密输入和输出数据的键。您只能在 SageMaker AI 配置文件中配置此参数，并且该参数适用于管道中定义的所有步骤。如果未指定，默认为 `None`。请参阅下面的 S3 KMS 密钥配置示例片段：

  ```
  SchemaVersion: '1.0'
  SageMaker:
    PythonSDK:
      Modules:
        RemoteFunction:
          S3KmsKeyId: 's3kmskeyid'
          S3RootUri: 's3://amzn-s3-demo-bucket/my-project
  ```

# 最佳实践


以下各节建议了在管道步骤中使用 `@step` 装饰器时应遵循的最佳实践。

## 使用暖池


要加快管道步骤运行速度，可使用为训练作业提供的热池功能。您可以通过为 `@step` 装饰器提供 `keep_alive_period_in_seconds` 参数来开启暖池功能，如以下代码段所示：

```
@step(
   keep_alive_period_in_seconds=900
)
```

有关暖池的更多信息，请参阅 [SageMaker AI 管理的暖池](train-warm-pools.md)。

## 目录结构


建议您在使用 `@step` 装饰器时使用代码模块。将调用步骤函数和定义管道的 `pipeline.py` 模块放在工作区的根部。建议的结构如下：

```
.
├── config.yaml # the configuration file that define the infra settings
├── requirements.txt # dependencies
├── pipeline.py  # invoke @step-decorated functions and define the pipeline here
├── steps/
| ├── processing.py
| ├── train.py
├── data/
├── test/
```

# 限制


以下各节概述了在管道步骤中使用 `@step` 装饰器时应注意的限制。

## 函数参数限制


向 `@step` 装饰函数传递输入参数时，会受到以下限制：
+ 您可以将 `DelayedReturn`、`Properties`（其他类型的步骤）、`Parameter` 和 `ExecutionVariable` 对象作为参数传递给 `@step` 装饰函数。但 `@step` 装饰的函数不支持将 `JsonGet` 和 `Join` 对象作为参数。
+ 您不能通过 `@step` 函数直接访问管道变量。下面的示例会产生一个错误：

  ```
  param = ParameterInteger(name="<parameter-name>", default_value=10)
  
  @step
  def func():
      print(param)
  
  func() # this raises a SerializationError
  ```
+ 您不能将管道变量嵌套到另一个对象中，并将其传递给 `@step` 函数。下面的示例会产生一个错误：

  ```
  param = ParameterInteger(name="<parameter-name>", default_value=10)
  
  @step
  def func(arg):
      print(arg)
  
  func(arg=(param,)) # this raises a SerializationError because param is nested in a tuple
  ```
+ 由于函数的输入和输出是序列化的，因此可以作为函数的输入或输出传递的数据类型受到限制。更多详情，请参阅 [调用远程函数](train-remote-decorator-invocation.md) 中的*数据序列化和反序列化*部分。同样的限制也适用于 `@step` 装饰函数。
+ 任何具有 boto 客户端的对象都不能被序列化，因此不能将此类对象作为 `@step` 装饰函数的输入或输出。例如， SageMaker Python SDK 客户端类（例如`Estimator``Predictor`、和）`Processor`无法序列化。

## 功能导入


应在函数内部而不是外部导入步骤所需的库。如果在全局范围内导入，就有可能在序列化函数时发生导入碰撞。例如，`sklearn.pipeline.Pipeline` 可以被 `sagemaker.workflow.pipeline.Pipeline` 覆盖。

## 引用函数返回值的子成员


如果引用 `@step` 装饰函数返回值的子成员，则会受到以下限制：
+ 如果 `DelayedReturn` 对象表示元组、列表或 dict，则可以用 `[]` 引用子成员，如下例所示：

  ```
  delayed_return[0]
  delayed_return["a_key"]
  delayed_return[1]["a_key"]
  ```
+ 由于调用函数时无法知道基础元组或列表的确切长度，因此无法解包元组或列表输出。下面的示例会产生一个错误：

  ```
  a, b, c = func() # this raises ValueError
  ```
+ 您不能遍历 `DelayedReturn` 对象。以下示例会引发错误：

  ```
  for item in func(): # this raises a NotImplementedError
  ```
+ 您不能使用“`.`”引用任意子成员。下面的示例会产生一个错误：

  ```
  delayed_return.a_child # raises AttributeError
  ```

## 不支持的现有管道功能


您不能使用具有以下管道功能的 `@step` 装饰器：
+ [Pipeline 步骤缓存](https://docs.amazonaws.cn/sagemaker/latest/dg/pipelines-caching.html)
+ [Property 文件](https://docs.amazonaws.cn/sagemaker/latest/dg/build-and-manage-propertyfile.html#build-and-manage-propertyfile-property)

# 在步骤之间传递数据


使用 Amazon Pipelines 构建 SageMaker 管道时，您可能需要将数据从一个步骤传递到下一个步骤。例如，您可能希望将训练步骤生成的模型构件作为模型评测或部署步骤的输入。您可以使用该功能创建相互依赖的管道步骤，并构建您的 ML 工作流程。

当您需要从管道步骤的输出中获取信息时，可以使用 `JsonGet`。`JsonGet` 可以帮助您从 Amazon S3 或属性文件中提取信息。下文将介绍使用 `JsonGet` 提取步进输出的方法。

## 使用 Amazon S3 在不同步骤之间传递数据


您可以在 `ConditionStep` 中使用 `JsonGet`，直接从 Amazon S3 获取 JSON 输出。Amazon S3 URI 可以是包含原始字符串、管道运行变量或管道参数的 `Std:Join` 函数。下面的示例展示了如何在 `ConditionStep` 中使用 `JsonGet`：

```
# Example json file in s3 bucket generated by a processing_step
{
   "Output": [5, 10]
}

cond_lte = ConditionLessThanOrEqualTo(
    left=JsonGet(
        step_name="<step-name>",
        s3_uri="<s3-path-to-json>",
        json_path="Output[1]"
    ),
    right=6.0
)
```

如果在条件步骤中使用带有 Amazon S3 路径的 `JsonGet`，则必须在条件步骤和生成 JSON 输出的步骤之间明确添加依赖关系。在下面的示例中，条件步骤的创建依赖于处理步骤：

```
cond_step = ConditionStep(
        name="<step-name>",
        conditions=[cond_lte],
        if_steps=[fail_step],
        else_steps=[register_model_step],
        depends_on=[processing_step],
)
```

## 使用属性文件在各步骤之间传递数据


使用属性文件存储处理步骤输出中的信息。这在分析处理步骤的结果以决定如何执行条件步骤时特别有用。该`JsonGet`函数处理属性文件，并允许您使用 JsonPath 符号来查询属性 JSON 文件。有关 JsonPath 符号的更多信息，请参阅 [JsonPath repo](https://github.com/json-path/JsonPath)。

要存储属性文件以备日后使用，必须先创建一个具有以下格式的 `PropertyFile` 实例。`path` 参数是保存属性文件的 JSON 文件的名称。任何 `output_name` 都必须与您在处理步骤中定义的 `ProcessingOutput` 的 `output_name` 相匹配。这使属性文件能够捕获步骤中的 `ProcessingOutput`。

```
from sagemaker.workflow.properties import PropertyFile

<property_file_instance> = PropertyFile(
    name="<property_file_name>",
    output_name="<processingoutput_output_name>",
    path="<path_to_json_file>"
)
```

创建`ProcessingStep`实例时，添加`property_files`参数以列出 Amazon SageMaker Pipelines 服务必须索引的所有参数文件。这将保存属性文件以备日后使用。

```
property_files=[<property_file_instance>]
```

要在条件步骤中使用属性文件，请将 `property_file` 添加到传递给条件步骤的条件中（如以下示例所示），以便使用 `json_path` 参数查询 JSON 文件中的所需属性。

```
cond_lte = ConditionLessThanOrEqualTo(
    left=JsonGet(
        step_name=step_eval.name,
        property_file=<property_file_instance>,
        json_path="mse"
    ),
    right=6.0
)
```

有关更深入的示例，请参阅 [Amaz SageMaker on Python 软件开发工具包](https://sagemaker.readthedocs.io/en/stable)中的*[属性文件](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#property-file)*。

# 缓存管道步骤


在 Amazon Pipelin SageMaker es 中，您可以在重新运行管道时使用步骤缓存来节省时间和资源。当某个步骤的配置和输入相同时，步骤缓存会重复使用该步骤前一次成功运行的输出（而不是重新计算）。这可帮助您在使用相同参数重新运行管道时获得一致的结果。下面的主题将向您介绍如何为管道配置和开启步骤缓存。

使用步骤签名缓存时，Pipelines 会尝试查找当前管道步骤中某些属性值相同的前一次运行。如果发现，Pipelines 会传播上一次运行的输出结果，而不是重新计算步骤。所检查的属性特定于步骤类型，并在 [按管道步骤类型划分的默认缓存键属性](pipelines-default-keys.md) 中列出。

您必须选择步骤缓存 - 默认情况下，它处于关闭状态。开启步骤缓存时，还必须定义超时。此超时定义了之前运行可以持续多久才能继续作为重复使用的候选项。

步骤缓存仅考虑成功的运行 - 它从不重复使用失败的运行。如果超时时间内有多次成功运行，Pipelines 会使用最近一次成功运行的结果。如果在超时时间内没有成功运行，Pipelines 会重新运行该步骤。如果执行程序发现之前的运行符合条件但仍在进行中，则两个步骤都将继续运行，如果成功运行，则会更新缓存。

步骤缓存仅适用于单个管道，因此即使存在步骤签名匹配项，也无法重复使用另一个管道中的步骤。

步骤缓存可用于以下步骤类型：
+ [Processing](build-and-manage-steps-types.md#step-type-processing)
+ [训练](build-and-manage-steps-types.md#step-type-training)
+ [优化](build-and-manage-steps-types.md#step-type-tuning)
+ [AutoML](build-and-manage-steps-types.md#step-type-automl)
+ [转换](build-and-manage-steps-types.md#step-type-transform)
+ [`ClarifyCheck`](build-and-manage-steps-types.md#step-type-clarify-check)
+ [`QualityCheck`](build-and-manage-steps-types.md#step-type-quality-check)
+ [EMR](build-and-manage-steps-types.md#step-type-emr)

**Topics**
+ [

# 开启步骤缓存
](pipelines-caching-enabling.md)
+ [

# 关闭步骤缓存
](pipelines-caching-disabling.md)
+ [

# 按管道步骤类型划分的默认缓存键属性
](pipelines-default-keys.md)
+ [

# 缓存数据访问控制
](pipelines-access-control.md)

# 开启步骤缓存


要开启步骤缓存，必须在步骤定义中添加 `CacheConfig` 属性。管道定义文件中的 `CacheConfig` 属性使用以下格式：

```
{
    "CacheConfig": {
        "Enabled": false,
        "ExpireAfter": "<time>"
    }
}
```

`Enabled` 字段指示是否为特定步骤开启了缓存。您可以将该字段设置为`true`，这会让 SageMaker AI 尝试查找具有相同属性的该步骤的上一次运行。或者，您可以将该字段设置为`false`，这会让 SageMaker AI 在每次管道运行时运行该步骤。 `ExpireAfter`是 [ISO 8601 持续时间](https://en.wikipedia.org/wiki/ISO_8601#Durations)格式的字符串，用于定义超时时间。`ExpireAfter` 持续时间可以是年、月、周、日、小时或分钟值。每个值都由一个数字和一个表示持续时间单位的字母组成。例如：
+ “30d”= 30 天
+ “5y”= 5 年
+ “T16m”= 16 分钟
+ “30dT5h”= 30 天零 5 小时。

以下讨论描述了使用 Amaz SageMaker on Python 软件开发工具包为新的或预先存在的管道开启缓存的过程。

**为新管道开启缓存**

对于新管道，请通过 `enable_caching=True` 初始化 `CacheConfig` 实例，并将其作为管道步骤的输入。以下示例为训练步骤开启缓存，并设置 1 小时的超时时间：

```
from sagemaker.workflow.pipeline_context import PipelineSession
from sagemaker.workflow.steps import CacheConfig
      
cache_config = CacheConfig(enable_caching=True, expire_after="PT1H")
estimator = Estimator(..., sagemaker_session=PipelineSession())

step_train = TrainingStep(
    name="TrainAbaloneModel",
    step_args=estimator.fit(inputs=inputs),
    cache_config=cache_config
)
```

**为预先存在的管道开启缓存**

要为预先存在、已经定义的管道开启缓存，请打开该步骤的 `enable_caching` 属性，然后将 `expire_after` 设置为超时值。最后，使用 `pipeline.upsert()` 或 `pipeline.update()` 更新管道。再次运行后，以下代码示例将为训练步骤开启缓存，超时时间为 1 小时：

```
from sagemaker.workflow.pipeline_context import PipelineSession
from sagemaker.workflow.steps import CacheConfig
from sagemaker.workflow.pipeline import Pipeline

cache_config = CacheConfig(enable_caching=True, expire_after="PT1H")
estimator = Estimator(..., sagemaker_session=PipelineSession())

step_train = TrainingStep(
    name="TrainAbaloneModel",
    step_args=estimator.fit(inputs=inputs),
    cache_config=cache_config
)

# define pipeline
pipeline = Pipeline(
    steps=[step_train]
)

# additional step for existing pipelines
pipeline.update()
# or, call upsert() to update the pipeline
# pipeline.upsert()
```

或者，在定义（预先存在的）管道之后更新缓存配置，这样就可以连续运行一段代码。以下代码示例演示了此方法：

```
# turn on caching with timeout period of one hour
pipeline.steps[0].cache_config.enable_caching = True 
pipeline.steps[0].cache_config.expire_after = "PT1H" 

# additional step for existing pipelines
pipeline.update()
# or, call upsert() to update the pipeline
# pipeline.upsert()
```

有关更详细的代码示例以及有关 Python 软件开发工具包参数如何影响缓存的讨论，请参阅 Amaz SageMaker on Python 软件开发工具包文档中的[缓存配置](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#caching-configuration)。

# 关闭步骤缓存


如果您更改未在 [按管道步骤类型划分的默认缓存键属性](pipelines-default-keys.md) 中列出的管道步骤类型的任何属性，则不会重新运行该管道步骤。不过，您可能会决定无论如何都要重新运行该管道步骤。在这种情况下，您需要关闭步骤缓存。

要关闭步骤缓存，请将步骤定义的 `CacheConfig` 属性中的 `Enabled` 属性设置为 `false`，如以下代码片段所示：

```
{
    "CacheConfig": {
        "Enabled": false,
        "ExpireAfter": "<time>"
    }
}
```

请注意，当 `Enabled` 为 `false` 时，将忽略 `ExpireAfter` 属性。

要使用 Amaz SageMaker on Python SDK 关闭工作流工序的缓存，请定义工作流工序的管道，关闭该`enable_caching`属性，然后更新管道。

再次运行后，以下代码示例会关闭训练步骤的缓存：

```
from sagemaker.workflow.pipeline_context import PipelineSession
from sagemaker.workflow.steps import CacheConfig
from sagemaker.workflow.pipeline import Pipeline

cache_config = CacheConfig(enable_caching=False, expire_after="PT1H")
estimator = Estimator(..., sagemaker_session=PipelineSession())

step_train = TrainingStep(
    name="TrainAbaloneModel",
    step_args=estimator.fit(inputs=inputs),
    cache_config=cache_config
)

# define pipeline
pipeline = Pipeline(
    steps=[step_train]
)

# update the pipeline
pipeline.update()
# or, call upsert() to update the pipeline
# pipeline.upsert()
```

或者，在定义管道之后关闭 `enable_caching` 属性，这样就可以连续运行一段代码。以下代码示例演示了此解决方案：

```
# turn off caching for the training step
pipeline.steps[0].cache_config.enable_caching = False

# update the pipeline
pipeline.update()
# or, call upsert() to update the pipeline
# pipeline.upsert()
```

有关更详细的代码示例以及有关 Python 软件开发工具包参数如何影响缓存的讨论，请参阅 Amaz SageMaker on Python 软件开发工具包文档中的[缓存配置](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#caching-configuration)。

# 按管道步骤类型划分的默认缓存键属性


在决定是否重用之前的管道步骤或重新运行该步骤时，Pipelines 会检查某些属性是否发生了变化。如果这组属性与超时时间段内所有之前的运行不同，则将再次运行该步骤。这些属性包括输入构件、应用程序或算法规范以及环境变量。以下列表显示了每种管道步骤类型和属性，这些属性如果发生更改，则会启动该步骤的重新运行。有关使用哪些 Python 开发工具包参数来创建以下属性的更多信息，请参阅 Amaz SageMaker on Python 软件开发工具包文档中的[缓存配置](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#caching-configuration)。

## [处理步骤](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateProcessingJob.html)

+ AppSpecification
+ 环境
+ ProcessingInputs。 此属性包含有关预处理脚本的信息。

  

## [训练步骤](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html)

+ AlgorithmSpecification
+ CheckpointConfig
+ DebugHookConfig
+ DebugRuleConfigurations
+ 环境
+ HyperParameters
+ InputDataConfig。 此属性包含有关训练脚本的信息。

  

## [优化步骤](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateHyperParameterTuningJob.html)

+ HyperParameterTuningJobConfig
+ TrainingJobDefinition。 此属性由多个子属性组成，并非所有子属性都会导致步骤重新运行。可能导致重新运行（如果已更改）的子属性如下：
  + AlgorithmSpecification
  + HyperParameterRanges
  + InputDataConfig
  + StaticHyperParameters
  + TuningObjective
+ TrainingJobDefinitions

  

## [AutoML 步骤](https://docs.amazonaws.cn//sagemaker/latest/APIReference/API_AutoMLJobConfig.html)

+ Auto MLJob Config。此属性由多个子属性组成，并非所有子属性都会导致该步骤重新运行。可能导致重新运行（如果已更改）的子属性如下：
  + CompletionCriteria
  + CandidateGenerationConfig
  + DataSplitConfig
  + Mode
+ 自动MLJob物镜
+ InputDataConfig
+ ProblemType

  

## [转换步骤](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTransformJob.html)

+ DataProcessing
+ 环境
+ ModelName
+ TransformInput

  

## [ClarifyCheck 步](build-and-manage-steps-types.md#step-type-clarify-check)

+ ClarifyCheckConfig
+ CheckJobConfig
+ SkipCheck
+ RegisterNewBaseline
+ ModelPackageGroupName
+ SuppliedBaselineConstraints

  

## [QualityCheck 步](build-and-manage-steps-types.md#step-type-quality-check)

+ QualityCheckConfig
+ CheckJobConfig
+ SkipCheck
+ RegisterNewBaseline
+ ModelPackageGroupName
+ SuppliedBaselineConstraints
+ SuppliedBaselineStatistics

  

## [EMR 步骤](https://docs.amazonaws.cn/sagemaker/latest/dg/build-and-manage-steps.html#step-type-emr)

+ ClusterId
+ StepConfig

  

# 缓存数据访问控制


当 A SageMaker I 管道运行时，它会缓存与管道启动的 SageMaker AI 作业相关的参数和元数据，并将其保存以供后续运行中重复使用。除了缓存的管道步骤外，还可以通过各种来源访问此元数据，包括以下类型：
+ `Describe*Job` 请求
+ CloudWatch 日志
+ CloudWatch 活动
+ CloudWatch 指标
+ SageMaker 人工智能搜索

请注意，对列表中每个数据源的访问都受其自身 IAM 权限集的控制。删除特定角色对一个数据源的访问权限不会影响对其他数据源的访问级别。例如，账户管理员可能会从调用方的角色中删除对 `Describe*Job` 请求的 IAM 权限。虽然调用方无法再发出 `Describe*Job` 请求，但只要他们有权运行管道，就仍然可以从使用缓存步骤的管道运行中检索元数据。如果账户管理员想要从特定 SageMaker AI 作业中完全移除对元数据的访问权限，则需要移除提供数据访问权限的每项相关服务的权限。

# 管道步骤的重试策略
重试策略

重试策略可帮助您在发生错误后自动重试 Pipelines 步骤。任何管道步骤都可能遇到异常，而发生异常的原因多种多样。在某些情况下，重试可以解决这些问题。通过管道步骤的重试策略，您可以选择是否重试特定管道步骤。

重试策略仅支持以下管道步骤：
+ [处理步骤](build-and-manage-steps-types.md#step-type-processing) 
+ [训练步骤](build-and-manage-steps-types.md#step-type-training) 
+ [优化步骤](build-and-manage-steps-types.md#step-type-tuning) 
+ [AutoML 步骤](build-and-manage-steps-types.md#step-type-automl) 
+ [创建模型步骤](build-and-manage-steps-types.md#step-type-create-model) 
+ [注册模型步骤](build-and-manage-steps-types.md#step-type-register-model) 
+ [转换步骤](build-and-manage-steps-types.md#step-type-transform) 
+ [笔记本作业步骤](build-and-manage-steps-types.md#step-type-notebook-job) 

**注意**  
在优化步骤和 AutoML 步骤中运行的作业在内部进行重试，即使配置了重试策略，也不会重试 `SageMaker.JOB_INTERNAL_ERROR` 异常类型。您可以使用 SageMaker API [编写自己的重试策略](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_RetryStrategy.html)。

## 重试策略支持的异常类型


管道步骤的重试策略支持以下异常类型：
+ `Step.SERVICE_FAULT`：如果调用下游服务时发生内部服务器错误或瞬时错误，则会发生这些异常。Pipelines 会自动重试此类错误。使用重试策略，您可以覆盖此异常类型的默认重试操作。
+ `Step.THROTTLING`：调用下游服务时可能会出现节流异常。Pipelines 会自动重试此类错误。使用重试策略，您可以覆盖此异常类型的默认重试操作。
+ `SageMaker.JOB_INTERNAL_ERROR`：这些异常发生在 SageMaker AI 任务返回时`InternalServerError`。在这种情况下，启动新作业可能会解决暂时性问题。
+ `SageMaker.CAPACITY_ERROR`: SageMaker AI 作业可能会遇到 Amazon EC2`InsufficientCapacityErrors`，这会导致 SageMaker AI 任务失败。您可以通过启动新的 SageMaker AI 作业来重试，以避免出现此问题。
+ `SageMaker.RESOURCE_LIMIT`：运行 SageMaker AI 作业时，您可以超出资源限制配额。您可以稍等片刻，然后在短时间后重试运行 SageMaker AI 作业，看看资源是否已释放。

## 重试策略的 JSON 架构


管道的重试策略具有以下 JSON 架构：

```
"RetryPolicy": {
   "ExceptionType": [String]
   "IntervalSeconds": Integer
   "BackoffRate": Double
   "MaxAttempts": Integer
   "ExpireAfterMin": Integer
}
```
+ `ExceptionType`：此字段需要以下字符串数组格式的异常类型。
  + `Step.SERVICE_FAULT`
  + `Step.THROTTLING`
  + `SageMaker.JOB_INTERNAL_ERROR`
  + `SageMaker.CAPACITY_ERROR`
  + `SageMaker.RESOURCE_LIMIT`
+ `IntervalSeconds`（可选）：第一次重试前的秒数（默认为 1）。`IntervalSeconds` 的最大值为 43200 秒（12 小时）。
+ `BackoffRate`（可选）：每次尝试时重试间隔增加的乘数（默认为 2.0）。
+ `MaxAttempts`（可选）：一个正整数，表示重试的最大次数（默认为 5）。如果错误重复发生超过 `MaxAttempts` 指定次数，则停止重试并恢复正常错误处理。值为 0 表示永不重试错误。`MaxAttempts` 最大值为 20。
+ `ExpireAfterMin`（可选）：一个正整数，表示重试的最大时间跨度。如果在执行步骤的 `ExpireAfterMin` 分钟数后再次出现错误，则停止重试并恢复正常的错误处理。值为 0 表示永不重试错误。`ExpireAfterMin ` 的最大值为 14400 分钟（10 天）。
**注意**  
只能给出 `MaxAttempts` 或 `ExpireAfterMin` 中的一个，但不能同时给出两个；如果两者均*未* 指定，则 `MaxAttempts` 变为默认值。如果在一个策略中标识了这两个属性，则重试策略会生成验证错误。

# 配置重试策略
重试策略示例

虽然 SageMaker Pipelines 提供了一种强大的自动化方式来编排机器学习工作流程，但在运行它们时可能会遇到故障。为了从容应对此类情况并提高管道的可靠性，您可以配置重试策略，定义遇到异常后如何以及何时自动重试特定步骤。重试策略允许您指定重试的异常类型、重试尝试的最大次数、重试间隔以及增加重试间隔的回退率。以下部分提供了一些示例，说明如何使用 JSON 和使用 SageMaker Python SDK 为管道中的训练步骤配置重试策略。

以下是使用重试策略的训练步骤的示例。

```
{
    "Steps": [
        {
            "Name": "MyTrainingStep",
            "Type": "Training",
            "RetryPolicies": [
                {
                    "ExceptionType": [
                        "SageMaker.JOB_INTERNAL_ERROR",
                        "SageMaker.CAPACITY_ERROR"
                    ],
                    "IntervalSeconds": 1,
                    "BackoffRate": 2,
                    "MaxAttempts": 5
                }
            ]
        }
    ]
}
```



以下示例说明如何使用重试策略在 SDK for Python (Boto3) 中构建 `TrainingStep`。

```
from sagemaker.workflow.retry import (
    StepRetryPolicy, 
    StepExceptionTypeEnum,
    SageMakerJobExceptionTypeEnum,
    SageMakerJobStepRetryPolicy
)

step_train = TrainingStep(
    name="MyTrainingStep",
    xxx,
    retry_policies=[
        // override the default 
        StepRetryPolicy(
            exception_types=[
                StepExceptionTypeEnum.SERVICE_FAULT, 
                StepExceptionTypeEnum.THROTTLING
            ],
            expire_after_mins=5,
            interval_seconds=10,
            backoff_rate=2.0 
        ),
        // retry when resource limit quota gets exceeded
        SageMakerJobStepRetryPolicy(
            exception_types=[SageMakerJobExceptionTypeEnum.RESOURCE_LIMIT],
            expire_after_mins=120,
            interval_seconds=60,
            backoff_rate=2.0
        ),
        // retry when job failed due to transient error or EC2 ICE.
        SageMakerJobStepRetryPolicy(
            failure_reason_types=[
                SageMakerJobExceptionTypeEnum.INTERNAL_ERROR,
                SageMakerJobExceptionTypeEnum.CAPACITY_ERROR,
            ],
            max_attempts=10,
            interval_seconds=30,
            backoff_rate=2.0
        )
    ]
)
```

有关为某些步骤类型配置重试行为的更多信息，请参阅 *[Amazon Python SDK 文档中的 Amaz SageMaker on Pipelin SageMaker es-重试政策](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#retry-policy)*。

# 选择性执行管道步骤
选择性执行

在使用管道创建工作流程和编排 ML 训练步骤时，您可能需要进行多个实验阶段。您可能只想重复某些步骤，而不是每次都运行完整的管道。通过管道，您可以有选择性地执行管道步骤。这有助于优化您的 ML 训练。选择性执行在以下情况下很有用：
+ 您想使用更新的实例类型、超参数或其他变量重新启动特定步骤，同时保留上游步骤中的参数。
+ 您的管道未能完成一个中间步骤。执行过程中的先前步骤（如数据准备或特征提取）的重新运行成本很高。您可能需要引入一个修复程序，并手动重新运行某些步骤来完成管道。

使用选择性执行，您可以选择运行任何步骤子集，前提是这些步骤在管道的有向无环图 (DAG) 中相连。以下 DAG 显示了管道工作流示例：

![\[示例管道的有向无环图 (DAG)。\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/pipeline-full.png)


您可以在选择性执行中选择步骤 `AbaloneTrain` 和 `AbaloneEval`，但不能只选择 `AbaloneTrain` 和 `AbaloneMSECond` 步骤，因为这些步骤在 DAG 中没有连接。对于工作流程中的非选定步骤，选择性执行会重复使用参考管道执行的输出，而不是重新运行这些步骤。此外，处于选定步骤下游的非选定步骤不会在选择性执行中运行。

如果您选择在管道中运行中间步骤的子集，则您的步骤可能取决于之前的步骤。 SageMaker AI 需要一个参考管道执行来为这些依赖项提供资源。例如，如果选择运行步骤 `AbaloneTrain` 和 `AbaloneEval`，则需要 `AbaloneProcess` 步骤的输出。您可以提供参考执行 ARN，也可以指示 SageMaker AI 使用最新的管道执行（这是默认行为）。如果您有参考执行，还可以从参考运行中创建运行时参数，并通过重载将其提供给选择性执行运行。有关更多信息，请参阅 [重复使用参考执行中的运行时参数值](#pipelines-selective-ex-reuse)。

具体来说，您可以使用 `SelectiveExecutionConfig` 为选择性执行管道运行提供配置。如果您为参考管道执行添加 ARN（带`source_pipeline_execution_arn`参数）， SageMaker AI 将使用您提供的管道执行中前一步的依赖关系。如果您未包含 ARN 并且存在最新的管道执行，则 SageMaker AI 会默认将其用作参考。如果您不包含 ARN 且不希望 SageMaker AI 使用您最新的管道执行，请设置为`reference_latest_execution`。`False` SageMaker AI 最终用作参考的管道执行，无论是最新的还是用户指定的，都必须处于`Success`或`Failed`状态。

下表汇总了 SageMaker AI 如何选择参考执行。


| `source_pipeline_execution_arn` 参数值 | `reference_latest_execution` 参数值 | 使用的参考执行 | 
| --- | --- | --- | 
| 管道 ARN | `True` 或未指定 | 指定的管道 ARN | 
| 管道 ARN | `False` | 指定的管道 ARN | 
| null 或未指定 | `True` 或未指定 | 最新的管道执行 | 
| null 或未指定 | `False` | 无 - 在这种情况下，请选择没有上游依赖关系的步骤 | 

有关选择性执行配置要求的更多信息，请参阅 s [agemaker.workflow.selective\$1execution\$1config。 SelectiveExecutionConfig](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#selective-execution-config)文档。

以下讨论包括适用于一些情况的示例，这些情况是：您要指定管道参考执行；使用最新的管道执行作为参考；或者在没有参考管道执行的情况下运行选择性执行。

## 使用用户指定的管道参考运行选择性执行


下面的示例演示了使用参考管道执行方式选择性执行步骤 `AbaloneTrain` 和 `AbaloneEval`。

```
from sagemaker.workflow.selective_execution_config import SelectiveExecutionConfig

selective_execution_config = SelectiveExecutionConfig(
    source_pipeline_execution_arn="arn:aws:sagemaker:us-west-2:123123123123:pipeline/abalone/execution/123ab12cd3ef", 
    selected_steps=["AbaloneTrain", "AbaloneEval"]
)

selective_execution = pipeline.start(
    execution_display_name=f"Sample-Selective-Execution-1",
    parameters={"MaxDepth":6, "NumRound":60},
    selective_execution_config=selective_execution_config,
)
```

## 以最新管道执行作为参考的选择性执行


下面的示例演示了以最新的管道执行为参考，有选择地执行步骤 `AbaloneTrain` 和 `AbaloneEval`。由于 SageMaker AI 默认使用最新的管道执行，因此您可以选择将`reference_latest_execution`参数设置为`True`。

```
# Prepare a new selective execution. Select only the first step in the pipeline without providing source_pipeline_execution_arn.
selective_execution_config = SelectiveExecutionConfig(
    selected_steps=["AbaloneTrain", "AbaloneEval"],
    # optional
    reference_latest_execution=True
)

# Start pipeline execution without source_pipeline_execution_arn
pipeline.start(
    execution_display_name=f"Sample-Selective-Execution-1",
    parameters={"MaxDepth":6, "NumRound":60},
    selective_execution_config=selective_execution_config,
)
```

## 无参考管道的选择性执行


以下示例演示了在`AbaloneTrain`不提供参考 ARN 的情况下选择性地执行这些步骤`AbaloneProcess`，并关闭了使用最新管道运行作为参考的选项。 SageMaker AI 允许这种配置，因为这部分步骤不依赖于之前的步骤。

```
# Prepare a new selective execution. Select only the first step in the pipeline without providing source_pipeline_execution_arn.
selective_execution_config = SelectiveExecutionConfig(
    selected_steps=["AbaloneProcess", "AbaloneTrain"],
    reference_latest_execution=False
)

# Start pipeline execution without source_pipeline_execution_arn
pipeline.start(
    execution_display_name=f"Sample-Selective-Execution-1",
    parameters={"MaxDepth":6, "NumRound":60},
    selective_execution_config=selective_execution_config,
)
```

## 重复使用参考执行中的运行时参数值


您可以使用 `build_parameters_from_execution` 从参考管道执行中构建参数，并将结果提供给选择性执行管道。您可以使用参考执行中的原始参数，也可以使用 `parameter_value_overrides` 参数应用任何覆盖。

以下示例说明了如何从参考执行构建参数以及如何对 `MseThreshold` 参数应用覆盖。

```
# Prepare a new selective execution.
selective_execution_config = SelectiveExecutionConfig(
    source_pipeline_execution_arn="arn:aws:sagemaker:us-west-2:123123123123:pipeline/abalone/execution/123ab12cd3ef",
    selected_steps=["AbaloneTrain", "AbaloneEval", "AbaloneMSECond"],
)
# Define a new parameters list to test.
new_parameters_mse={
    "MseThreshold": 5,
}

# Build parameters from reference execution and override with new parameters to test.
new_parameters = pipeline.build_parameters_from_execution(
    pipeline_execution_arn="arn:aws:sagemaker:us-west-2:123123123123:pipeline/abalone/execution/123ab12cd3ef",
    parameter_value_overrides=new_parameters_mse
)

# Start pipeline execution with new parameters.
execution = pipeline.start(
    selective_execution_config=selective_execution_config,
    parameters=new_parameters
)
```

# 基准计算、偏差检测和生命周期以及 Amazon Pi ClarifyCheck pelin SageMaker es 中的 QualityCheck 步骤
ClarifyCheck QualityCheck 基线

以下主题讨论了使用和[`QualityCheck`](build-and-manage-steps-types.md#step-type-quality-check)步骤时，Amazon Pipelin SageMaker es 中的基准[`ClarifyCheck`](build-and-manage-steps-types.md#step-type-clarify-check)和模型版本是如何演变的。

对于 `ClarifyCheck` 步骤，基准是位于带有后缀 `constraints` 的步骤属性中的单个文件。对于 `QualityCheck` 步骤，基准是位于步骤属性中的两个文件的组合：一个文件带有后缀 `statistics`，另一个文件带有后缀 `constraints`。在以下主题中，我们将讨论这些属性，并在前缀中说明它们的使用方式，以及在这两个管道步骤中对基准行为和生命周期的影响。例如，`ClarifyCheck` 步骤始终在 `CalculatedBaselineConstraints` 属性中计算和分配新的基准，而 `QualityCheck` 步骤在 `CalculatedBaselineConstraints` 和 `CalculatedBaselineStatistics` 属性中也执行相同的操作。

## 和 QualityCheck 步骤的基线计算 ClarifyCheck 和登记
基准计算和注册

`ClarifyCheck` 和 `QualityCheck` 步骤均始终根据底层处理作业运行中的步骤输入来计算新的基准。这些新计算的基准可通过带有前缀 `CalculatedBaseline` 的属性进行访问。您可以在[模型步骤](build-and-manage-steps-types.md#step-type-model)中将这些属性记录为模型包的 `ModelMetrics`。此模型包可以注册 5 种不同的基准。您可以针对每种检查类型注册其中一种基准：运行 `ClarifyCheck` 步骤时进行的数据偏差、模型偏差和模型可解释性检查，以及运行 `QualityCheck` 步骤时进行的模型质量和数据质量检查。`register_new_baseline` 参数决定了步骤运行后在属性中设置的前缀为 `BaselineUsedForDriftCheck` 的值。

下表列出了可能的使用案例，显示了您可以为 `ClarifyCheck` 和 `QualityCheck` 步骤设置的步骤参数所产生的不同行为：


| 选择此配置时可能考虑的使用案例  | `skip_check` / `register_new_baseline` | 步骤会进行偏差检查吗？ | 步骤属性 `CalculatedBaseline` 的值 | 步骤属性 `BaselineUsedForDriftCheck` 的值 | 
| --- | --- | --- | --- | --- | 
| 您正在定期进行再训练，并启用了检查以获得新的模型版本，但您*希望保留先前基准* 作为新模型版本的模型注册表中的 `DriftCheckBaselines`。 | False/ False | 根据现有基准进行偏差检查 | 通过运行该步骤计算出的新基准 | 模型注册表中最新批准模型的基准或作为步骤参数提供的基准 | 
| 您正在定期进行再训练，并启用了检查以获得新的模型版本，但您*希望用新计算出的基准对新模型版本的模型注册表中的 `DriftCheckBaselines` 进行刷新*。 | False/ True | 根据现有基准进行偏差检查 | 通过运行该步骤计算出的新基准 | 通过运行该步骤新计算出的基准（属性 CalculatedBaseline 的值） | 
| 您之所以启动管道是为了重新训练新模型版本，是因为 Amazon SageMaker Model Monitor 在终端节点上检测到*针对特定类型检查的违规行为，并且您想跳过对照先前基准的此类检查，但要像新模型版本的模型注册表`DriftCheckBaselines`中那样延续之前的基准*。 | True/ False | 没有偏差检查 | 通过运行该步骤计算的新基线 | 模型注册表中最新批准模型的基准或作为步骤参数提供的基准 | 
| 这发生在以下情况下：[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/sagemaker/latest/dg/pipelines-quality-clarify-baseline-lifecycle.html)  | True/ True | 没有偏差检查 | 通过运行该步骤计算出的新基准 | 通过运行该步骤新计算出的基准（属性 CalculatedBaseline 的值） | 

**注意**  
如果您在约束中使用科学记数法，则需要转换为浮点数。有关如何执行此操作的预处理脚本示例，请参阅[创建模型质量基准](https://docs.amazonaws.cn/sagemaker/latest/dg/model-monitor-model-quality-baseline.html)。

使用[模型步骤](build-and-manage-steps-types.md#step-type-model)注册模型时，可以将 `BaselineUsedForDriftCheck` 属性注册为 `DriftCheckBaselines`。然后，Model Monitor 可以使用这些基准文件进行模型和数据质量检查。此外，这些基线还可以在 ClarifyCheckStep 和`QualityCheck`步骤中使用，将新训练的模型与在模型注册表中注册的现有模型进行比较，以备将来的管道运行。

## 根据管道中以前的基线进行漂移检测
偏差检测

就 `QualityCheck` 步骤而言，当您启动管道进行定期再训练以获得新的模型版本时，如果数据质量和数据偏差在先前批准的模型版本的基准上存在 [违规情况的架构（constraint\$1violations.json 文件）](model-monitor-interpreting-violations.md)，则您可能不想运行训练步骤。在运行 `ClarifyCheck` 步骤时，如果模型质量、模型偏差或模型可解释性违反了先前批准的模型版本的已注册基准，则您可能不想注册新训练的模型版本。在这些情况下，您可以通过将相应检查步骤的 `skip_check` 属性设置为 `False` 来启用所需的检查，如果对照先前基准检测到违规行为，则 `ClarifyCheck` 和 `QualityCheck` 步骤将失败。然后，管道进程将不再继续，这样就不会注册偏离基准的模型。`ClarifyCheck` 和 `QualityCheck` 步骤能够获得给定模型包组的最新批准模型版本的 `DriftCheckBaselines`，并与之进行比较。对于 `QualityCheck` 步骤，除了 `supplied_baseline_statistics` 之外，也可以直接通过 `supplied_baseline_constraints` 提供先前的基准，并且这些基准始终优先于从模型包组中提取的任何基准。

## 基线和模型版本的生命周期以及管道的演变
基准生命周期和演进

将 `ClarifyCheck` 和 `QualityCheck` 步骤的 `register_new_baseline` 设置为 `False`，即可通过步骤属性前缀 `BaselineUsedForDriftCheck` 访问先前的基准。然后，当您使用[模型步骤](build-and-manage-steps-types.md#step-type-model)注册模型时，就可以将这些基准注册为新模型版本中的 `DriftCheckBaselines`。在模型注册表中批准此新模型版本后，此模型版本中的 `DriftCheckBaseline` 将可用于下一个管道进程中的 `ClarifyCheck` 和 `QualityCheck` 步骤。如果要刷新某种检查类型的基准以用于将来的模型版本，可以将 `register_new_baseline` 设置为 `True`，以便带前缀 `BaselineUsedForDriftCheck` 的属性成为新计算出的基准。通过这些方式，您可以为将来训练的模型保留首选基准，或者在需要时刷新基准以进行偏差检查，从而在整个模型训练迭代中管理基准演进和生命周期。

下图说明了基线演变和生命周期的 model-version-centric视图。

![\[基线演变和生命周期 model-version-centric视图。\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/pipelines/Baseline-Lifecycle.png)


# 安排管道运行
安排管道运行

[您可以使用亚马逊安排亚马逊 SageMaker 管道的执行 EventBridge。](https://docs.amazonaws.cn/eventbridge/latest/userguide/what-is-amazon-eventbridge.html)[亚马逊支持将亚马逊 SageMaker 管道作为目标 EventBridge。](https://docs.amazonaws.cn/eventbridge/latest/userguide/what-is-amazon-eventbridge.html)这样，您就可以根据事件总线中的任何事件启动建模管线的执行。借 EventBridge助，您可以自动执行管道并自动响应诸如训练作业或端点状态更改之类的事件。事件包括上传到您的 Amazon S3 存储桶的新文件、由于偏移而导致的 Amazon SageMaker AI 终端节点状态发生变化以及*亚马逊简单通知服务* (SNS) 主题。

可自动启动以下 Pipelines 操作：  
+  `StartPipelineExecution` 

有关安排 SageMaker AI 任务的更多信息，请参阅使用 A [mazon EventBridge 自动化 SageMaker AI](https://docs.amazonaws.cn/sagemaker/latest/dg/automating-sagemaker-with-eventbridge.html)。

**Topics**
+ [

## 向 Amazon 安排管道 EventBridge
](#pipeline-eventbridge-schedule)
+ [

## 使用 SageMaker Python 软件开发工具包安排管道
](#build-and-manage-scheduling)

## 向 Amazon 安排管道 EventBridge


要使用 Amazon Event CloudWatch s 开始管道执行，您必须创建 EventBridge[规则](https://docs.amazonaws.cn/eventbridge/latest/APIReference/API_Rule.html)。在为事件创建规则时，您可以指定在 EventBridge 收到与该规则匹配的事件时要采取的目标操作。当事件与规则匹配时， EventBridge 会将该事件发送到指定的目标并启动规则中定义的操作。

 以下教程展示了如何 EventBridge 使用 EventBridge控制台或来安排管道执行 Amazon CLI。  

### 先决条件

+  EventBridge 可以凭`SageMaker::StartPipelineExecution`权限代入的角色。如果您从 EventBridge控制台创建规则，则可以自动创建此角色；否则，您需要自己创建此角色。 有关创建 A SageMaker I 角色的信息，请参阅[SageMaker 角色](https://docs.amazonaws.cn/sagemaker/latest/dg/sagemaker-roles.html)。
+ 有待安排的亚马逊 SageMaker AI 管道。要创建 Amazon SageMaker AI 管道，请参阅[定义管道](https://docs.amazonaws.cn/sagemaker/latest/dg/define-pipeline.html)。

### 使用 EventBridge 控制台创建 EventBridge 规则


 以下过程说明如何使用 EventBridge 控制台创建 EventBridge 规则。  

1. 导航至 [EventBridge 控制台](https://console.amazonaws.cn/events)。

1. 选择左侧的**规则**。

1.  选择 `Create Rule`。

1. 为您的规则输入名称和描述。

1.  选择启动此规则的方式。您可以为规则提供以下选择：
   + **事件模式**：当发生与模式匹配的事件时，您的规则会启动。您可以选择与特定类型事件相匹配的预定义模式，也可以创建自定义模式。如果选择预定义模式，则可以编辑该模式以对其进行自定义。有关事件模式的更多信息，请参阅[事件中的 CloudWatch 事件模式](https://docs.amazonaws.cn/AmazonCloudWatch/latest/events/CloudWatchEventsandEventPatterns.html)。
   + **计划**：您的规则将按指定的计划定期启动。您可以使用固定速率的计划，该计划会定期启动并持续指定的分钟数、小时数或周数。您还可以使用 [cron 表达式](https://docs.amazonaws.cn/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions)来创建更精细的计划，例如“每月第一个星期一上午 8 点”。自定义或合作伙伴事件总线不支持计划。

1. 选择所需的事件总线。

1. 选择当某个事件与您的事件模式匹配或当计划启动时要调用的目标。最多可为每项规则添加 5 个目标。在目标下拉列表中选择 `SageMaker Pipeline`。

1. 从管道下拉列表中选择要启动的管道。

1. 使用名称和值对添加要传递给管道执行的参数。参数值可以是静态的，也可以是动态的。有关 Amazon A SageMaker I Pipeline 参数的更多信息，请参阅[AWS::Events::Rule SagemakerPipelineParameters](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-pipeline.html#aws-resource-sagemaker-pipeline-properties)。
   + 每次启动管道时，都会将静态值传递给管道执行。例如，如果`{"Name": "Instance_type", "Value": "ml.4xlarge"}`在参数列表中指定，则`StartPipelineExecutionRequest`每次 EventBridge 启动管道时都会将其作为参数传递。
   + 动态值是使用 JSON 路径指定的。 EventBridge 解析事件负载中的值，然后将其传递给管道执行。例如：*`$.detail.param.value`*

1. 选择要用于此规则的角色。您可以使用现有角色，也可以创建新的角色。

1. （可选）添加标签。

1. 选择 `Create` 以最终确定您的规则。

 您的规则现已生效，可以启动管道执行了。

### 使用创建 EventBridge 规则 [Amazon CLI](https://docs.amazonaws.cn/cli/latest/reference/events/index.html)


 以下过程说明如何使用创建 EventBridge 规则 Amazon CLI。

1. 创建要启动的规则。使用创建 EventBridge 规则时 Amazon CLI，您可以选择两个启动规则的方式，即事件模式和时间表。
   +  **事件模式**：当发生与模式匹配的事件时，您的规则会启动。您可以选择与特定类型事件相匹配的预定义模式，也可以创建自定义模式。如果选择预定义模式，则可以编辑该模式以对其进行自定义。  您可以使用以下命令创建具有事件模式的规则：

     ```
     aws events put-rule --name <RULE_NAME> ----event-pattern <YOUR_EVENT_PATTERN> --description <RULE_DESCRIPTION> --role-arn <ROLE_TO_EXECUTE_PIPELINE> --tags <TAGS>
     ```
   +  **计划**：您的规则将按指定的计划定期启动。您可以使用固定速率的计划，该计划会定期启动并持续指定的分钟数、小时数或周数。您还可以使用 cron 表达式来创建更精细的计划，例如“每月第一个星期一上午 8 点”。自定义或合作伙伴事件总线不支持计划。您可以使用以下命令创建具有计划的规则：

     ```
     aws events put-rule --name <RULE_NAME> --schedule-expression <YOUR_CRON_EXPRESSION> --description <RULE_DESCRIPTION> --role-arn <ROLE_TO_EXECUTE_PIPELINE> --tags <TAGS>
     ```

1. 添加目标，以便在某个事件与您的事件模式匹配或当计划启动时调用。最多可为每项规则添加 5 个目标。  对于每个目标，您必须指定：  
   +  ARN：管道的资源 ARN。
   +  角色 ARN： EventBridge 应假设角色的 ARN 来执行管道。
   +  参数：要传递的 SageMaker Amazon AI 管道参数。

1. 运行以下命令，使用 p [ut-](https://docs.amazonaws.cn/cli/latest/reference/events/put-targets.html) targets SageMaker 将 Amazon AI 管道作为目标传递给您的规则：

   ```
   aws events put-targets --rule <RULE_NAME> --event-bus-name <EVENT_BUS_NAME> --targets "[{\"Id\": <ID>, \"Arn\": <RESOURCE_ARN>, \"RoleArn\": <ROLE_ARN>, \"SageMakerPipelineParameter\": { \"SageMakerParameterList\": [{\"Name\": <NAME>, \"Value\": <VALUE>}]} }]"] 
   ```

## 使用 SageMaker Python 软件开发工具包安排管道


以下各节介绍如何使用 SageMaker Python SDK 设置 EventBridge 资源访问权限和创建管道计划。

### 所需的权限


您需要获得必要的权限才能使用管道调度程序。完成以下步骤设置权限：

1. 将以下最低权限策略附加到用于创建管道触发器或使用 Amazon 托管策略的 IAM 角色`AmazonEventBridgeSchedulerFullAccess`。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement":
       [
           {
               "Action":
               [
                   "scheduler:ListSchedules",
                   "scheduler:GetSchedule",
                   "scheduler:CreateSchedule",
                   "scheduler:UpdateSchedule",
                   "scheduler:DeleteSchedule"
               ],
               "Effect": "Allow",
               "Resource":
               [
                   "*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "iam:PassRole",
               "Resource": "arn:aws:iam::*:role/*", 
               "Condition": {
                   "StringLike": {
                       "iam:PassedToService": "scheduler.amazonaws.com"
                   }
               }
           }
       ]
   }
   ```

------

1.  EventBridge 通过将服务主体`scheduler.amazonaws.com`添加到该角色的信任策略中，与建立信任关系。如果您在 SageMaker Studio 中启动笔记本，请务必将以下信任策略附加到执行角色。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "scheduler.amazonaws.com",
                    "sagemaker.amazonaws.com"
                ]
            },
        "Action": "sts:AssumeRole"
        }
    ]
}
```

------

### 创建管道时间表


使用 `PipelineSchedule` 构造函数，可以将管道调度为运行一次或按预定时间间隔运行。管道计划必须是 `at`、`rate` 或 `cron` 类型。这组计划类型是[EventBridge 计划选项](https://docs.amazonaws.cn/scheduler/latest/UserGuide/schedule-types.html)的扩展。有关如何使用该`PipelineSchedule`类的更多信息，请参阅 [sagemaker.workflow.triggers。 PipelineSchedule](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#pipeline-schedule)。下面的示例演示了如何使用 `PipelineSchedule` 创建每种调度类型。

```
from sagemaker.workflow.triggers import PipelineSchedule

# schedules a pipeline run for 12/13/2023 at time 10:15:20 UTC
my_datetime_schedule = PipelineSchedule(
    name="<schedule-name>", 
    at=datetime(2023, 12, 13, 10, 15, 20)
)

# schedules a pipeline run every 5 minutes
my_rate_schedule = PipelineSchedule(
    name="<schedule-name>", 
    rate=(5, "minutes")
)

# schedules a pipeline run at 10:15am UTC on the last Friday of each month during the years 2022 to 2023
my_cron_schedule = PipelineSchedule(
    name="<schedule-name>", 
    cron="15 10 ? * 6L 2022-2023"
)
```

**注意**  
如果创建的是一次性计划表，需要访问当前时间，请使用 `datetime.utcnow()` 而不是 `datetime.now()`。后者不存储当前区域上下文，并导致传递到的时间不正确 EventBridge。

### 将触发器连接到管道


要将 `PipelineSchedule` 连接到管道，请在创建的管道对象上调用 `put_triggers`，并附上触发器列表。如果您收到响应 ARN，则表示您在账户中成功创建了计划，并 EventBridge 开始按指定的时间或速率调用目标管道。您必须指定具有正确权限的角色，才能将触发器附加到父管道。如果您不提供，Pipelines 会从[配置文件](https://docs.amazonaws.cn/sagemaker/latest/dg/train-remote-decorator-config.html)中获取用于创建管道的默认角色。

下面的示例演示了如何将计划附加到管道。

```
scheduled_pipeline = Pipeline(
    name="<pipeline-name>",
    steps=[...],
    sagemaker_session=<sagemaker-session>,
)
custom_schedule = PipelineSchedule(
    name="<schedule-name>", 
    at=datetime(year=2023, month=12, date=25, hour=10, minute=30, second=30)
)
scheduled_pipeline.put_triggers(triggers=[custom_schedule], role_arn=<role>)
```

### 描述当前的触发因素


要检索已创建的管道触发器的相关信息，您可以调用有触发器名称的 `describe_trigger()` API。此命令返回已创建计划表达式的详细信息，如开始时间、启用状态和其他有用信息。下面的代码段显示了一个调用示例：

```
scheduled_pipeline.describe_trigger(name="<schedule-name>")
```

### 清理触发资源


删除管道前，请清理现有触发器，以避免账户资源泄漏。应在销毁父管道之前删除触发器。您可以通过向 `delete_triggers` API 传递触发器名称列表来删除触发器。API 传递触发器名称列表，即可删除触发器。下面的代码段演示了如何删除触发器。

```
pipeline.delete_triggers(trigger_names=["<schedule-name>"])
```

**注意**  
删除触发器时请注意以下限制：  
通过指定触发器名称来删除触发器的选项仅在 SageMaker Python SDK 中可用。在 CLI 或 `DeletePipeline` API 调用中删除管道不会删除触发器。结果，触发器变成孤立状态， SageMaker AI 会尝试为不存在的管道开始运行。
此外，如果您正在使用另一个 notebook 会话或已经删除了管道目标，请通过调度程序 CL [I](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/scheduler/delete-schedule.html) 或 EventBridge 控制台清理孤立的计划。

# 亚马逊 SageMaker 实验集成
实验集成

Amaz SageMaker on Pipelines 与亚马逊 SageMaker 实验紧密集成。默认情况下，当 Pipelines 创建并执行管道时，如果不存在，则会创建以下 SageMaker 实验实体：
+ 管道的实验
+ 每次执行管道时的运行组
+ 为在管道执行步骤中创建的每个 SageMaker AI 作业添加到运行组的运行

您可以比较多个管道执行中的模型训练准确性等指标，就像在 SageMaker AI 模型训练实验的多个运行组中比较此类指标一样。

以下示例显示了 [Amaz SageMaker on Python 软件开发工具包](https://sagemaker.readthedocs.io/en/stable)中 Pip [elin](https://github.com/aws/sagemaker-python-sdk/blob/v2.41.0/src/sagemaker/workflow/pipeline.py) e 类的相关参数。

```
Pipeline(
    name="MyPipeline",
    parameters=[...],
    pipeline_experiment_config=PipelineExperimentConfig(
      ExecutionVariables.PIPELINE_NAME,
      ExecutionVariables.PIPELINE_EXECUTION_ID
    ),
    steps=[...]
)
```

如果您不想为管道创建实验和运行组，则将 `pipeline_experiment_config` 设置为 `None`。

**注意**  
Amaz SageMaker on Python SDK v2.41.0 中引入了实验集成。

根据为 `pipeline_experiment_config` 的 `ExperimentName` 和 `TrialName` 参数指定的内容，应用以下命名规则：
+ 如果不指定 `ExperimentName`，则将管道 `name` 用作实验名称。

  如果指定 `ExperimentName`，则将其用作实验名称。如果存在具有该名称的实验，则管道创建的运行组将添加到现有实验中。如果不存在具有该名称的实验，则会创建一个新的实验。
+ 如果不指定 `TrialName`，则将管道执行 ID 用作运行组名称。

  如果指定 `TrialName`，则将其用作运行组名称。如果存在具有该名称的运行组，则管道创建的运行将添加到现有的运行组中。如果不存在具有该名称的运行组，则会创建一个新的运行组。

**注意**  
删除创建了实验实体的管道时，不会删除这些实体。您可以使用 SageMaker 实验 API 来删除实体。

有关如何查看与管道关联的 SageMaker AI 实验实体的信息，请参阅[从管道访问实验数据](pipelines-studio-experiments.md)。有关 SageMaker 实验的更多信息，请参阅[Studio 经典版中的亚马逊 SageMaker 实验](experiments.md)。

下面几节将展示上述规则的示例，以及如何在管道定义文件中表示这些规则。有关管道定义文件的更多信息，请参阅 [管道概述](pipelines-overview.md)。

**Topics**
+ [

# 默认行为
](pipelines-experiments-default.md)
+ [

# 禁用实验集成
](pipelines-experiments-none.md)
+ [

# 指定自定义实验名称
](pipelines-experiments-custom-experiment.md)
+ [

# 指定自定义运行组名称
](pipelines-experiments-custom-trial.md)

# 默认行为


**创建管道**

创建 A SageMaker I 管道时的默认行为是自动将其与 SageMaker 实验集成。如果您未指定任何自定义配置， SageMaker AI 会创建一个与管道同名的实验，使用管道执行 ID 作为名称为管道的每次执行创建一个运行组，并在每个运行组中为作为管道步骤一部分启动的每个 SageMaker AI 作业单独运行。您可以无缝跟踪和比较不同管道执行的指标，类似于分析模型训练实验的方法。下一节演示了在定义管道而未明确配置实验集成时的默认行为。

省略了 `pipeline_experiment_config`。`ExperimentName` 默认为管道 `name`。`TrialName` 默认为执行 ID。

```
pipeline_name = f"MyPipeline"
pipeline = Pipeline(
    name=pipeline_name,
    parameters=[...],
    steps=[step_train]
)
```

**管道定义文件**

```
{
  "Version": "2020-12-01",
  "Parameters": [
    {
      "Name": "InputDataSource"
    },
    {
      "Name": "InstanceCount",
      "Type": "Integer",
      "DefaultValue": 1
    }
  ],
  "PipelineExperimentConfig": {
    "ExperimentName": {"Get": "Execution.PipelineName"},
    "TrialName": {"Get": "Execution.PipelineExecutionId"}
  },
  "Steps": [...]
}
```

# 禁用实验集成


**创建管道**

通过在定义管道`None`时将`pipeline_experiment_config`参数设置为，可以禁用管道与 SageMaker 实验的集成。这样， SageMaker AI 就不会自动创建用于跟踪与您的管道执行相关的指标和工件的实验、运行组或单独运行。下面的示例将管道配置参数设置为 `None`。

```
pipeline_name = f"MyPipeline"
pipeline = Pipeline(
    name=pipeline_name,
    parameters=[...],
    pipeline_experiment_config=None,
    steps=[step_train]
)
```

**管道定义文件**

这与前面的默认示例相同，但没有 `PipelineExperimentConfig`。

# 指定自定义实验名称


虽然默认行为是使用管道名称作为实验中的 SageMaker 实验名称，但您可以覆盖该名称并改为指定自定义实验名称。如果要将多个管道执行归入同一实验，以便于分析和比较，这将非常有用。运行组名称仍默认为管道执行 ID，除非您也明确设置了自定义名称。下一节将演示如何使用自定义实验名称创建管道，同时保留运行组名称作为默认执行 ID。

**创建管道**

```
pipeline_name = f"MyPipeline"
pipeline = Pipeline(
    name=pipeline_name,
    parameters=[...],
    pipeline_experiment_config=PipelineExperimentConfig(
      "CustomExperimentName",
      ExecutionVariables.PIPELINE_EXECUTION_ID
    ),
    steps=[step_train]
)
```

**管道定义文件**

```
{
  ...,
  "PipelineExperimentConfig": {
    "ExperimentName": "CustomExperimentName",
    "TrialName": {"Get": "Execution.PipelineExecutionId"}
  },
  "Steps": [...]
}
```

# 指定自定义运行组名称


除了设置自定义实验名称外，您还可以为管道执行期间 SageMaker 实验创建的运行组指定自定义名称。该名称会附加管道执行 ID，以确保唯一性。您可以指定自定义运行组名称，以识别和分析同一实验中的相关管道运行。下面将介绍如何使用自定义运行组名称定义管道，同时将默认管道名称用于实验名称。

**创建管道**

```
pipeline_name = f"MyPipeline"
pipeline = Pipeline(
    name=pipeline_name,
    parameters=[...],
    pipeline_experiment_config=PipelineExperimentConfig(
      ExecutionVariables.PIPELINE_NAME,
      Join(on="-", values=["CustomTrialName", ExecutionVariables.PIPELINE_EXECUTION_ID])
    ),
    steps=[step_train]
)
```

**管道定义文件**

```
{
  ...,
  "PipelineExperimentConfig": {
    "ExperimentName": {"Get": "Execution.PipelineName"},
    "TrialName": {
      "On": "-",
      "Values": [
         "CustomTrialName",
         {"Get": "Execution.PipelineExecutionId"}
       ]
    }
  },
  "Steps": [...]
}
```

# 使用本地模式运行管道


SageMaker 在托管 A SageMaker I 服务上执行管道之前，Pipelines 本地模式是测试训练、处理和推理脚本以及[管道参数](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#pipeline-parameters)的运行时兼容性的简便方法。通过使用本地模式，您可以使用较小的数据集在本地测试 SageMaker AI 管道。这样可以快速轻松地调试用户脚本和管道定义本身中的错误，而不会产生使用托管服务的成本。下面的主题将介绍如何在本地定义和运行管道。

Pipelines 本地模式在幕后利用 [SageMaker AI 作业本地模式](https://sagemaker.readthedocs.io/en/stable/overview.html#local-mode)。这是 SageMaker Python SDK 中的一项功能，允许你使用 Docker 容器在本地运行 SageMaker AI 内置镜像或自定义镜像。管道本地模式建立在 SageMaker AI 作业本地模式之上。因此，您将会看到与单独运行这些作业时相同的结果。例如，本地模式仍使用 Amazon S3 上传模型构件和处理输出。如果要将本地作业生成的数据存储在本地磁盘上，可以使用[本地模式](https://sagemaker.readthedocs.io/en/stable/overview.html#local-mode)中提到的设置。

管道本地模式目前支持以下步骤类型：
+ [训练步骤](build-and-manage-steps-types.md#step-type-training)
+ [处理步骤](build-and-manage-steps-types.md#step-type-processing)
+ [转换步骤](build-and-manage-steps-types.md#step-type-transform)
+ [模型步骤](https://docs.amazonaws.cn/sagemaker/latest/dg/build-and-manage-steps.html#step-type-model-create)（仅具有“创建模型”参数）
+ [条件步骤](build-and-manage-steps-types.md#step-type-condition)
+ [Fail 步骤](build-and-manage-steps-types.md#step-type-fail)

托管管道服务允许使用[并行配置](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#parallelism-configuration)并行执行多个步骤，而本地管道执行程序则是按顺序运行步骤。因此，本地管道的总体执行性能可能比在云上运行的管道差，这主要取决于数据集的大小、算法以及本地计算机的性能。另请注意，在本地模式下运行的流水线不会记录在[SageMaker 实验](https://docs.amazonaws.cn/sagemaker/latest/dg/pipelines-experiments.html)中。

**注意**  
管道本地模式与 SageMaker AI 算法不兼容，例如 XGBoost。如果要使用这些算法，则必须在[脚本模式](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-script-mode/sagemaker-script-mode.html)下使用它们。

为了在本地执行管道，与管道步骤和管道本身关联的 `sagemaker_session` 字段必须是 `LocalPipelineSession` 类型。以下示例显示了如何定义要在本地执行的 A SageMaker I 管道。

```
from sagemaker.workflow.pipeline_context import LocalPipelineSession
from sagemaker.pytorch import PyTorch
from sagemaker.workflow.steps import TrainingStep
from sagemaker.workflow.pipeline import Pipeline

local_pipeline_session = LocalPipelineSession()

pytorch_estimator = PyTorch(
    sagemaker_session=local_pipeline_session,
    role=sagemaker.get_execution_role(),
    instance_type="ml.c5.xlarge",
    instance_count=1,
    framework_version="1.8.0",
    py_version="py36",
    entry_point="./entry_point.py",
)

step = TrainingStep(
    name="MyTrainingStep",
    step_args=pytorch_estimator.fit(
        inputs=TrainingInput(s3_data="s3://amzn-s3-demo-bucket/my-data/train"),
    )
)

pipeline = Pipeline(
    name="MyPipeline",
    steps=[step],
    sagemaker_session=local_pipeline_session
)

pipeline.create(
    role_arn=sagemaker.get_execution_role(), 
    description="local pipeline example"
)

// pipeline will execute locally
execution = pipeline.start()

steps = execution.list_steps()

training_job_name = steps['PipelineExecutionSteps'][0]['Metadata']['TrainingJob']['Arn']

step_outputs = pipeline_session.sagemaker_client.describe_training_job(TrainingJobName = training_job_name)
```

准备好在托管 Pipelin SageMaker es 服务上执行管道后，可以通过将前面的代码片段`LocalPipelineSession`中的替换为`PipelineSession`（如以下代码示例所示），然后重新运行代码来实现。

```
from sagemaker.workflow.pipeline_context import PipelineSession

pipeline_session = PipelineSession()
```

# 对亚马逊 SageMaker 管道进行故障排除
管道问题排查

在使用 Amaz SageMaker on Pipelines 时，您可能会因为各种原因遇到问题。本主题提供有关常见错误以及如何解决这些错误的信息。

 **管道定义问题** 

您的管道定义可能格式不正确。这可能会导致  执行失败或作业不准确。可以在创建管道或执行管道时捕获这些错误。如果定义未通过验证，Pipelines 会返回一条错误信息，指出 JSON 文件畸形的字符。要修复此问题，请查看使用 SageMaker AI Python SDK 创建的步骤以确保准确性。

您只能在管道定义中包含一次步骤。因此，步骤不能作为条件步骤*和* 管道的一部分存在于同一管道中。

 **检查管道日志** 

您可以使用以下命令查看步骤的状态：

```
execution.list_steps()
```

每个步骤包含以下信息：
+ 管道启动的实体的 ARN，例如 SageMaker AI 作业 ARN、模型 ARN 或模型包 ARN。
+ 失败原因包括对步骤失败的简要说明。
+ 如果该步骤是条件步骤，则包括条件评估为 true 还是 false。  
+ 如果执行重复使用先前的作业执行，则 `CacheHit` 会列出源执行。  

您还可以在 Amazon SageMaker Studio 界面中查看错误消息和日志。有关如何在 Studio 中查看日志的信息，请参阅[查看管道运行的详细信息](pipelines-studio-view-execution.md)。

 **缺少权限** 

创建管道执行的角色以及在管道执行中创建每个作业的步骤都需要正确权限。如果没有这些权限，您可能无法按预期提交管道执行或运行 SageMaker AI 作业。要确保您的权限设置正确，请参阅 [IAM 访问管理](build-and-manage-access.md)。

 **作业执行错误** 

由于定义 SageMaker AI 作业功能的脚本存在问题，您在执行步骤时可能会遇到问题。每个作业都有一组日 CloudWatch 志。 要从 Studio 查看这些日志，请参阅[查看管道运行的详细信息](pipelines-studio-view-execution.md)。有关在 SageMaker AI 中使用 CloudWatch 日志的信息，请参阅[CloudWatch 亚马逊 A SageMaker I 的日志](logging-cloudwatch.md)。

 **属性文件错误** 

如果在管道中不正确地实施属性文件，可能会出现问题。要确保属性文件的实施按预期运行，请参阅[在步骤之间传递数据](build-and-manage-propertyfile.md)。

 **将脚本复制到 Dockerfile 中的容器的问题** 

您可以将脚本复制到容器中，也可以通过 `entry_point` 参数（估算器实体）或 `code` 参数（处理器实体）来传递脚本，如以下代码示例所示。

```
step_process = ProcessingStep(
    name="PreprocessAbaloneData",
    processor=sklearn_processor,
    inputs = [
        ProcessingInput(
            input_name='dataset',
            source=...,
            destination="/opt/ml/processing/code",
        )
    ],
    outputs=[
        ProcessingOutput(output_name="train", source="/opt/ml/processing/train", destination = processed_data_path),
        ProcessingOutput(output_name="validation", source="/opt/ml/processing/validation", destination = processed_data_path),
        ProcessingOutput(output_name="test", source="/opt/ml/processing/test", destination = processed_data_path),
    ],
    code=os.path.join(BASE_DIR, "process.py"), ## Code is passed through an argument
    cache_config = cache_config,
    job_arguments = ['--input', 'arg1']
)

sklearn_estimator = SKLearn(
    entry_point=os.path.join(BASE_DIR, "train.py"), ## Code is passed through the entry_point
    framework_version="0.23-1",
    instance_type=training_instance_type,
    role=role,
    output_path=model_path, # New
    sagemaker_session=sagemaker_session, # New
    instance_count=1, # New
    base_job_name=f"{base_job_prefix}/pilot-train",
    metric_definitions=[
        {'Name': 'train:accuracy', 'Regex': 'accuracy_train=(.*?);'},
        {'Name': 'validation:accuracy', 'Regex': 'accuracy_validation=(.*?);'}
    ],
)
```

# Pipelines 操作
Pipelines 操作

您可以使用 Amazon Pipelin SageMaker es Python 软件开发工具包或 Amazon SageMaker Studio 中的 drag-and-drop可视化设计器来创作、查看、编辑、执行和监控您的机器学习工作流程。

以下屏幕截图显示了可用于创建和管理 Amazon Pipelines 的可视化设计 SageMaker 器。

![\[Studio 中流水线的可视 drag-and-drop界面屏幕截图。\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/pipelines/pipelines-studio-overview.png)


部署管道后，您可以查看管道的有向无环图 (DAG)，并使用 Amazon SageMaker Studio 管理您的执行。 使用 SageMaker Studio，您可以获取有关当前和历史管道的信息、比较执行情况、查看执行的 DAG、获取元数据信息等。要了解如何从 Studio 查看管道，请参阅 [查看管道详情](pipelines-studio-list.md)。

**Topics**
+ [

# 定义管道
](define-pipeline.md)
+ [

# 编辑管道
](edit-pipeline-before-execution.md)
+ [

# 运行管道
](run-pipeline.md)
+ [

# 停止管道
](pipelines-studio-stop.md)
+ [

# 查看管道详情
](pipelines-studio-list.md)
+ [

# 查看管道运行的详细信息
](pipelines-studio-view-execution.md)
+ [

# 下载管道定义文件
](pipelines-studio-download.md)
+ [

# 从管道访问实验数据
](pipelines-studio-experiments.md)
+ [

# 跟踪管道的发展历程
](pipelines-lineage-tracking.md)

# 定义管道
定义管道

要使用 Amazon Pipelines 编排工作流程，您必须以 JSON SageMaker 管道定义的形式生成有向无环图 (DAG)。DAG 规定了 ML 流程中涉及的不同步骤，如数据预处理、模型训练、模型评测和模型部署，以及这些步骤之间的依赖关系和数据流。下面的主题将向您展示如何生成管道定义。

您可以使用 Python SDK 或 Amaz SageMaker on SageMaker Studio 中的可视化 drag-and-drop管道设计器功能生成 JSON 管道定义。下图是您在本教程中创建的管道 DAG 的示意图：

![\[Studio 中流水线的可视 drag-and-drop界面屏幕截图。\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/pipelines/pipelines-studio-overview.png)


您在以下章节中定义的管道解决了一个回归问题，即根据鲍鱼的物理测量值确定其年龄。有关包含本教程内容的可运行 Jupyter 笔记本，请参阅[使用 Amazon 模型构建管道编排作业](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-pipelines/tabular/abalone_build_train_deploy/sagemaker-pipelines-preprocess-train-evaluate-batch-transform.html)。 SageMaker 

**注意**  
您可以将模型位置作为训练步骤的属性进行引用，如 Github 中的 end-to-end示例[CustomerChurn 管道](https://github.com/aws-samples/customer-churn-sagemaker-pipelines-sample/blob/main/pipelines/customerchurn/pipeline.py)所示。

**Topics**

## 定义管道（Pipeline Designer）


以下演练将指导您完成使用流水线设计器创建准系统管道的 drag-and-drop步骤。如果您需要随时暂停或结束可视化设计器中的 Pipeline 编辑会话，请单击**导出**选项。这样就可以将管道的当前定义下载到本地环境中。之后，当您想恢复 Pipeline 编辑流程时，可以将相同的 JSON 定义文件导入可视化设计器。

### 创建 Processing 步骤


要创建数据处理作业步骤，请执行以下操作：

1. 按照 [启动亚马逊 SageMaker Studio](studio-updated-launch.md) 中的说明打开 Studio 管理控制台。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. 选择**创建**。

1. 选择**空白**。

1. 在左侧边栏中选择**处理数据**，然后将其拖到画布上。

1. 在画布中，选择添加的**处理数据**步骤。

1. 要添加输入数据集，请在右侧边栏的**数据（输入）**下选择**添加**，然后选择一个数据集。

1. 要添加保存输出数据集的位置，请在右侧边栏的**数据（输出）**下选择**添加**，然后导航至目的地。

1. 填写右侧边栏中的其余字段。有关这些选项卡中字段的信息，请参阅 [sagemaker.workflow.steps。 ProcessingStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.ProcessingStep)。

### 创建 Training 步骤


要设置模型训练步骤，请执行以下操作：

1. 在左侧边栏中选择**训练模型**，然后将其拖到画布上。

1. 在画布中选择添加的**训练模型**步骤。

1. 要添加输入数据集，请在右侧边栏的**数据（输入）**下选择**添加**，然后选择一个数据集。

1. 要选择保存模型构件的位置，请在**位置 (S3 URI)** 字段中输入 Amazon S3 URI，或选择 **Browse S3** 导航到目标位置。

1. 填写右侧边栏中的其余字段。有关这些选项卡中字段的信息，请参阅 [sagemaker.workflow.steps。 TrainingStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.TrainingStep)。

1. 单击并拖动光标，从上一节添加的**处理数据**步骤到**训练模型**步骤，创建连接两个步骤的边缘。

### 创建带有注册模型步骤的模型软件包


要创建带有模型注册步骤的模型软件包，请执行以下操作：

1. 在左侧边栏中选择**注册模型**，然后将其拖到画布上。

1. 在画布中，选择添加的**注册模型**步骤。

1. 要选择要注册的模型，请在**模型（输入）**下选择**添加**。

1. 选择**创建模型组**，将模型添加到新的模型组中。

1. 填写右侧边栏中的其余字段。有关这些选项卡中字段的信息，请参阅 [sagemaker.workflow.step\$1collections。 RegisterModel](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.step_collections.RegisterModel)。

1. 单击并拖动光标，从上一节添加的**训练模型**步骤到**注册模型**步骤，创建连接两个步骤的边缘。

### 通过 Deploy 模型（端点）步骤将模型部署到端点


要使用模型部署步骤部署模型，请执行以下操作：

1. 在左侧边栏中选择**部署模型（端点）**，然后将其拖到画布上。

1. 在画布中，选择添加的**部署模型（端点）**步骤。

1. 要选择要部署的模型，请在**模型（输入）**下选择**添加**。

1. 选择**创建端点**单选按钮创建新端点。

1. 为端点输入**姓名**和**描述**。

1. 单击并拖动光标，从上一节添加的**注册模型**步骤到**部署模型（端点）**步骤，创建连接两个步骤的边缘。

1. 填写右侧边栏中的其余字段。

### 定义 Pipeline 参数


您可以配置一组 Pipeline 参数，其值可在每次执行时更新。要定义管道参数并设置默认值，请单击可视化设计器底部的齿轮图标。

### 保存 Pipeline


输入创建管道所需的全部信息后，点击可视化设计器底部的**保存**。这将在运行时验证管道是否存在任何潜在错误，并通知您。在处理自动验证检查标记的所有错误之前，**保存**操作不会成功。如果您想在以后继续编辑，可以在本地环境中将正在进行的管道保存为 JSON 定义。您可以点击可视化设计器底部的**导出**按钮，将管道导出为 JSON 定义文件。之后，要继续更新管道，请点击**导入**按钮上传 JSON 定义文件。

## 定义管道（SageMaker Python 开发工具包）


### 先决条件


 要运行以下教程，请完成以下步骤：
+ 按照[创建笔记本实例](https://docs.amazonaws.cn/sagemaker/latest/dg/howitworks-create-ws.html)中所述的步骤设置笔记本实例。这使您的角色有权读取和写入 Amazon S3，以及在 A SageMaker I 中创建训练、批量转换和处理任务。
+ 授予笔记本获取和传递自身角色的权限，如[修改角色权限策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-modify_permissions-policy)中所示。添加以下 JSON 代码片段以将此策略附加到您的角色。将 `<your-role-arn>` 替换为用于创建笔记本实例的 ARN。

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "iam:GetRole",
                  "iam:PassRole"
              ],
              "Resource": "arn:aws:iam::111122223333:role/role-name"
          }
      ]
  }
  ```

------
+  按照[修改角色信任策略中的步骤信任 SageMaker ](https://docs.amazonaws.cn/IAM/latest/UserGuide/roles-managingrole-editing-cli.html#roles-managingrole_edit-trust-policy-cli) AI 服务主体。将以下语句片段添加到角色的信任关系中：

  ```
  {
        "Sid": "",
        "Effect": "Allow",
        "Principal": {
          "Service": "sagemaker.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
  ```

#### 设置环境


使用以下代码块创建新的 SageMaker AI 会话。这将返回会话的角色 ARN。此角色 ARN 应是您设置为先决条件的执行角色 ARN。

```
import boto3
import sagemaker
import sagemaker.session
from sagemaker.workflow.pipeline_context import PipelineSession

region = boto3.Session().region_name
sagemaker_session = sagemaker.session.Session()
role = sagemaker.get_execution_role()
default_bucket = sagemaker_session.default_bucket()

pipeline_session = PipelineSession()

model_package_group_name = f"AbaloneModelPackageGroupName"
```

### 创建管道


**重要**  
允许 Amazon SageMaker Studio 或 Amazon SageMaker Studio Classic 创建亚马逊 SageMaker资源的自定义 IAM 策略还必须授予向这些资源添加标签的权限。之所以需要为资源添加标签的权限，是因为 Studio 和 Studio Classic 会自动为创建的任何资源添加标签。如果 IAM 策略允许 Studio 和 Studio Classic 创建资源但不允许标记，则在尝试创建资源时可能会出现 AccessDenied “” 错误。有关更多信息，请参阅 [提供标记 A SageMaker I 资源的权限](security_iam_id-based-policy-examples.md#grant-tagging-permissions)。  
[Amazon 亚马逊 A SageMaker I 的托管策略](security-iam-awsmanpol.md)授予创建 SageMaker 资源的权限已经包括在创建这些资源时添加标签的权限。

从 SageMaker AI 笔记本实例运行以下步骤，创建包含以下步骤的管道：
+ 预处理
+ 训练
+ 评测
+ 条件评估
+ 模型注册

**注意**  
您可以使用[ExecutionVariables](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#execution-variables)和 [Join](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#execution-variables) 函数来指定输出位置。 `ExecutionVariables`在运行时已解析。例如，`ExecutionVariables.PIPELINE_EXECUTION_ID` 解析为当前执行的 ID，可在不同运行中用作唯一标识符。

#### 步骤 1：下载数据集


此笔记本使用 UCI 机器学习鲍鱼数据集。该数据集包含以下特征：
+ `length` - 鲍鱼外壳最长测量值。
+ `diameter` - 垂直于长度方向的鲍鱼直径。
+ `height` - 带肉鲍鱼在壳内的高度。
+ `whole_weight` - 整只鲍鱼的重量。
+ `shucked_weight` - 从鲍鱼身上取出的肉的重量。
+ `viscera_weight` - 鲍鱼内脏出血后的重量。
+ `shell_weight` - 去肉和干燥后鲍鱼壳的重量。
+ `sex` - 鲍鱼的性别。“M”、“F”或“I”中的一个，其中“I”是幼鲍。
+ `rings` - 鲍鱼壳上的环数。

鲍鱼壳上的环数是其年龄的近似值，计算公式为 `age=rings + 1.5`。然而，获取这一数字是一项耗时的任务。您必须从锥体上切壳，将切面染色，然后通过显微镜计算环数。不过，其他物理测量数据比较容易获得。此笔记本使用该数据集，利用其他物理测量值来构建 rings 变量的预测模型。

**下载数据集**

1. 将数据集下载到您账户的默认 Amazon S3 存储桶中。

   ```
   !mkdir -p data
   local_path = "data/abalone-dataset.csv"
   
   s3 = boto3.resource("s3")
   s3.Bucket(f"sagemaker-servicecatalog-seedcode-{region}").download_file(
       "dataset/abalone-dataset.csv",
       local_path
   )
   
   base_uri = f"s3://{default_bucket}/abalone"
   input_data_uri = sagemaker.s3.S3Uploader.upload(
       local_path=local_path, 
       desired_s3_uri=base_uri,
   )
   print(input_data_uri)
   ```

1. 创建模型后，下载第二个数据集进行批量转换。

   ```
   local_path = "data/abalone-dataset-batch.csv"
   
   s3 = boto3.resource("s3")
   s3.Bucket(f"sagemaker-servicecatalog-seedcode-{region}").download_file(
       "dataset/abalone-dataset-batch",
       local_path
   )
   
   base_uri = f"s3://{default_bucket}/abalone"
   batch_data_uri = sagemaker.s3.S3Uploader.upload(
       local_path=local_path, 
       desired_s3_uri=base_uri,
   )
   print(batch_data_uri)
   ```

#### 步骤 2：定义管道参数


 此代码块为您的管道定义了以下参数：
+  `processing_instance_count` - 处理作业的实例数。
+  `input_data` - 输入数据在 Amazon S3 中的位置。
+  `batch_data` - 用于批量转换的输入数据在 Amazon S3 中的位置。
+  `model_approval_status` - 为 CI/CD 注册已训练模型的批准状态。有关更多信息，请参阅 [MLOps SageMaker 项目自动化](sagemaker-projects.md)。

```
from sagemaker.workflow.parameters import (
    ParameterInteger,
    ParameterString,
)

processing_instance_count = ParameterInteger(
    name="ProcessingInstanceCount",
    default_value=1
)
model_approval_status = ParameterString(
    name="ModelApprovalStatus",
    default_value="PendingManualApproval"
)
input_data = ParameterString(
    name="InputData",
    default_value=input_data_uri,
)
batch_data = ParameterString(
    name="BatchData",
    default_value=batch_data_uri,
)
```

#### 步骤 3：确定特征工程的处理步骤


本节介绍如何创建一个处理步骤，从数据集中准备用于训练的数据。

**创建处理步骤**

1.  为处理脚本创建目录。

   ```
   !mkdir -p abalone
   ```

1. 在 `/abalone` 目录中创建一个包含以下内容的名为 `preprocessing.py` 的文件。该预处理脚本将被传入处理步骤，以便在输入数据上运行。然后，训练步骤使用预处理的训练功能和标签来训练模型。评估步骤使用训练过的模型和预处理过的测试功能和标签对模型进行评估。该脚本使用 `scikit-learn` 执行以下操作：
   +  填入缺失的 `sex` 分类数据并对其进行编码，使其适合训练。
   +  缩放和标准化除 `rings` 和 `sex` 之外的所有数值字段。
   +  将数据拆分为训练、测试和验证数据集。

   ```
   %%writefile abalone/preprocessing.py
   import argparse
   import os
   import requests
   import tempfile
   import numpy as np
   import pandas as pd
   
   
   from sklearn.compose import ColumnTransformer
   from sklearn.impute import SimpleImputer
   from sklearn.pipeline import Pipeline
   from sklearn.preprocessing import StandardScaler, OneHotEncoder
   
   
   # Because this is a headerless CSV file, specify the column names here.
   feature_columns_names = [
       "sex",
       "length",
       "diameter",
       "height",
       "whole_weight",
       "shucked_weight",
       "viscera_weight",
       "shell_weight",
   ]
   label_column = "rings"
   
   feature_columns_dtype = {
       "sex": str,
       "length": np.float64,
       "diameter": np.float64,
       "height": np.float64,
       "whole_weight": np.float64,
       "shucked_weight": np.float64,
       "viscera_weight": np.float64,
       "shell_weight": np.float64
   }
   label_column_dtype = {"rings": np.float64}
   
   
   def merge_two_dicts(x, y):
       z = x.copy()
       z.update(y)
       return z
   
   
   if __name__ == "__main__":
       base_dir = "/opt/ml/processing"
   
       df = pd.read_csv(
           f"{base_dir}/input/abalone-dataset.csv",
           header=None, 
           names=feature_columns_names + [label_column],
           dtype=merge_two_dicts(feature_columns_dtype, label_column_dtype)
       )
       numeric_features = list(feature_columns_names)
       numeric_features.remove("sex")
       numeric_transformer = Pipeline(
           steps=[
               ("imputer", SimpleImputer(strategy="median")),
               ("scaler", StandardScaler())
           ]
       )
   
       categorical_features = ["sex"]
       categorical_transformer = Pipeline(
           steps=[
               ("imputer", SimpleImputer(strategy="constant", fill_value="missing")),
               ("onehot", OneHotEncoder(handle_unknown="ignore"))
           ]
       )
   
       preprocess = ColumnTransformer(
           transformers=[
               ("num", numeric_transformer, numeric_features),
               ("cat", categorical_transformer, categorical_features)
           ]
       )
       
       y = df.pop("rings")
       X_pre = preprocess.fit_transform(df)
       y_pre = y.to_numpy().reshape(len(y), 1)
       
       X = np.concatenate((y_pre, X_pre), axis=1)
       
       np.random.shuffle(X)
       train, validation, test = np.split(X, [int(.7*len(X)), int(.85*len(X))])
   
       
       pd.DataFrame(train).to_csv(f"{base_dir}/train/train.csv", header=False, index=False)
       pd.DataFrame(validation).to_csv(f"{base_dir}/validation/validation.csv", header=False, index=False)
       pd.DataFrame(test).to_csv(f"{base_dir}/test/test.csv", header=False, index=False)
   ```

1.  创建要传递到处理步骤的 `SKLearnProcessor` 的实例。

   ```
   from sagemaker.sklearn.processing import SKLearnProcessor
   
   
   framework_version = "0.23-1"
   
   sklearn_processor = SKLearnProcessor(
       framework_version=framework_version,
       instance_type="ml.m5.xlarge",
       instance_count=processing_instance_count,
       base_job_name="sklearn-abalone-process",
       sagemaker_session=pipeline_session,
       role=role,
   )
   ```

1. 创建处理步骤。此步骤采用 `SKLearnProcessor`、输入和输出通道以及您创建的 `preprocessing.py` 脚本。这与 SageMaker AI Python SDK 中处理器实例的`run`方法非常相似。传入 `ProcessingStep` 的 `input_data` 参数是步骤本身的输入数据。处理器实例运行时会使用这些输入数据。

    请注意在处理作业的输出配置中指定的 `"train`、`"validation` 和 `"test"` 命名通道。这样的步骤 `Properties` 可以在后续步骤中使用，并在运行时解析为运行时值。

   ```
   from sagemaker.processing import ProcessingInput, ProcessingOutput
   from sagemaker.workflow.steps import ProcessingStep
      
   
   processor_args = sklearn_processor.run(
       inputs=[
         ProcessingInput(source=input_data, destination="/opt/ml/processing/input"),  
       ],
       outputs=[
           ProcessingOutput(output_name="train", source="/opt/ml/processing/train"),
           ProcessingOutput(output_name="validation", source="/opt/ml/processing/validation"),
           ProcessingOutput(output_name="test", source="/opt/ml/processing/test")
       ],
       code="abalone/preprocessing.py",
   ) 
   
   step_process = ProcessingStep(
       name="AbaloneProcess",
       step_args=processor_args
   )
   ```

#### 步骤 4：确定训练步骤


本节介绍如何使用 SageMaker AI [XGBoost算法](https://docs.amazonaws.cn/sagemaker/latest/dg/xgboost.html)根据处理步骤输出的训练数据训练模型。

**定义训练步骤**

1.  指定要保存训练模型的模型路径。

   ```
   model_path = f"s3://{default_bucket}/AbaloneTrain"
   ```

1. 为 XGBoost 算法和输入数据集配置估计器。训练实例类型传递到估算器中。一个典型的训练脚本：
   + 从输入通道加载数据
   + 配置超参数训练
   + 训练模型
   + 将模型保存到 `model_dir`，以便日后托管

   SageMaker AI 在训练作业结束`model.tar.gz`时以 a 的形式将模型上传到 Amazon S3。

   ```
   from sagemaker.estimator import Estimator
   
   
   image_uri = sagemaker.image_uris.retrieve(
       framework="xgboost",
       region=region,
       version="1.0-1",
       py_version="py3",
       instance_type="ml.m5.xlarge"
   )
   xgb_train = Estimator(
       image_uri=image_uri,
       instance_type="ml.m5.xlarge",
       instance_count=1,
       output_path=model_path,
       sagemaker_session=pipeline_session,
       role=role,
   )
   xgb_train.set_hyperparameters(
       objective="reg:linear",
       num_round=50,
       max_depth=5,
       eta=0.2,
       gamma=4,
       min_child_weight=6,
       subsample=0.7,
       silent=0
   )
   ```

1. 使用估计器实例和 `ProcessingStep` 的属性创建一个 `TrainingStep`。将 `"train"` 的 `S3Uri` 和 `"validation"` 输出通道传递给 `TrainingStep`。  

   ```
   from sagemaker.inputs import TrainingInput
   from sagemaker.workflow.steps import TrainingStep
   
   
   train_args = xgb_train.fit(
       inputs={
           "train": TrainingInput(
               s3_data=step_process.properties.ProcessingOutputConfig.Outputs[
                   "train"
               ].S3Output.S3Uri,
               content_type="text/csv"
           ),
           "validation": TrainingInput(
               s3_data=step_process.properties.ProcessingOutputConfig.Outputs[
                   "validation"
               ].S3Output.S3Uri,
               content_type="text/csv"
           )
       },
   )
   
   step_train = TrainingStep(
       name="AbaloneTrain",
       step_args = train_args
   )
   ```

#### 步骤 5：确定模型评测的处理步骤


本节介绍如何创建处理步骤以评估模型的精度。该模型评测的结果用于条件步骤，以确定采取哪种运行路径。

**定义模型评测的处理步骤**

1. 在名为 `evaluation.py` 的 `/abalone` 目录中创建一个文件。此脚本在处理步骤中用于执行模型评测。它以经过训练的模型和测试数据集作为输入，然后生成包含分类评估指标的 JSON 文件。

   ```
   %%writefile abalone/evaluation.py
   import json
   import pathlib
   import pickle
   import tarfile
   import joblib
   import numpy as np
   import pandas as pd
   import xgboost
   
   
   from sklearn.metrics import mean_squared_error
   
   
   if __name__ == "__main__":
       model_path = f"/opt/ml/processing/model/model.tar.gz"
       with tarfile.open(model_path) as tar:
           tar.extractall(path=".")
       
       model = pickle.load(open("xgboost-model", "rb"))
   
       test_path = "/opt/ml/processing/test/test.csv"
       df = pd.read_csv(test_path, header=None)
       
       y_test = df.iloc[:, 0].to_numpy()
       df.drop(df.columns[0], axis=1, inplace=True)
       
       X_test = xgboost.DMatrix(df.values)
       
       predictions = model.predict(X_test)
   
       mse = mean_squared_error(y_test, predictions)
       std = np.std(y_test - predictions)
       report_dict = {
           "regression_metrics": {
               "mse": {
                   "value": mse,
                   "standard_deviation": std
               },
           },
       }
   
       output_dir = "/opt/ml/processing/evaluation"
       pathlib.Path(output_dir).mkdir(parents=True, exist_ok=True)
       
       evaluation_path = f"{output_dir}/evaluation.json"
       with open(evaluation_path, "w") as f:
           f.write(json.dumps(report_dict))
   ```

1.  创建 `ScriptProcessor` 的实例，用于创建 `ProcessingStep`。

   ```
   from sagemaker.processing import ScriptProcessor
   
   
   script_eval = ScriptProcessor(
       image_uri=image_uri,
       command=["python3"],
       instance_type="ml.m5.xlarge",
       instance_count=1,
       base_job_name="script-abalone-eval",
       sagemaker_session=pipeline_session,
       role=role,
   )
   ```

1.  创建一个使用处理实例、输入和输出通道以及 `evaluation.py` 脚本的处理器的 `ProcessingStep`。传入：
   + `step_train` 训练步骤中的 `S3ModelArtifacts` 属性
   + `step_process` 处理步骤的 `"test"` 输出通道的 `S3Uri`

   这与 SageMaker AI Python SDK 中处理器实例的`run`方法非常相似。  

   ```
   from sagemaker.workflow.properties import PropertyFile
   
   
   evaluation_report = PropertyFile(
       name="EvaluationReport",
       output_name="evaluation",
       path="evaluation.json"
   )
   
   eval_args = script_eval.run(
           inputs=[
           ProcessingInput(
               source=step_train.properties.ModelArtifacts.S3ModelArtifacts,
               destination="/opt/ml/processing/model"
           ),
           ProcessingInput(
               source=step_process.properties.ProcessingOutputConfig.Outputs[
                   "test"
               ].S3Output.S3Uri,
               destination="/opt/ml/processing/test"
           )
       ],
       outputs=[
           ProcessingOutput(output_name="evaluation", source="/opt/ml/processing/evaluation"),
       ],
       code="abalone/evaluation.py",
   )
   
   step_eval = ProcessingStep(
       name="AbaloneEval",
       step_args=eval_args,
       property_files=[evaluation_report],
   )
   ```

#### 步骤 6： CreateModelStep 为批量转换定义一个


**重要**  
我们建议使用从 P [模型步骤](build-and-manage-steps-types.md#step-type-model) ython 软件开发工具包的 2.90.0 版本开始创建模型。 SageMaker `CreateModelStep`将继续在以前版本的 SageMaker Python SDK 中运行，但不再受支持。

本节介绍如何根据训练步骤的输出创建 SageMaker AI 模型。此模型用于对新数据集进行批量转换。该步骤会传入条件步骤，只有当条件步骤的结果为 `true` 时才会运行。

**CreateModelStep 为批量转换定义一个**

1.  创建 A SageMaker I 模型。从 `step_train` 训练步骤传入 `S3ModelArtifacts` 属性。

   ```
   from sagemaker.model import Model
   
   
   model = Model(
       image_uri=image_uri,
       model_data=step_train.properties.ModelArtifacts.S3ModelArtifacts,
       sagemaker_session=pipeline_session,
       role=role,
   )
   ```

1. 为 SageMaker AI 模型定义模型输入。

   ```
   from sagemaker.inputs import CreateModelInput
   
   
   inputs = CreateModelInput(
       instance_type="ml.m5.large",
       accelerator_type="ml.eia1.medium",
   )
   ```

1. `CreateModelStep`使用您定义的`CreateModelInput`和 SageMaker AI 模型实例创建您的。

   ```
   from sagemaker.workflow.steps import CreateModelStep
   
   
   step_create_model = CreateModelStep(
       name="AbaloneCreateModel",
       model=model,
       inputs=inputs,
   )
   ```

#### 步骤 7：定义一个 TransformStep 以执行批量转换


本节介绍如何在模型训练完毕后创建 `TransformStep` 以对数据集执行批量转换。该步骤会传入条件步骤，只有当条件步骤的结果为 `true` 时才会运行。

**要定义 TransformStep 要执行批量转换**

1. 使用适当的计算实例类型、实例数量和所需的输出 Amazon S3 存储桶 URI 创建转换器实例。从 `step_create_model` `CreateModel` 步骤传入 `ModelName` 属性。

   ```
   from sagemaker.transformer import Transformer
   
   
   transformer = Transformer(
       model_name=step_create_model.properties.ModelName,
       instance_type="ml.m5.xlarge",
       instance_count=1,
       output_path=f"s3://{default_bucket}/AbaloneTransform"
   )
   ```

1. 使用您定义的转换器实例和 `batch_data` 管道参数创建 `TransformStep`。

   ```
   from sagemaker.inputs import TransformInput
   from sagemaker.workflow.steps import TransformStep
   
   
   step_transform = TransformStep(
       name="AbaloneTransform",
       transformer=transformer,
       inputs=TransformInput(data=batch_data)
   )
   ```

#### 步骤 8：定义创建模型包的 RegisterModel 步骤


**重要**  
我们建议使用从 P [模型步骤](build-and-manage-steps-types.md#step-type-model) ython SDK 版本 2.90.0 起注册模型。 SageMaker `RegisterModel`将继续在以前版本的 SageMaker Python SDK 中运行，但不再受支持。

本节将介绍如何创建 `RegisterModel` 实例。在管道中运行 `RegisterModel` 的结果是一个模型软件包。模型包是一种可重复使用的模型构件抽象，它封装了推理所需的所有要素。它由一个定义要使用的推理映像的推理规范和一个可选的模型权重位置组成。模型包组是模型包的集合。您可以为管道使用 `ModelPackageGroup`，为每次管道运行向组中添加新版本和模型软件包。有关模型注册表的更多信息，请参阅[利用模型注册中心进行模型注册部署](model-registry.md)。

该步骤会传入条件步骤，只有当条件步骤的结果为 `true` 时才会运行。

**定义创建模型包的 RegisterModel 步骤**
+  使用您用于训练步骤的估算器实例构造一个 `RegisterModel` 步骤。从 `step_train` 训练步骤传入 `S3ModelArtifacts` 属性并指定 `ModelPackageGroup`。Pipelines 会为您创建此 `ModelPackageGroup`。

  ```
  from sagemaker.model_metrics import MetricsSource, ModelMetrics 
  from sagemaker.workflow.step_collections import RegisterModel
  
  
  model_metrics = ModelMetrics(
      model_statistics=MetricsSource(
          s3_uri="{}/evaluation.json".format(
              step_eval.arguments["ProcessingOutputConfig"]["Outputs"][0]["S3Output"]["S3Uri"]
          ),
          content_type="application/json"
      )
  )
  step_register = RegisterModel(
      name="AbaloneRegisterModel",
      estimator=xgb_train,
      model_data=step_train.properties.ModelArtifacts.S3ModelArtifacts,
      content_types=["text/csv"],
      response_types=["text/csv"],
      inference_instances=["ml.t2.medium", "ml.m5.xlarge"],
      transform_instances=["ml.m5.xlarge"],
      model_package_group_name=model_package_group_name,
      approval_status=model_approval_status,
      model_metrics=model_metrics
  )
  ```

#### 步骤 9：定义条件步骤以验证模型的准确性


`ConditionStep` 允许 Pipelines 根据步骤属性的条件在管道 DAG 中支持有条件运行。在这种情况下，只有当模型的精度超过要求值时，才需要注册模型软件包。模型的准确性由模型评测步骤决定。如果精度超过所需值，管道还会创建 A SageMaker I 模型并对数据集运行批量转换。本节介绍如何定义条件步骤。

**定义条件步骤以验证模型精度**

1.  使用模型评测处理步骤 `step_eval` 的输出中找到的精度值定义 `ConditionLessThanOrEqualTo` 条件。使用您在处理步骤中编制索引的属性文件以及相应的 JSONPath 均方误差值来获取此输出。`"mse"`

   ```
   from sagemaker.workflow.conditions import ConditionLessThanOrEqualTo
   from sagemaker.workflow.condition_step import ConditionStep
   from sagemaker.workflow.functions import JsonGet
   
   
   cond_lte = ConditionLessThanOrEqualTo(
       left=JsonGet(
           step_name=step_eval.name,
           property_file=evaluation_report,
           json_path="regression_metrics.mse.value"
       ),
       right=6.0
   )
   ```

1.  构造一个 `ConditionStep`。传入 `ConditionEquals` 条件，如果条件通过，则将模型包注册和批量转换步骤设置为后续步骤。

   ```
   step_cond = ConditionStep(
       name="AbaloneMSECond",
       conditions=[cond_lte],
       if_steps=[step_register, step_create_model, step_transform],
       else_steps=[], 
   )
   ```

#### 步骤 10：创建管道


现在，您已经创建了所有步骤，请将它们组合成一个管道。

**创建管道**

1.  为您的管道定义以下内容：`name`、`parameters` 和 `steps`。名称在 `(account, region)` 对中必须唯一。
**注意**  
一个步骤只能在管道的步骤列表或条件步骤的 if/else 步骤列表中出现一次。不能同时出现在两者中。

   ```
   from sagemaker.workflow.pipeline import Pipeline
   
   
   pipeline_name = f"AbalonePipeline"
   pipeline = Pipeline(
       name=pipeline_name,
       parameters=[
           processing_instance_count,
           model_approval_status,
           input_data,
           batch_data,
       ],
       steps=[step_process, step_train, step_eval, step_cond],
   )
   ```

1.  （可选）检查 JSON 管道定义以确保其格式正确。

   ```
   import json
   
   json.loads(pipeline.definition())
   ```

 此管道定义已准备好提交给 SageMaker AI。在下一个教程中，您将此管道提交给 SageMaker AI 并开始运行。

## 定义管道 (JSON)


您也可以使用 [boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.create_pipeline) 或 [Amazon CloudFormation](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-pipeline.html) 创建管道。创建管道需要管道定义，该定义是一个定义管道每个步骤的 JSON 对象。 SageMaker SDK 提供了一种构造管道定义的简单方法，您可以将其与 APIs 前面提到的任何定义一起使用来创建管道本身。在不使用 SDK 的情况下，用户必须编写原始 JSON 定义来创建管道，而无需进行 SageMaker Python SDK 提供的任何错误检查。要查看管道 JSON 定义的架构，请参阅 [ SageMaker AI 管道定义 JSON 架构](https://aws-sagemaker-mlops.github.io/sagemaker-model-building-pipeline-definition-JSON-schema/)。以下代码示例显示了 SageMaker AI 管道定义 JSON 对象的示例：

```
{'Version': '2020-12-01',
 'Metadata': {},
 'Parameters': [{'Name': 'ProcessingInstanceType',
   'Type': 'String',
   'DefaultValue': 'ml.m5.xlarge'},
  {'Name': 'ProcessingInstanceCount', 'Type': 'Integer', 'DefaultValue': 1},
  {'Name': 'TrainingInstanceType',
   'Type': 'String',
   'DefaultValue': 'ml.m5.xlarge'},
  {'Name': 'ModelApprovalStatus',
   'Type': 'String',
   'DefaultValue': 'PendingManualApproval'},
  {'Name': 'ProcessedData',
   'Type': 'String',
   'DefaultValue': 'S3_URL',
{'Name': 'InputDataUrl',
   'Type': 'String',
   'DefaultValue': 'S3_URL',
 'PipelineExperimentConfig': {'ExperimentName': {'Get': 'Execution.PipelineName'},
  'TrialName': {'Get': 'Execution.PipelineExecutionId'}},
 'Steps': [{'Name': 'ReadTrainDataFromFS',
   'Type': 'Processing',
   'Arguments': {'ProcessingResources': {'ClusterConfig': {'InstanceType': 'ml.m5.4xlarge',
      'InstanceCount': 2,
      'VolumeSizeInGB': 30}},
    'AppSpecification': {'ImageUri': 'IMAGE_URI',
     'ContainerArguments': [....]},
    'RoleArn': 'ROLE',
      'ProcessingInputs': [...],
    'ProcessingOutputConfig': {'Outputs': [.....]},
    'StoppingCondition': {'MaxRuntimeInSeconds': 86400}},
   'CacheConfig': {'Enabled': True, 'ExpireAfter': '30d'}},
   ...
   ...
   ...
  }
```

 **下一步：**[运行管道](run-pipeline.md)

# 编辑管道


要在运行管道之前对其进行更改，请执行以下操作：

1. 按照[启动 Amazon SageMaker Studio 中的说明打开 SageMaker Studio](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-updated-launch.html)。

1. 在 Studio 的左导航窗格中，选择 **Pipelines**。

1. 选择管道名称以查看有关管道的详细信息。

1. 选择**执行**选项卡。

1. 选择管道执行的名称。

1. 选择**编辑**打开管道设计器。

1. 根据需要更新步骤之间的边缘或步骤配置，然后点击**保存**。

   编辑后保存管道会自动生成新的版本号。

1. 选择**运行**。

# 运行管道


将管道步骤定义为有向无环图 (DAG) 后，就可以运行管道，执行 DAG 中定义的步骤。以下演练向您展示了如何使用亚马逊 SageMaker Studio 中的 drag-and-drop可视化编辑器或亚马逊 SageMaker Python SDK 运行亚马逊 A SageMaker I 管道。

## 运行管道（Pipeline Designer）


要开始执行新的管道，请执行以下操作：

------
#### [ Studio ]

1. 按照[启动 Amazon SageMaker Studio 中的说明打开 SageMaker Studio](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-updated-launch.html)。

1. 在左侧的导航窗格中，选择**管道**。

1. （可选）要按名称筛选管道列表，请在搜索字段中输入管道的全名或部分名称。

1. 选择管道名称以打开管道详细信息视图。

1. 选择右上角的**可视化编辑器**。

1. 要从最新版本启动执行，请选择**执行**。

1. 要从特定版本启动执行，请执行以下步骤：
   + 选择底部工具栏中的版本图标以打开版本面板。
   + 选择要执行的管道版本。
   + 将鼠标悬停在版本项上方以显示三点菜单，然后选择**执行**。
   + （可选）要查看管道的上一个版本，请从版本面板中的三点菜单中选择**预览**。您也可以在通知栏中选择**编辑**来编辑版本。

**注意**  
如果管道失败，状态横幅将显示 **Failed** 状态。对失败步骤进行问题排查后，在状态横幅上选择**重试**以从该步骤继续运行管道。

------
#### [ Studio Classic ]

1. 登录亚马逊 SageMaker Studio 经典版。有关更多信息，请参阅[启动 Amazon SageMaker Studio 经典版](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-launch.html)。

1. 在 Studio Classic 侧边栏中，选择**主页**图标 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 从菜单中选择**管道**。

1. 要按名称缩小管道列表的范围，请在搜索字段中输入管道的全名或部分名称。

1. 选择管道名称。

1. 从执行列表的**执行**或**图表**选项卡中，选择**创建执行**。

1. 输入或更新以下所需信息：
   + **Name** - 对于您在 Amazon 区域中的账户必须唯一。
   + **ProcessingInstanceCount**— 用于处理的实例数。
   + **ModelApprovalStatus**— 为了您的方便。
   + **InputDataUrl**— 输入数据的亚马逊 S3 URI。

1. 选择**启动**。

管道运行后，您可以在状态横幅上选择**查看详情**查看执行详情。

要停止运行，请在状态横幅上选择**停止**。要从停止处恢复执行，请在状态横幅上选择**恢复**。

**注意**  
如果管道失败，状态横幅将显示 **Failed** 状态。对失败步骤进行问题排查后，在状态横幅上选择**重试**以从该步骤继续运行管道。

------

## 运行管道 (SageMaker Python 开发工具包)


使用 SageMaker AI Python SDK 创建管道定义后，您可以将其提交给 SageMaker AI 以开始执行。以下教程展示了如何提交管道、开始执行、检查执行结果以及删除管道。

**Topics**
+ [

### 先决条件
](#run-pipeline-prereq)
+ [

### 步骤 1：启动管道
](#run-pipeline-submit)
+ [

### 步骤 2：检查管道执行
](#run-pipeline-examine)
+ [

### 步骤 3：覆盖管道执行的默认参数
](#run-pipeline-parametrized)
+ [

### 步骤 4：停止并删除管道执行
](#run-pipeline-delete)

### 先决条件


本教程要求以下项目：
+  SageMaker 笔记本实例。  
+  Pipelines 管道定义。本教程假设您使用的是完成[定义管道](define-pipeline.md)教程后创建的管道定义。

### 步骤 1：启动管道


首先，您需要启动管道。

**启动管道**

1. 检查 JSON 管道定义以确保其格式正确。

   ```
   import json
   
   json.loads(pipeline.definition())
   ```

1. 将管道定义提交给 Pipelines 服务，以便创建一个管道（如果它不存在）或更新现有的管道。传入的角色用于 Pipelines 创建步骤中定义的所有作业。

   ```
   pipeline.upsert(role_arn=role)
   ```

1. 启动管道执行。

   ```
   execution = pipeline.start()
   ```

### 步骤 2：检查管道执行


接下来，您需要检查管道执行。

**检查管道执行**

1.  描述管道执行状态，确保其已成功创建并启动。

   ```
   execution.describe()
   ```

1. 等待执行完成。

   ```
   execution.wait()
   ```

1. 列出执行步骤及其状态。

   ```
   execution.list_steps()
   ```

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

   ```
   [{'StepName': 'AbaloneTransform',
     'StartTime': datetime.datetime(2020, 11, 21, 2, 41, 27, 870000, tzinfo=tzlocal()),
     'EndTime': datetime.datetime(2020, 11, 21, 2, 45, 50, 492000, tzinfo=tzlocal()),
     'StepStatus': 'Succeeded',
     'CacheHitResult': {'SourcePipelineExecutionArn': ''},
     'Metadata': {'TransformJob': {'Arn': 'arn:aws:sagemaker:us-east-2:111122223333:transform-job/pipelines-cfvy1tjuxdq8-abalonetransform-ptyjoef3jy'}}},
    {'StepName': 'AbaloneRegisterModel',
     'StartTime': datetime.datetime(2020, 11, 21, 2, 41, 26, 929000, tzinfo=tzlocal()),
     'EndTime': datetime.datetime(2020, 11, 21, 2, 41, 28, 15000, tzinfo=tzlocal()),
     'StepStatus': 'Succeeded',
     'CacheHitResult': {'SourcePipelineExecutionArn': ''},
     'Metadata': {'RegisterModel': {'Arn': 'arn:aws:sagemaker:us-east-2:111122223333:model-package/abalonemodelpackagegroupname/1'}}},
    {'StepName': 'AbaloneCreateModel',
     'StartTime': datetime.datetime(2020, 11, 21, 2, 41, 26, 895000, tzinfo=tzlocal()),
     'EndTime': datetime.datetime(2020, 11, 21, 2, 41, 27, 708000, tzinfo=tzlocal()),
     'StepStatus': 'Succeeded',
     'CacheHitResult': {'SourcePipelineExecutionArn': ''},
     'Metadata': {'Model': {'Arn': 'arn:aws:sagemaker:us-east-2:111122223333:model/pipelines-cfvy1tjuxdq8-abalonecreatemodel-jl94rai0ra'}}},
    {'StepName': 'AbaloneMSECond',
     'StartTime': datetime.datetime(2020, 11, 21, 2, 41, 25, 558000, tzinfo=tzlocal()),
     'EndTime': datetime.datetime(2020, 11, 21, 2, 41, 26, 329000, tzinfo=tzlocal()),
     'StepStatus': 'Succeeded',
     'CacheHitResult': {'SourcePipelineExecutionArn': ''},
     'Metadata': {'Condition': {'Outcome': 'True'}}},
    {'StepName': 'AbaloneEval',
     'StartTime': datetime.datetime(2020, 11, 21, 2, 37, 34, 767000, tzinfo=tzlocal()),
     'EndTime': datetime.datetime(2020, 11, 21, 2, 41, 18, 80000, tzinfo=tzlocal()),
     'StepStatus': 'Succeeded',
     'CacheHitResult': {'SourcePipelineExecutionArn': ''},
     'Metadata': {'ProcessingJob': {'Arn': 'arn:aws:sagemaker:us-east-2:111122223333:processing-job/pipelines-cfvy1tjuxdq8-abaloneeval-zfraozhmny'}}},
    {'StepName': 'AbaloneTrain',
     'StartTime': datetime.datetime(2020, 11, 21, 2, 34, 55, 867000, tzinfo=tzlocal()),
     'EndTime': datetime.datetime(2020, 11, 21, 2, 37, 34, 34000, tzinfo=tzlocal()),
     'StepStatus': 'Succeeded',
     'CacheHitResult': {'SourcePipelineExecutionArn': ''},
     'Metadata': {'TrainingJob': {'Arn': 'arn:aws:sagemaker:us-east-2:111122223333:training-job/pipelines-cfvy1tjuxdq8-abalonetrain-tavd6f3wdf'}}},
    {'StepName': 'AbaloneProcess',
     'StartTime': datetime.datetime(2020, 11, 21, 2, 30, 27, 160000, tzinfo=tzlocal()),
     'EndTime': datetime.datetime(2020, 11, 21, 2, 34, 48, 390000, tzinfo=tzlocal()),
     'StepStatus': 'Succeeded',
     'CacheHitResult': {'SourcePipelineExecutionArn': ''},
     'Metadata': {'ProcessingJob': {'Arn': 'arn:aws:sagemaker:us-east-2:111122223333:processing-job/pipelines-cfvy1tjuxdq8-abaloneprocess-mgqyfdujcj'}}}]
   ```

1. 管道执行完成后，从 Amazon S3 下载生成的 `evaluation.json` 文件以检查报告。

   ```
   evaluation_json = sagemaker.s3.S3Downloader.read_file("{}/evaluation.json".format(
       step_eval.arguments["ProcessingOutputConfig"]["Outputs"][0]["S3Output"]["S3Uri"]
   ))
   json.loads(evaluation_json)
   ```

### 步骤 3：覆盖管道执行的默认参数


您可以通过指定不同的管道参数来覆盖默认值，从而运行管道的其他执行。

**覆盖默认参数**

1. 创建管道执行。这将启动另一个管道执行，并将模型批准状态覆盖设置为“已批准”。这意味着该`RegisterModel`步骤生成的模型包版本已自动准备好通过 CI/CD 管道（例如 Pro SageMaker jects）进行部署。有关更多信息，请参阅 [MLOps SageMaker 项目自动化](sagemaker-projects.md)。

   ```
   execution = pipeline.start(
       parameters=dict(
           ModelApprovalStatus="Approved",
       )
   )
   ```

1. 等待执行完成。

   ```
   execution.wait()
   ```

1. 列出执行步骤及其状态。

   ```
   execution.list_steps()
   ```

1. 管道执行完成后，从 Amazon S3 下载生成的 `evaluation.json` 文件以检查报告。

   ```
   evaluation_json = sagemaker.s3.S3Downloader.read_file("{}/evaluation.json".format(
       step_eval.arguments["ProcessingOutputConfig"]["Outputs"][0]["S3Output"]["S3Uri"]
   ))
   json.loads(evaluation_json)
   ```

### 步骤 4：停止并删除管道执行


完成管道后，您可以停止任何正在进行的执行并删除管道。

**停止并删除管道执行**

1. 停止管道执行。

   ```
   execution.stop()
   ```

1. 删除管道。

   ```
   pipeline.delete()
   ```

# 停止管道


您可以在 Amazon SageMaker Studio 控制台中停止管道运行。

要停止在 Amazon SageMaker Studio 控制台中执行管道，请根据您使用的是 Studio 还是 Studio Classic 完成以下步骤。

------
#### [ Studio ]

1. 在左侧导航窗格中，选择 **Pipelines**。

1. （可选）要按名称筛选管道列表，请在搜索字段中输入管道的全名或部分名称。

1. 选择管道名称。

1. 选择**执行**选项卡。

1. 选择要停止的执行。

1. 选择**停止**。要从停止的位置恢复执行，请选择**恢复**

------
#### [ Studio Classic ]

1. 登录亚马逊 SageMaker Studio 经典版。有关更多信息，请参阅[启动 Amazon SageMaker Studio 经典版](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-launch.html)。

1. 在 Studio Classic 侧边栏中，选择**主页**图标 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 从菜单中选择**管道**。

1. 要按名称缩小管道列表的范围，请在搜索字段中输入管道的全名或部分名称。

1. 要停止管道运行，请在管道的状态横幅上选择**查看详情**，然后选择**停止**。要从停止的位置恢复执行，请选择**恢复**。

------

# 查看管道详情


您可以查看 SageMaker AI 管道的详细信息以了解其参数、其步骤的依赖关系，或者监控其进度和状态。这可以帮助您排除故障或优化工作流程。您可以使用 Amazon SageMaker Studio 控制台访问给定管道的详细信息，并浏览其执行历史记录、定义、参数和元数据。

或者，如果您的管道与 A SageMaker I 项目关联，则可以从该项目的详细信息页面访问管道详细信息。有关更多信息，请参阅 [查看项目资源](sagemaker-projects-resources.md)。

要查看 SageMaker AI 管道的详细信息，请根据您使用的是 Studio 还是 Studio Classic 完成以下步骤。

**注意**  
当管道需要在要上传到 Amazon S3 并用于将模型部署到 Amazon S3 并用于将模型部署到 A SageMaker I 终端节点的压缩模型文件 (model.tar.gz) 中包含自定义脚本时，就会发生模型重新打包。当 SageMaker AI pipeline 训练模型并将其注册到模型注册表时，*如果*训练作业的训练模型输出需要包含自定义推理脚本，则会引入重新打包步骤。重新打包步骤解压缩该模型，添加一个新脚本，然后重新压缩该模型。运行管道会将重新打包步骤添加为训练作业。

------
#### [ Studio ]

1. 按照[启动 Amazon SageMaker Studio 中的说明打开 SageMaker Studio](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-updated-launch.html) 控制台。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. （可选）要按名称筛选管道列表，请在搜索字段中输入管道的全名或部分名称。

1. 选择管道名称以查看有关管道的详细信息。

1. 选择以下选项卡之一查看管道详细信息：
   + **执行** - 有关执行的详细信息。
   + **图表**：管道图，包括所有步骤。
   + **参数**：与管道相关的运行参数和指标。
   + **信息**：与管道相关的元数据，如标签、管道 Amazon 资源名称 (ARN) 和角色 ARN。您还可以在此页面编辑管道描述。

------
#### [ Studio Classic ]

1. 登录亚马逊 SageMaker Studio 经典版。有关更多信息，请参阅[启动 Amazon SageMaker Studio 经典版](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-launch.html)。

1. 在 Studio Classic 侧边栏中，选择**主页**图标 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 从菜单中选择**管道**。

1. 要按名称缩小管道列表的范围，请在搜索字段中输入管道的全名或部分名称。

1. 选择管道名称以查看有关管道的详细信息。管道详细信息选项卡将打开，并显示管道执行列表。您可以启动执行，也可以选择其他一个选项卡来了解管道的更多信息。使用 **Property Inspector** 图标 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/studio/icons/gears.png)) 选择要显示的列。

1. 在管道详细信息页面上，选择以下选项卡之一以查看有关管道的详细信息：
   + **执行** - 有关执行的详细信息。您可以通过此选项卡或**图表**选项卡创建执行。
   + **图表** - 管道的 DAG。
   + **参数** - 包括模型批准状态。
   + **设置** - 与管道关联的元数据。您可以从此选项卡下载管道定义文件并编辑管道名称和描述。

------

# 查看管道运行的详细信息


您可以查看特定 SageMaker AI 管道运行的详细信息。这可以帮助您：
+ 找出并解决运行过程中可能出现的问题，如步骤失败或意外错误。
+ 比较不同管道执行的结果，了解输入数据或参数的变化对整个工作流程的影响。
+ 找出瓶颈和优化机会。

要查看管道运行的详细信息，请根据您使用的是 Studio 还是 Studio Classic 完成以下步骤。

------
#### [ Studio ]

1. 按照[启动 Amazon SageMaker Studio 中的说明打开 SageMaker Studio](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-updated-launch.html) 控制台。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. （可选）要按名称筛选管道列表，请在搜索字段中输入管道的全名或部分名称。

1. 选择管道名称以查看有关管道的详细信息。

1. 选择**执行**选项卡。

1. 选择要查看的管道执行名称。会出现该执行的管道图。

1. 选择图表中的任何管道步骤，即可在右侧边栏看到步骤设置。

1. 选择以下选项卡之一，查看更多管道详情：
   + **定义**：管道图，包括所有步骤。
   + **参数** - 包括模型批准状态。
   + **详情**：与管道相关的元数据，如标签、管道 Amazon 资源名称（ARN）和角色 ARN。您还可以在此页面编辑管道描述。

------
#### [ Studio Classic ]

1. 登录亚马逊 SageMaker Studio 经典版。有关更多信息，请参阅[启动 Amazon SageMaker Studio 经典版](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-launch.html)。

1. 在 Studio Classic 侧边栏中，选择**主页**图标 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 从菜单中选择**管道**。

1. 要按名称缩小管道列表的范围，请在搜索字段中输入管道的全名或部分名称。

1. 选择管道名称。管道的**执行**页面打开。

1. 在**执行**页面中，选择一个执行名称，查看有关执行的详细信息。执行详细信息选项卡将打开，并显示管道中步骤的图表。

1. 要按名称搜索步骤，请在搜索字段中输入与步骤名称匹配的字符。使用图表右下方的大小调整图标可以放大和缩小图表、将图表调整到适合屏幕，以及将图表扩展到全屏。要聚焦于图表的特定部分，可以选择图表的空白区域，然后拖动图表使其居中。  
![\[\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/yosemite/execution-graph-w-input.png)

1. 在图表中选择一个管道步骤，查看该步骤的详细信息。在上面的屏幕截图中，选择了一个训练步骤并显示了以下选项卡：
   + **输入** - 训练输入。如果输入源来自 Amazon Simple Storage Service (Amazon S3)，请选择该链接以在 Amazon S3 控制台中查看该文件。
   + **输出** - 训练输出，例如指标、图表、文件和评估结果。这些图表是使用[追踪](https://sagemaker-experiments.readthedocs.io/en/latest/tracker.html#smexperiments.tracker.Tracker.log_precision_recall)器生成的 APIs。
   + **日志**-步骤生成的 Amazon CloudWatch 日志。
   + **信息** - 与该步骤关联的参数和元数据。  
![\[\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/yosemite/execution-graph-info.png)

------

# 下载管道定义文件


您可以直接从 Amazon SageMaker Studio 用户界面下载 SageMaker 人工智能管道的定义文件。您可以将此管道定义文件用于以下用途：
+ 备份和恢复：使用下载的文件创建管道配置备份，以便在基础设施发生故障或意外更改时进行恢复。
+ 版本控制：将管道定义文件存储在源代码控制系统中，以跟踪管道的更改，并在需要时恢复到以前的版本。
+ 编程交互：使用管道定义文件作为 SageMaker SDK 的输入或 Amazon CLI。
+ 与自动化流程集成：将管道定义集成到您的 CI/CD 工作流程或其他自动化流程中。

要下载管道的定义文件，请根据您使用的是 Studio 还是 Studio Classic 完成以下步骤。

------
#### [ Studio ]

1. 按照[启动 Amazon SageMaker Studio 中的说明打开 SageMaker Studio](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-updated-launch.html) 控制台。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. （可选）要按名称筛选管道列表，请在搜索字段中输入管道的全名或部分名称。

1. 选择管道名称。打开**执行**页面并显示管道执行列表。

1. 停留在**执行**页面，或选择管道执行表左侧的**图表**、**信息**或**参数**页面。您可以从这些网页中下载管道定义。

1. 在页面右上方，选择垂直省略号，然后选择**下载管道定义 (JSON)**。

------
#### [ Studio Classic ]

1. 登录亚马逊 SageMaker Studio 经典版。有关更多信息，请参阅[启动 Amazon SageMaker Studio 经典版](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-launch.html)。

1. 在 Studio Classic 侧边栏中，选择**主页**图标 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 从菜单中选择**管道**。

1. 要按名称缩小管道列表的范围，请在搜索字段中输入管道的全名或部分名称。

1. 选择管道名称。

1. 选择**设置**选项卡。

1. 选择**下载管道定义文件**。

------

# 从管道访问实验数据
从管道访问实验数据

**注意**  
SageMaker 实验功能仅在 Studio Classic 中提供。

当你创建管道并指定 [pipeline\$1experiment\$1config](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.pipeline.Pipeline.pipeline_experiment_config) 时，Pipelines 会默认创建以下 SageMaker 实验实体（如果它们不存在）：
+ 管道的实验
+ 每次执行管道时的运行组
+ 在管道步骤中创建的每个 SageMaker AI 作业的运行次数

有关实验如何与管道集成的信息，请参阅 [亚马逊 SageMaker 实验集成](pipelines-experiments.md)。有关 SageMaker 实验的更多信息，请参阅[Studio 经典版中的亚马逊 SageMaker 实验](experiments.md)。

您可以从管道执行列表或实验列表中查看与管道相关的运行列表。

**从管道执行列表中查看运行列表**

1. 要查看管道执行列表，请按照 [查看管道详情](pipelines-studio-list.md) 的 *Studio Classic* 选项卡中的前五个步骤操作。

1. 在屏幕右上方，选择**筛选器**图标 (![\[Funnel or filter icon representing data filtering or narrowing down options.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/jumpstart/jumpstart-filter-icon.png))。

1. 选择**实验**。如果创建管道时未停用实验集成，则实验名称将显示在执行列表中。
**注意**  
Amaz [on Python SageMaker ](https://sagemaker.readthedocs.io/en/stable) SDK 的 v2.41.0 中引入了实验集成。使用早期版本 SDK 创建的管道默认情况下不与实验集成。

1. 选择您选择的实验，查看与该实验相关的运行组和运行。

**从实验列表中查看运行列表**

1. 在 Studio Classic 的左侧边栏，选择**主页**图标 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 从菜单中选择**实验**。

1. 使用搜索栏或**筛选器**图标 (![\[Funnel or filter icon representing data filtering or narrowing down options.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/jumpstart/jumpstart-filter-icon.png)) 将列表筛选为管道创建的实验。

1. 打开实验名称并查看管道创建的运行列表。

# 跟踪管道的发展历程
跟踪管道的发展历程

在本教程中，您将使用 Amazon SageMaker Studio 来跟踪亚马逊 A SageMaker I 机器学习管道的血统。

该管道由 Amazon [ SageMaker 示例 GitHub ](https://github.com/awslabs/amazon-sagemaker-examples)存储库中的 “使用[亚马逊 SageMaker 模型构建管道编排任务](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-pipelines/tabular/abalone_build_train_deploy/sagemaker-pipelines-preprocess-train-evaluate-batch-transform.html)” 笔记本创建。有关如何创建管道的详细信息，请参阅[定义管道](define-pipeline.md)。

Studio 中的世系跟踪以有向无环图 (DAG) 为中心。DAG 表示管道中的步骤。在 DAG 中，您可以跟踪从任何步骤到任何其他步骤的世系。下图显示了管道中的步骤。这些步骤在 Studio 中显示为 DAG。

![\[\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/yosemite/pipeline-tutorial-steps.png)


要在 Amazon SageMaker Studio 控制台中跟踪管道的血统，请根据您使用的是 Studio 还是 Studio Classic 完成以下步骤。

------
#### [ Studio ]

**跟踪管道的世系**

1. 按照[启动 Amazon SageMaker Studio 中的说明打开 SageMaker Studio](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-updated-launch.html) 控制台。

1. 在左侧导航窗格中，选择 **Pipelines**。

1. （可选）要按名称筛选管道列表，请在搜索字段中输入管道的全名或部分名称。

1. 在**名称**列中，选择管道名称以查看管道的详细信息。

1. 选择**执行**选项卡。

1. 在**执行**表的**名称**列中，选择要查看的管道执行名称。

1. 在**执行**页面右上方，选择垂直省略号，然后选择**下载管道定义 (JSON)**。您可以查看该文件以了解管道图表的定义方式。

1. 选择**编辑**打开管道设计器。

1. 使用画布右上角的大小调整和缩放控件可以放大或缩小图表，将图表调整到适合屏幕，或将图表扩展到全屏。

1. 要查看训练、验证和测试数据集，请完成以下步骤：

   1. 选择管道图中的处理步骤。

   1. 在右侧边栏选择**概览**选项卡。

   1. 在**文件**部分，找到训练、验证和测试数据集的 Amazon S3 路径。

1. 要查看模型构件，请完成以下步骤：

   1. 选择管道图中的 Training 步骤。

   1. 在右侧边栏选择**概览**选项卡。

   1. 在**文件**部分，找到模型构件的 Amazon S3 路径。

1. 要查找模型软件包 ARN，请完成以下步骤：

   1. 选择注册模型步骤。

   1. 在右侧边栏选择**概览**选项卡。

   1. 在**文件**部分，找到模型软件包的 ARN。

------
#### [ Studio Classic ]

**跟踪管道的世系**

1. 登录亚马逊 SageMaker Studio 经典版。有关更多信息，请参阅[启动 Amazon SageMaker Studio 经典版](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-launch.html)。

1. 在 Studio 的左侧边栏中，选择**主页**图标 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 在菜单中，选择**管道**。

1. 使用**搜索**框来筛选管道列表。

1. 选择 `AbalonePipeline` 管道，查看执行列表和管道的其他详细信息。

1. 选择右侧边栏中的 **Property Inspector** 图标 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/studio/icons/gears.png))，打开**表属性**窗格，在这里可以选择要查看的属性。

1. 选择**设置**选项卡，然后选择**下载管道定义文件**。您可以查看该文件以了解管道图表的定义方式。

1. 在**执行**标签中，选择执行列表中的第一行，查看其执行图和有关执行的其他详细信息。请注意，该图表与教程开头显示的图表相匹配。

   使用图表右下方的大小调整图标可以放大或缩小图表，将图表调整到适合屏幕，或将图表扩展到全屏。要聚焦于图表的特定部分，可以选择图表的空白区域，然后拖动图表使其居中。图表右下角的嵌入图显示您在图表中的位置。  
![\[\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/yosemite/pipeline-tutorial-execution-graph.png)

1. 在**图表**选项卡上，选择 `AbaloneProcess` 步骤以查看有关该步骤的详细信息。

1. 在**输出**选项卡的**文件**下方找到训练、验证和测试数据集的 Amazon S3 路径。
**注意**  
要获取完整路径，请右键单击路径，然后选择**复制单元格内容**。

   ```
   s3://sagemaker-eu-west-1-acct-id/sklearn-abalone-process-2020-12-05-17-28-28-509/output/train
   s3://sagemaker-eu-west-1-acct-id/sklearn-abalone-process-2020-12-05-17-28-28-509/output/validation
   s3://sagemaker-eu-west-1-acct-id/sklearn-abalone-process-2020-12-05-17-28-28-509/output/test
   ```

1. 选择 `AbaloneTrain` 步骤。

1. 在**输出**选项卡的**文件**下方找到模型构件的 Amazon S3 路径：

   ```
   s3://sagemaker-eu-west-1-acct-id/AbaloneTrain/pipelines-6locnsqz4bfu-AbaloneTrain-NtfEpI0Ahu/output/model.tar.gz
   ```

1. 选择 `AbaloneRegisterModel` 步骤。

1. 在**输出**选项卡的**文件**下方找到模型包的 ARN：

   ```
   arn:aws:sagemaker:eu-west-1:acct-id:model-package/abalonemodelpackagegroupname/2
   ```

------

# Kubernetes 编排


您可以使用适用于 Kubernetes 的 SageMaker AI 运算符和适用于 Kubeflow Pipelines 的 AI 组件 SageMaker 来编排 SageMaker 训练和推理作业。 SageMaker Kubernetes 的人工智能运算符使使用 Kubernetes 的开发人员和数据科学家可以更轻松地在 AI 中训练、调整和部署机器学习 (ML) 模型。 SageMaker SageMaker Kubeflow Pipelines 的 AI 组件允许您将数据处理和训练任务从 Kubernetes 集群转移到 SageMaker AI 经过机器学习优化的托管服务。

**Topics**
+ [

# SageMaker 适用于 Kubernetes 的人工智能运算符
](kubernetes-sagemaker-operators.md)
+ [

# SageMaker Kubeflow 管道的人工智能组件
](kubernetes-sagemaker-components-for-kubeflow-pipelines.md)

# SageMaker 适用于 Kubernetes 的人工智能运算符


SageMaker Kubernetes 的人工智能运算符使使用 Kubernetes 的开发人员和数据科学家可以更轻松地在 AI 中训练、调整和部署机器学习 (ML) 模型。 SageMaker 你可以在 Amazon El SageMaker astic Kubernetes Service（Amazon EKS）的 Kubernetes 集群上安装这些 AI 运算符，以便使用 Kubernetes API 和命令行 Kubernetes 工具（例如 SageMaker ）在本地创建人工智能任务。`kubectl`本指南介绍如何设置和使用运算符从 Kubernetes 集群在 SageMaker AI 上运行模型训练、超参数调整或推理（实时和批量）。本章中的过程和指南假设您熟悉 Kubernetes 及其基本命令。

**重要**  
我们将停止对 [Kubernetes SageMaker 操作](https://github.com/aws/amazon-sagemaker-operator-for-k8s/tree/master)员的原始版本的开发和技术支持。  
如果您当前使用的是 [Kubernetes SageMaker 操作员版本`v1.2.2`或更](https://github.com/aws/amazon-sagemaker-operator-for-k8s/tree/master)低版本，我们建议您将资源迁移到适用于 Amazon 的 [ACK 服务控制](https://github.com/aws-controllers-k8s/sagemaker-controller)器。 SageMakerACK 服务控制器是基于 Kubernetes 控制[Amazon 器 (ACK) 的新一代 Kuber](https://aws-controllers-k8s.github.io/community/) netes SageMaker 操作员。  
有关迁移步骤的信息，请参阅[将资源迁移到最新 Operator](kubernetes-sagemaker-operators-migrate.md)。  
有关终止对 Kubernetes SageMaker 操作员原始版本支持的常见问题解答，请参阅 [宣布终止对 Kubernetes SageMaker 人工智能运算符原始版本的支持](kubernetes-sagemaker-operators-eos-announcement.md)

**注意**  
使用这些 Operator 无需额外付费。您通过这些运营商使用的任何 SageMaker AI 资源都会产生费用。

## 什么是 Operator？


Kubernetes Operator 是代表 Kubernetes 用户管理应用程序的应用程序控制器。控制面板的控制器包括各种控制回路，它们侦听中央状态管理器 (ETCD)，以调节其所控制的应用程序的状态。此类应用程序的示例包括 [C loud-controller-manager](https://kubernetes.io/docs/concepts/architecture/cloud-controller/) 和`[kube-controller-manager](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/)`。Operator 通常提供比原始 Kubernetes API 更高级别的抽象，使用户能够更轻松地部署和管理应用程序。要向 Kubernetes 添加新功能，开发人员可以通过创建**自定义资源**（包含其特定于应用程序或特定于域的逻辑和组件）来扩展 Kubernetes API。Kubernetes 中的 Operator 允许用户以原生方式调用这些自定义资源并自动执行关联的工作流。

### 适用于 Kubernetes 的 Amazon 控制器 (ACK) 是如何工作的？


Kubernetes SageMaker 的人工智能运算符允许你在 Kubernetes 集群中管理 SageMaker 人工智能中的作业。最新版本的 Kubernetes SageMaker 人工智能运算符基于适用于 Kubernetes 的 Amazon 控制器 (ACK)。ACK 包括一个通用控制器运行时、一个代码生成器和一组 Amazon 特定于服务的控制器，其中一个是 SageMaker AI 控制器。

下图说明了 ACK 的工作原理。

![\[基于 ACK 的 Kubernetes SageMaker 人工智能运算符解释道。\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/k8s-orchestration/sagemaker-operators-for-kubernetes-ack-controller.png)


在这张图中，一个 Kubernetes 用户想要使用 Kubernetes AP SageMaker I 在 Kubernetes 集群内对 AI 运行模型训练。用户向发出调用`kubectl apply`，传入一个描述描述训练作业的 Kubernetes 自定义资源的文件。 SageMaker `kubectl apply`将这个名为清单的文件传递给在 Kubernetes 控制器节点中运行的 Kubernetes API 服务器（工作流程图中的步骤 *1*）。*Kubernetes API 服务器接收包含 SageMaker 训练作业规范的清单，并确定用户是否有权创建此类自定义资源`sageMaker.services.k8s.aws/TrainingJob`，以及自定义资源的格式是否正确（步骤 2）。*如果该用户已获授权且自定义资源有效，则 Kubernetes API 服务器会将自定义资源写入（步骤 *3*）其 etcd 数据存储，然后回复该用户（步骤 *4*），告知已创建自定义资源。在普通 Kubernetes Pod 环境下的 Kubernetes 工作节点上运行的 SageMaker AI 控制器会收到通知（步骤 *5*），告知已经创建了一个新的自定义资源。`sageMaker.services.k8s.aws/TrainingJob`然后， SageMaker AI 控制器与 SageMaker API 通信（步骤 *6*），调用 SageMaker AI `CreateTrainingJob` API 在中 Amazon创建训练作业。与 SageMaker API 通信后， SageMaker AI 控制器调用 Kubernetes API 服务器，使用从 AI 收到的信息更新自定义资源的状态（步骤 *7*）。 SageMaker 因此， SageMaker AI 控制器向开发人员提供的信息与他们使用 Amazon SDK 所获得的信息相同。

### 权限概述


操作员代表您访问 SageMaker 人工智能资源。操作员扮演的与 Amazon 资源交互的 IAM 角色与您用于访问 Kubernetes 集群的证书不同。该角色也不同于运行机器学习作业时所 Amazon 扮演的角色。

下图说明了各种身份验证层。

![\[SageMaker 适用于 Kubernetes 的人工智能操作员各种身份验证层。\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/k8s-orchestration/sagemaker-operators-for-kubernetes-authentication.png)


# 适用于 Kubernetes 的最新 SageMaker 人工智能运算符


本节基于使用适用于 Kubernetes 的 Amazon 控制器 (ACK) 的 Kubernetes SageMaker 人工智能运算符的最新版本。

**重要**  
如果您当前使用的是 [Kubernetes SageMaker 操作员版本`v1.2.2`或更](https://github.com/aws/amazon-sagemaker-operator-for-k8s/tree/master)低版本，我们建议您将资源迁移到适用于 Amazon 的 [ACK 服务控制](https://github.com/aws-controllers-k8s/sagemaker-controller)器。 SageMakerACK 服务控制器是基于 Kubernetes 控制[Amazon 器 (ACK) 的新一代 Kuber](https://aws-controllers-k8s.github.io/community/) netes SageMaker 操作员。  
有关迁移步骤的信息，请参阅[将资源迁移到最新 Operator](kubernetes-sagemaker-operators-migrate.md)。  
有关终止对 Kubernetes SageMaker 操作员原始版本支持的常见问题解答，请参阅 [宣布终止对 Kubernetes SageMaker 人工智能运算符原始版本的支持](kubernetes-sagemaker-operators-eos-announcement.md)

最新版本的 Kubernetes [SageMaker 人工智能运算符基于 Kubernetes Amazon](https://github.com/aws-controllers-k8s/sagemaker-controller) [控制器 (ACK)，这是一个用于构建 Kubernetes](https://aws-controllers-k8s.github.io/community/ ) 自定义控制器的框架，其中每个控制器都与服务 API 通信。 Amazon 这些控制器允许 Kubernetes 用户使用 Kubernetes API 预置数据库或消息队列等 Amazon 资源。

使用以下步骤安装和使用 ACK 来训练、调整和部署带有 Amazon A SageMaker I 的机器学习模型。

**Topics**
+ [

## 为 Kubernetes 安装 SageMaker 人工智能运算符
](#kubernetes-sagemaker-operators-ack-install)
+ [

## 为 Kubernetes 使用 SageMaker 人工智能运算符
](#kubernetes-sagemaker-operators-ack-use)
+ [

## 参考
](#kubernetes-sagemaker-operators-ack-reference)

## 为 Kubernetes 安装 SageMaker 人工智能运算符


要设置适用于 Kubernetes 的 SageMaker AI Operators 的最新可用版本，请参阅使用 [ACK SageMaker 人工智能控制器进行机器学习](https://aws-controllers-k8s.github.io/community/docs/tutorials/sagemaker-example/#setup)中的 “*设置*” 部分。

## 为 Kubernetes 使用 SageMaker 人工智能运算符


有关如何使用 Amazon EKS 使用适用于 Amazon A SageMaker I 的 ACK 服务控制器训练[机器学习模型的教程，请参阅使用 ACK SageMaker AI 控制器进行机器学习](https://aws-controllers-k8s.github.io/community/docs/tutorials/sagemaker-example/)。

有关自动缩放的示例，请参阅使用 App [lication Auto Scaling 扩展 SageMaker AI 工作负载](https://aws-controllers-k8s.github.io/community/docs/tutorials/autoscaling-example/)

## 参考


另请参阅 [Amazon A SageMaker I GitHub 存储库的 ACK 服务控制器](https://github.com/aws-controllers-k8s/sagemaker-controller)或阅读 [Kubernetes Amazon 控制器](https://aws-controllers-k8s.github.io/community/docs/community/overview/)文档。

# 适用于 Kubernetes 的老式 SageMaker AI 运算符


本节基于适用于 [Kubernetes SageMaker 的人工智能运算符的原](https://github.com/aws/amazon-sagemaker-operator-for-k8s)始版本。

**重要**  
我们将停止对 [Kubernetes SageMaker 操作](https://github.com/aws/amazon-sagemaker-operator-for-k8s/tree/master)员的原始版本的开发和技术支持。  
如果您当前使用的是 [Kubernetes SageMaker 操作员版本`v1.2.2`或更](https://github.com/aws/amazon-sagemaker-operator-for-k8s/tree/master)低版本，我们建议您将资源迁移到适用于 Amazon 的 [ACK 服务控制](https://github.com/aws-controllers-k8s/sagemaker-controller)器。 SageMakerACK 服务控制器是基于 Kubernetes 控制[Amazon 器 (ACK) 的新一代 Kuber](https://aws-controllers-k8s.github.io/community/) netes SageMaker 操作员。  
有关迁移步骤的信息，请参阅[将资源迁移到最新 Operator](kubernetes-sagemaker-operators-migrate.md)。  
有关终止对 Kubernetes SageMaker 操作员原始版本支持的常见问题解答，请参阅 [宣布终止对 Kubernetes SageMaker 人工智能运算符原始版本的支持](kubernetes-sagemaker-operators-eos-announcement.md)

**Topics**
+ [

## 为 Kubernetes 安装 SageMaker 人工智能运算符
](#kubernetes-sagemaker-operators-eos-install)
+ [

# 使用 Amazon A SageMaker I Jobs
](kubernetes-sagemaker-jobs.md)
+ [

# 将资源迁移到最新 Operator
](kubernetes-sagemaker-operators-migrate.md)
+ [

# 宣布终止对 Kubernetes SageMaker 人工智能运算符原始版本的支持
](kubernetes-sagemaker-operators-eos-announcement.md)

## 为 Kubernetes 安装 SageMaker 人工智能运算符


使用以下步骤安装和使用适用于 Kubernetes 的 SageMaker AI 运算符，通过 Amazon AI 训练、调整和部署机器学习模型。 SageMaker 

**Topics**
+ [

### 基于 IAM 角色的设置和 Operator 部署
](#iam-role-based-setup-and-operator-deployment)
+ [

### 清理 资源
](#cleanup-operator-resources)
+ [

### 删除 Operator
](#delete-operators)
+ [

### 问题排查
](#troubleshooting)
+ [

### 每个区域 SMlogs 的图片和图片
](#images-and-smlogs-in-each-region)

### 基于 IAM 角色的设置和 Operator 部署


以下几节描述了设置和部署 Operator 原始版本的步骤。

**警告**  
**提醒：**以下步骤不会安装最新版本的 Kubernet SageMaker es 人工智能操作员。要安装基于 ACK 的全新 Kubernet SageMaker es 人工智能运算符，请参阅。[适用于 Kubernetes 的最新 SageMaker 人工智能运算符](kubernetes-sagemaker-operators-ack.md)

#### 先决条件


本教程假设您已完成以下先决条件：
+ 在用于访问 Kubernetes 集群的客户端计算机上安装以下工具：
  + [https://docs.amazonaws.cn/eks/latest/userguide/install-kubectl.html](https://docs.amazonaws.cn/eks/latest/userguide/install-kubectl.html) 版本 1.13 或更高版本。使用您的 Amazon EKS 集群控制面板的一个次要版本内的 `kubectl` 版本。例如，1.13 `kubectl` 客户端使用 Kubernetes 1.13 和 1.14 集群。1.13 之前的版本不支持 OpenID Connect (OIDC)。
  + [https://github.com/weaveworks/eksctl](https://github.com/weaveworks/eksctl) 版本 0.7.0 或更高版本 
  + [Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/install-cliv1.html) 版本 1.16.232 或更高版本 
  + （可选）[Helm](https://helm.sh/docs/intro/install/) 版本 3.0 或更高版本 
  + [aws-iam-authenticator](https://docs.amazonaws.cn/eks/latest/userguide/install-aws-iam-authenticator.html) 
+ 拥有创建角色并将策略附加角色的 IAM 权限。
+ 创建了一个用于运行 Operator 的 Kubernetes 集群。它应该是 Kubernetes 版本 1.13 或 1.14。有关使用 `eksctl` 自动创建集群的信息，请参阅 [eksctl 入门](https://docs.amazonaws.cn/eks/latest/userguide/getting-started-eksctl.html)。预置集群需要 20–30 分钟时间。

#### 集群范围部署


请将 OpenID Connect (OIDC) 身份提供商 (IdP) 与您的角色关联，以便通过 IAM 服务进行身份验证，然后才能使用 IAM 角色部署 Operator。

##### 为集群创建 OIDC 提供商


以下说明介绍如何创建 OIDC 提供商并将其与您的 Amazon EKS 集群关联。

1. 按如下方式设置本地 `CLUSTER_NAME` 和 `AWS_REGION` 环境变量：

   ```
   # Set the Region and cluster
   export CLUSTER_NAME="<your cluster name>"
   export Amazon_REGION="<your region>"
   ```

1. 使用以下命令将 OIDC 提供商与您的集群关联。有关更多信息，请参阅[为集群上的服务账户启用 IAM 角色](https://docs.amazonaws.cn/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)。

   ```
   eksctl utils associate-iam-oidc-provider --cluster ${CLUSTER_NAME} \
         --region ${AWS_REGION} --approve
   ```

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

   ```
   [_]  eksctl version 0.10.1
     [_]  using region us-east-1
     [_]  IAM OpenID Connect provider is associated with cluster "my-cluster" in "us-east-1"
   ```

现在，集群已拥有 OIDC 身份提供商，您可以创建一个角色并授予 Kubernetes 代入该角色的 ServiceAccount 权限。

##### 获取 OIDC ID


要设置 ServiceAccount，请使用以下命令获取 OIDC 颁发者 URL：

```
aws eks describe-cluster --name ${CLUSTER_NAME} --region ${AWS_REGION} \
      --query cluster.identity.oidc.issuer --output text
```

该命令会返回类似以下内容的 URL：

```
https://oidc.eks.${AWS_REGION}.amazonaws.com/id/D48675832CA65BD10A532F597OIDCID
```

在此 URL 中，值 `D48675832CA65BD10A532F597OIDCID` 是 OIDC ID。您集群的 OIDC ID 不同。您需要使用此 OIDC ID 值来创建角色。

 如果输出为 `None`，则表示您的客户端版本过旧。要解决此问题，请运行以下命令：

```
aws eks describe-cluster --region ${AWS_REGION} --query cluster --name ${CLUSTER_NAME} --output text | grep OIDC
```

返回的 OIDC URL 如下所示：

```
OIDC https://oidc.eks.us-east-1.amazonaws.com/id/D48675832CA65BD10A532F597OIDCID
```

##### 创建一个 IAM 角色


1. 

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
         {
           "Effect": "Allow",
           "Principal": {
             "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
             "StringEquals": {
               "oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:aud": "sts.amazonaws.com",
               "oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:sub": "system:serviceaccount:sagemaker-k8s-operator-system:sagemaker-k8s-operator-default"
             }
           }
         }
       ]
     }
   ```

------

   创建一个名为 `trust.json` 的文件，并在其中插入以下信任关系代码块。请务必将所有 `<OIDC ID>`、`<Amazon account number>` 和 `<EKS Cluster region>` 占位符替换为与您的集群对应的值。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
         {
           "Effect": "Allow",
           "Principal": {
             "Federated": "arn:aws-cn:iam::111122223333:oidc-provider/oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
             "StringEquals": {
               "oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:aud": "sts.amazonaws.com",
               "oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:sub": "system:serviceaccount:sagemaker-k8s-operator-system:sagemaker-k8s-operator-default"
             }
           }
         }
       ]
     }
   ```

------

1. 运行以下命令，以创建一个具有 `trust.json` 中定义的信任关系的角色。此角色允许 Amazon EKS 集群从 IAM 获取和刷新凭证。

   ```
   aws iam create-role --region ${AWS_REGION} --role-name <role name> --assume-role-policy-document file://trust.json --output=text
   ```

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

   ```
   ROLE    arn:aws:iam::123456789012:role/my-role 2019-11-22T21:46:10Z    /       ABCDEFSFODNN7EXAMPLE   my-role
   ASSUMEROLEPOLICYDOCUMENT        2012-10-17		 	 	 
   STATEMENT       sts:AssumeRoleWithWebIdentity   Allow
   STRINGEQUALS    sts.amazonaws.com       system:serviceaccount:sagemaker-k8s-operator-system:sagemaker-k8s-operator-default
   PRINCIPAL       arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/
   ```

    请记下 `ROLE ARN`；您将此值传递给您的 Operator。

##### 将 AmazonSageMakerFullAccess 策略附加到角色


要授予角色访问 SageMaker AI 的权限，请附加[AmazonSageMakerFullAccess](https://console.amazonaws.cn/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonSageMakerFullAccess)策略。如果您想限制 Operator 的权限，可以创建自己的自定义策略并附加该策略。

附加以下策略：

```
aws iam attach-role-policy --region ${AWS_REGION} --role-name <role name> --policy-arn arn:aws-cn:iam::aws:policy/AmazonSageMakerFullAccess
```

Kubernetes ServiceAccount `sagemaker-k8s-operator-default` 应该拥有权限。`AmazonSageMakerFullAccess`安装 Operator 时请确认这一点。

##### 部署 Operator


部署 Operator 时，您可以使用 YAML 文件或 Helm 图表。

##### 使用 YAML 部署 Operator


这是部署 Operator 的最简单方法。流程如下：

1. 下载以下安装程序脚本。每当引用 `installer.yaml` 时，都用 `installer_china.yaml` 代替。

   ```
   wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/release/rolebased/china/installer_china.yaml
   ```

1. 编辑 `installer.yaml` 文件以替换 `eks.amazonaws.com/role-arn`。将此处的 ARN 替换为您创建的基于 OIDC 的角色的 Amazon 资源名称 (ARN)。

1. 使用以下命令部署集群：

   ```
   kubectl apply -f installer.yaml
   ```

##### 使用 Helm 图表部署 Operator


使用提供的 Helm 图表安装 Operator。

1. 使用以下命令克隆 Helm 安装程序目录：

   ```
   git clone https://github.com/aws/amazon-sagemaker-operator-for-k8s.git
   ```

1. 导航到 `amazon-sagemaker-operator-for-k8s/hack/charts/installer`文件夹。编辑 `rolebased/values.yaml` 文件，其中包含图表的高级参数。将此处的角色 ARN 替换为您创建的基于 OIDC 的角色的 Amazon 资源名称 (ARN)。

1. 使用以下命令安装 Helm 图表：

   ```
   kubectl create namespace sagemaker-k8s-operator-system
     helm install --namespace sagemaker-k8s-operator-system sagemaker-operator rolebased/
   ```

   如果您决定将 Operator 安装到指定的命名空间以外的命名空间，则需要调整 IAM 角色 `trust.json` 文件中定义的命名空间以使其匹配。

1. 片刻之后，图表就会以随机生成的名称安装。运行以下命令验证安装是否成功：

   ```
   helm ls
   ```

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

   ```
   NAME                    NAMESPACE                       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
     sagemaker-operator      sagemaker-k8s-operator-system   1               2019-11-20 23:14:59.6777082 +0000 UTC   deployed        sagemaker-k8s-operator-0.1.0
   ```

##### 验证 Operator 部署


1. 通过运行以下命令，您应该能够看到部署到集群的每个操作员的 SageMaker AI 自定义资源定义 (CRDs)：

   ```
   kubectl get crd | grep sagemaker
   ```

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

   ```
   batchtransformjobs.sagemaker.aws.amazon.com         2019-11-20T17:12:34Z
   endpointconfigs.sagemaker.aws.amazon.com            2019-11-20T17:12:34Z
   hostingdeployments.sagemaker.aws.amazon.com         2019-11-20T17:12:34Z
   hyperparametertuningjobs.sagemaker.aws.amazon.com   2019-11-20T17:12:34Z
   models.sagemaker.aws.amazon.com                     2019-11-20T17:12:34Z
   trainingjobs.sagemaker.aws.amazon.com               2019-11-20T17:12:34Z
   ```

1. 确保 Operator Pod 成功运行。使用以下命令列出所有 Pod：

   ```
   kubectl -n sagemaker-k8s-operator-system get pods
   ```

   您应该会在命名空间 `sagemaker-k8s-operator-system` 中看到一个名为 `sagemaker-k8s-operator-controller-manager-*****` 的 Pod，如下所示：

   ```
   NAME                                                         READY   STATUS    RESTARTS   AGE
   sagemaker-k8s-operator-controller-manager-12345678-r8abc     2/2     Running   0          23s
   ```

#### 命名空间范围部署


您可以选择在单个 Kubernetes 命名空间的范围内安装 Operator。在此模式下，如果资源是在该命名空间内创建的，则控制器仅监视和协调与 SageMaker AI 的资源。这样就能对哪个控制器管理哪个资源进行更精细的控制。这对于部署到多个 Amazon 账户或控制哪些用户有权访问特定作业非常有用。

本指南概述了如何将 Operator 安装到特定的预定义命名空间中。要将控制器部署到第二个命名空间中，请从头到尾按照指南进行操作，并在每个步骤中更改命名空间。

##### 为 Amazon EKS 集群创建 OIDC 提供商


以下说明介绍如何创建 OIDC 提供商并将其与您的 Amazon EKS 集群关联。

1. 按如下方式设置本地 `CLUSTER_NAME` 和 `AWS_REGION` 环境变量：

   ```
   # Set the Region and cluster
   export CLUSTER_NAME="<your cluster name>"
   export Amazon_REGION="<your region>"
   ```

1. 使用以下命令将 OIDC 提供商与您的集群关联。有关更多信息，请参阅[为集群上的服务账户启用 IAM 角色](https://docs.amazonaws.cn/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)。

   ```
   eksctl utils associate-iam-oidc-provider --cluster ${CLUSTER_NAME} \
         --region ${AWS_REGION} --approve
   ```

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

   ```
   [_]  eksctl version 0.10.1
     [_]  using region us-east-1
     [_]  IAM OpenID Connect provider is associated with cluster "my-cluster" in "us-east-1"
   ```

现在，集群已有一个 OIDC 身份提供商，请创建一个角色并授予 Kubernetes 代入该角色的 ServiceAccount 权限。

##### 获取您的 OIDC ID


要进行设置 ServiceAccount，请先使用以下命令获取 OpenID Connect 颁发者网址：

```
aws eks describe-cluster --name ${CLUSTER_NAME} --region ${AWS_REGION} \
      --query cluster.identity.oidc.issuer --output text
```

该命令会返回类似以下内容的 URL：

```
https://oidc.eks.${AWS_REGION}.amazonaws.com/id/D48675832CA65BD10A532F597OIDCID
```

在此 URL 中，值 D48675832 CA65 BD10 A532F597OIDCID 是 OIDC ID。您集群的 OIDC ID 不同。您需要使用此 OIDC ID 值来创建角色。

 如果输出为 `None`，则表示您的客户端版本过旧。要解决此问题，请运行以下命令：

```
aws eks describe-cluster --region ${AWS_REGION} --query cluster --name ${CLUSTER_NAME} --output text | grep OIDC
```

返回的 OIDC URL 如下所示：

```
OIDC https://oidc.eks.us-east-1.amazonaws.com/id/D48675832CA65BD10A532F597OIDCID
```

##### 创建您的 IAM 角色


1. 

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
         {
           "Effect": "Allow",
           "Principal": {
           "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
             "StringEquals": {
                 "oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:aud": "sts.amazonaws.com",
                 "oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:sub": "system:serviceaccount:<Namespace>:sagemaker-k8s-operator-default"
             }
           }
         }
       ]
     }
   ```

------

   创建一个名为 `trust.json` 的文件，并在其中插入以下信任关系代码块。请务必将所有 `<OIDC ID>`、`<Amazon account number>` 和 `<EKS Cluster region>` 占位符替换为与您的集群对应的值。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
         {
           "Effect": "Allow",
           "Principal": {
             "Federated": "arn:aws-cn:iam::111122223333:oidc-provider/oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
             "StringEquals": {
                 "oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:aud": "sts.amazonaws.com",
                 "oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:sub": "system:serviceaccount:<Namespace>:sagemaker-k8s-operator-default"
             }
           }
         }
       ]
     }
   ```

------

1. 运行以下命令，以创建一个具有 `trust.json` 中定义的信任关系的角色。此角色允许 Amazon EKS 集群从 IAM 获取和刷新凭证。

   ```
   aws iam create-role --region ${AWS_REGION} --role-name <role name> --assume-role-policy-document file://trust.json --output=text
   ```

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

   ```
   ROLE    arn:aws:iam::123456789012:role/my-role 2019-11-22T21:46:10Z    /       ABCDEFSFODNN7EXAMPLE   my-role
     ASSUMEROLEPOLICYDOCUMENT        2012-10-17		 	 	 
     STATEMENT       sts:AssumeRoleWithWebIdentity   Allow
     STRINGEQUALS    sts.amazonaws.com       system:serviceaccount:my-namespace:sagemaker-k8s-operator-default
     PRINCIPAL       arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/
   ```

请记下 `ROLE ARN`。您将此值传递给您的 Operator。

##### 将 AmazonSageMakerFullAccess 策略附加到您的角色


要授予角色访问 SageMaker AI 的权限，请附加[https://console.amazonaws.cn/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonSageMakerFullAccess](https://console.amazonaws.cn/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonSageMakerFullAccess)策略。如果您想限制 Operator 的权限，可以创建自己的自定义策略并附加该策略。

附加以下策略：

```
aws iam attach-role-policy --region ${AWS_REGION} --role-name <role name> --policy-arn arn:aws-cn:iam::aws:policy/AmazonSageMakerFullAccess
```

Kubernetes ServiceAccount `sagemaker-k8s-operator-default` 应该拥有权限。`AmazonSageMakerFullAccess`安装 Operator 时请确认这一点。

##### 将 Operator 部署到您的命名空间


部署 Operator 时，您可以使用 YAML 文件或 Helm 图表。

##### 使用 YAML 将 Operator 部署到您的命名空间


在命名空间范围内部署 Operator 分为两个部分。第一个是在集群 CRDs 级别安装的一组。每个 Kubernetes 集群只需安装一次这些资源定义。第二部分是 Operator 权限和部署本身。

 如果您尚未将安装到集群 CRDs 中，请使用以下命令应用 CRD 安装程序 YAML：

```
kubectl apply -f https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/release/rolebased/namespaced/crd.yaml
```

要将 Operator 安装到集群上，请执行以下操作：

1. 下载以下 Operator 脚本。每当引用 `operator.yaml` 时，都用 `operator_china.yaml` 代替。

   ```
   wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/release/rolebased/namespaced/china/operator_china.yaml
   ```

1. 使用以下命令更新安装程序 YAML，以将资源放入您指定的命名空间中：

   ```
   sed -i -e 's/PLACEHOLDER-NAMESPACE/<YOUR NAMESPACE>/g' operator.yaml
   ```

1. 编辑 `operator.yaml` 文件以将资源放入您的 `eks.amazonaws.com/role-arn` 中。将此处的 ARN 替换为您创建的基于 OIDC 的角色的 Amazon 资源名称 (ARN)。

1. 使用以下命令部署集群：

   ```
   kubectl apply -f operator.yaml
   ```

##### 使用 Helm 图表将 Operator 部署到您的命名空间


在命名空间范围内部署 Operator 需要两个部分。第一个是在集群 CRDs 级别安装的一组。每个 Kubernetes 集群只需安装一次这些资源定义。第二部分是 Operator 权限和部署本身。使用 Helm 图表时，必须先使用 `kubectl` 创建命名空间。

1. 使用以下命令克隆 Helm 安装程序目录：

   ```
   git clone https://github.com/aws/amazon-sagemaker-operator-for-k8s.git
   ```

1. 导航到 `amazon-sagemaker-operator-for-k8s/hack/charts/installer/namespaced`文件夹。编辑 `rolebased/values.yaml` 文件，其中包含图表的高级参数。将此处的角色 ARN 替换为您创建的基于 OIDC 的角色的 Amazon 资源名称 (ARN)。

1. 使用以下命令安装 Helm 图表：

   ```
   helm install crds crd_chart/
   ```

1. 使用以下命令创建所需的命名空间并安装 Operator：

   ```
   kubectl create namespace <namespace>
   helm install --n <namespace> op operator_chart/
   ```

1. 片刻之后，图表就会以名称 `sagemaker-operator` 安装。运行以下命令验证安装是否成功：

   ```
   helm ls
   ```

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

   ```
   NAME                    NAMESPACE                       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
   sagemaker-operator      my-namespace                    1               2019-11-20 23:14:59.6777082 +0000 UTC   deployed        sagemaker-k8s-operator-0.1.0
   ```

##### 验证 Operator 部署到您的命名空间


1. 通过运行以下命令，您应该能够看到部署到集群的每个操作员的 SageMaker AI 自定义资源定义 (CRDs)：

   ```
   kubectl get crd | grep sagemaker
   ```

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

   ```
   batchtransformjobs.sagemaker.aws.amazon.com         2019-11-20T17:12:34Z
   endpointconfigs.sagemaker.aws.amazon.com            2019-11-20T17:12:34Z
   hostingdeployments.sagemaker.aws.amazon.com         2019-11-20T17:12:34Z
   hyperparametertuningjobs.sagemaker.aws.amazon.com   2019-11-20T17:12:34Z
   models.sagemaker.aws.amazon.com                     2019-11-20T17:12:34Z
   trainingjobs.sagemaker.aws.amazon.com               2019-11-20T17:12:34Z
   ```

1. 确保 Operator Pod 成功运行。使用以下命令列出所有 Pod：

   ```
   kubectl -n my-namespace get pods
   ```

   您应该会在命名空间 `my-namespace` 中看到一个名为 `sagemaker-k8s-operator-controller-manager-*****` 的 Pod，如下所示：

   ```
   NAME                                                         READY   STATUS    RESTARTS   AGE
   sagemaker-k8s-operator-controller-manager-12345678-r8abc     2/2     Running   0          23s
   ```

#### 安装 A SageMaker I 日志`kubectl`插件


 [作为 Kubernetes SageMaker 人工智能运算符的一部分，你可以将该`smlogs`插件用于。](https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/) `kubectl`这允许使用 SageMaker AI CloudWatch 日志进行流式传输`kubectl`。 `kubectl`必须安装到你的 [PATH](http://www.linfo.org/path_env_var.html) 上。以下命令将二进制文件放入主目录的 `sagemaker-k8s-bin` 目录，然后将该目录添加到您的 `PATH`。

```
export os="linux"
  
wget https://amazon-sagemaker-operator-for-k8s-us-east-1.s3.amazonaws.com/kubectl-smlogs-plugin/v1/${os}.amd64.tar.gz
tar xvzf ${os}.amd64.tar.gz
  
# Move binaries to a directory in your homedir.
mkdir ~/sagemaker-k8s-bin
cp ./kubectl-smlogs.${os}.amd64/kubectl-smlogs ~/sagemaker-k8s-bin/.
  
# This line adds the binaries to your PATH in your .bashrc.
  
echo 'export PATH=$PATH:~/sagemaker-k8s-bin' >> ~/.bashrc
  
# Source your .bashrc to update environment variables:
source ~/.bashrc
```

使用以下命令验证是否已正确安装 `kubectl` 插件：

```
kubectl smlogs
```

如果 `kubectl` 插件安装正确，则输出应如下所示：

```
View SageMaker AI logs via Kubernetes
  
Usage:
  smlogs [command]
  
Aliases:
  smlogs, SMLogs, Smlogs
  
Available Commands:
  BatchTransformJob       View BatchTransformJob logs via Kubernetes
  TrainingJob             View TrainingJob logs via Kubernetes
  help                    Help about any command
  
Flags:
   -h, --help   help for smlogs
  
Use "smlogs [command] --help" for more information about a command.
```

### 清理 资源


要从集群中卸载操作员，必须先确保从集群中删除所有 SageMaker AI 资源。否则会导致 Operator 删除操作挂起。运行以下命令以停止所有作业：

```
# Delete all SageMaker AI jobs from Kubernetes
kubectl delete --all --all-namespaces hyperparametertuningjob.sagemaker.aws.amazon.com
kubectl delete --all --all-namespaces trainingjobs.sagemaker.aws.amazon.com
kubectl delete --all --all-namespaces batchtransformjob.sagemaker.aws.amazon.com
kubectl delete --all --all-namespaces hostingdeployment.sagemaker.aws.amazon.com
```

您应该可以看到类似于如下所示的输出内容：

```
$ kubectl delete --all --all-namespaces trainingjobs.sagemaker.aws.amazon.com
trainingjobs.sagemaker.aws.amazon.com "xgboost-mnist-from-for-s3" deleted
  
$ kubectl delete --all --all-namespaces hyperparametertuningjob.sagemaker.aws.amazon.com
hyperparametertuningjob.sagemaker.aws.amazon.com "xgboost-mnist-hpo" deleted
  
$ kubectl delete --all --all-namespaces batchtransformjob.sagemaker.aws.amazon.com
batchtransformjob.sagemaker.aws.amazon.com "xgboost-mnist" deleted
  
$ kubectl delete --all --all-namespaces hostingdeployment.sagemaker.aws.amazon.com
hostingdeployment.sagemaker.aws.amazon.com "host-xgboost" deleted
```

删除所有 SageMaker AI 作业后，请参阅[删除 Operator](#delete-operators)从集群中删除操作员。

### 删除 Operator


#### 删除基于集群的 Operator


##### 使用 YAML 安装的 Operator


要从集群中卸载操作员，请确保已从集群中删除所有 SageMaker AI 资源。否则会导致 Operator 删除操作挂起。

**注意**  
在删除集群之前，请务必从集群中删除所有 SageMaker AI 资源。请参阅[清理 资源](#cleanup-operator-resources)了解更多信息。

删除所有 SageMaker AI 作业后，使用`kubectl`从集群中删除操作员：

```
# Delete the operator and its resources
kubectl delete -f /installer.yaml
```

您应该可以看到类似于如下所示的输出内容：

```
$ kubectl delete -f raw-yaml/installer.yaml
namespace "sagemaker-k8s-operator-system" deleted
customresourcedefinition.apiextensions.k8s.io "batchtransformjobs.sagemaker.aws.amazon.com" deleted
customresourcedefinition.apiextensions.k8s.io "endpointconfigs.sagemaker.aws.amazon.com" deleted
customresourcedefinition.apiextensions.k8s.io "hostingdeployments.sagemaker.aws.amazon.com" deleted
customresourcedefinition.apiextensions.k8s.io "hyperparametertuningjobs.sagemaker.aws.amazon.com" deleted
customresourcedefinition.apiextensions.k8s.io "models.sagemaker.aws.amazon.com" deleted
customresourcedefinition.apiextensions.k8s.io "trainingjobs.sagemaker.aws.amazon.com" deleted
role.rbac.authorization.k8s.io "sagemaker-k8s-operator-leader-election-role" deleted
clusterrole.rbac.authorization.k8s.io "sagemaker-k8s-operator-manager-role" deleted
clusterrole.rbac.authorization.k8s.io "sagemaker-k8s-operator-proxy-role" deleted
rolebinding.rbac.authorization.k8s.io "sagemaker-k8s-operator-leader-election-rolebinding" deleted
clusterrolebinding.rbac.authorization.k8s.io "sagemaker-k8s-operator-manager-rolebinding" deleted
clusterrolebinding.rbac.authorization.k8s.io "sagemaker-k8s-operator-proxy-rolebinding" deleted
service "sagemaker-k8s-operator-controller-manager-metrics-service" deleted
deployment.apps "sagemaker-k8s-operator-controller-manager" deleted
secrets "sagemaker-k8s-operator-abcde" deleted
```

##### 使用 Helm 图表安装的 Operator


要删除操作员 CRDs，请先删除所有正在运行的作业。然后使用以下命令删除用于部署 Operator 的 Helm 图表：

```
# get the helm charts
helm ls
  
# delete the charts
helm delete <chart_name>
```

#### 删除基于命名空间的 Operator


##### 使用 YAML 安装的 Operator


要从集群中卸载操作员，请先确保已从集群中删除所有 SageMaker AI 资源。否则会导致 Operator 删除操作挂起。

**注意**  
在删除集群之前，请务必从集群中删除所有 SageMaker AI 资源。请参阅[清理 资源](#cleanup-operator-resources)了解更多信息。

删除所有 SageMaker AI 作业后，使用`kubectl`先从命名空间中删除操作员，然后再从集群 CRDs 中删除运算符。运行以下命令以从集群中删除 Operator：

```
# Delete the operator using the same yaml file that was used to install the operator
kubectl delete -f operator.yaml
  
# Now delete the CRDs using the CRD installer yaml
kubectl delete -f https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/release/rolebased/namespaced/crd.yaml
  
# Now you can delete the namespace if you want
kubectl delete namespace <namespace>
```

##### 使用 Helm 图表安装的 Operator


要删除操作员 CRDs，请先删除所有正在运行的作业。然后使用以下命令删除用于部署 Operator 的 Helm 图表：

```
# Delete the operator
helm delete <chart_name>
  
# delete the crds
helm delete crds
  
# optionally delete the namespace
kubectl delete namespace <namespace>
```

### 问题排查


#### 调试失败的作业


使用以下步骤调试失败的作业。
+ 可以通过运行以下命令来检查作业状态：

  ```
  kubectl get <CRD Type> <job name>
  ```
+ 如果任务是在 SageMaker AI 中创建的，则可以使用以下命令查看`STATUS`和`SageMaker Job Name`：

  ```
  kubectl get <crd type> <job name>
  ```
+ 您可以使用以下命令通过 `smlogs` 查找问题原因：

  ```
  kubectl smlogs <crd type> <job name>
  ```
+  还可以使用以下命令通过 `describe` 命令获取有关作业的更多详细信息。输出中有一个 `additional` 字段，其中包含有关作业状态的更多信息。

  ```
  kubectl describe <crd type> <job name>
  ```
+ 如果任务不是在 SageMaker AI 中创建的，则使用操作员的 pod 的日志来查找问题的原因，如下所示：

  ```
  $ kubectl get pods -A | grep sagemaker
  # Output:
  sagemaker-k8s-operator-system   sagemaker-k8s-operator-controller-manager-5cd7df4d74-wh22z   2/2     Running   0          3h33m
    
  $ kubectl logs -p <pod name> -c manager -n sagemaker-k8s-operator-system
  ```

#### 删除 Operator CRD


如果删除作业失败，请检查 Operator 是否正在运行。如果 Operator 未运行，则必须使用以下步骤删除终结器：

1. 在新终端中，使用 `kubectl edit` 在编辑器中打开作业，如下所示：

   ```
   kubectl edit <crd type> <job name>
   ```

1. 编辑作业，通过从文件中删除以下两行来删除终结器。保存文件后，作业即被删除。

   ```
   finalizers:
     - sagemaker-operator-finalizer
   ```

### 每个区域 SMlogs 的图片和图片


下表列出了每个区域 SMLogs 中可用的操作员图像。


|  Region  |  控制器映像  |  Linu SMLogs  | 
| --- | --- | --- | 
|  us-east-1  |  957583890962.dkr.ecr.us-east-1.amazonaws.com/amazon-sagemaker-operator-for-k8s:v1  |  [https://s3.us-east-1.amazonaws.com/amazon-sagemaker-operator-for-k8s-us-east-1/kubectl-smlogs-plugin/v1/linux.amd64.tar.gz](https://s3.us-east-1.amazonaws.com/amazon-sagemaker-operator-for-k8s-us-east-1/kubectl-smlogs-plugin/v1/linux.amd64.tar.gz)  | 
|  us-east-2  |  922499468684.dkr.ecr.us-east-2.amazonaws.com/amazon-sagemaker-operator-for-k8s:v1  |  [https://s3.us-east-2.amazonaws.com/amazon-sagemaker-operator-for-k8s-us-east-2/kubectl-smlogs-plugin/v1/linux.amd64.tar.gz](https://s3.us-east-2.amazonaws.com/amazon-sagemaker-operator-for-k8s-us-east-2/kubectl-smlogs-plugin/v1/linux.amd64.tar.gz)  | 
|  us-west-2  |  640106867763.dkr.ecr.us-west-2.amazonaws.com/amazon-sagemaker-operator-for-k8s:v1  |  [https://s3.us-west-2.amazonaws.com/amazon-sagemaker-operator-for-k8s-us-west-2/kubectl-smlogs-plugin/v1/linux.amd64.tar.gz](https://s3.us-west-2.amazonaws.com/amazon-sagemaker-operator-for-k8s-us-west-2/kubectl-smlogs-plugin/v1/linux.amd64.tar.gz)  | 
|  eu-west-1  |  613661167059.dkr.ecr.eu-west-1.amazonaws.com/amazon-sagemaker-operator-for-k8s:v1  |  [https://s3.eu-west-1.amazonaws.com/amazon-sagemaker-operator-for-k8s-eu-west-1/kubectl-smlogs-plugin/v1/linux.amd64.tar.gz](https://s3.eu-west-1.amazonaws.com/amazon-sagemaker-operator-for-k8s-eu-west-1/kubectl-smlogs-plugin/v1/linux.amd64.tar.gz)  | 

# 使用 Amazon A SageMaker I Jobs
使用 SageMaker AI 作业

本节基于适用于 [Kubernetes SageMaker 的人工智能运算符的原](https://github.com/aws/amazon-sagemaker-operator-for-k8s)始版本。

**重要**  
我们将停止对 [Kubernetes SageMaker 操作](https://github.com/aws/amazon-sagemaker-operator-for-k8s/tree/master)员的原始版本的开发和技术支持。  
如果您当前使用的是 [Kubernetes SageMaker 操作员版本`v1.2.2`或更](https://github.com/aws/amazon-sagemaker-operator-for-k8s/tree/master)低版本，我们建议您将资源迁移到适用于 Amazon 的 [ACK 服务控制](https://github.com/aws-controllers-k8s/sagemaker-controller)器。 SageMakerACK 服务控制器是基于 Kubernetes 控制[Amazon 器 (ACK) 的新一代 Kuber](https://aws-controllers-k8s.github.io/community/) netes SageMaker 操作员。  
有关迁移步骤的信息，请参阅[将资源迁移到最新 Operator](kubernetes-sagemaker-operators-migrate.md)。  
有关终止对 Kubernetes SageMaker 操作员原始版本支持的常见问题解答，请参阅 [宣布终止对 Kubernetes SageMaker 人工智能运算符原始版本的支持](kubernetes-sagemaker-operators-eos-announcement.md)

要使用 Kubernetes 的运算符运行 SageMaker Amazon AI 作业，你可以应用 YAML 文件或使用提供的 Helm Charts。

以下教程中的所有示例 Operator 作业都使用来自公共 MNIST 数据集的示例数据。要运行这些示例，请将数据集下载到 Amazon S3 存储桶中。您可以在[下载 MNIST 数据集](https://docs.amazonaws.cn/sagemaker/latest/dg/ex1-preprocess-data-pull-data.html)中找到该数据集。

**Topics**
+ [

## TrainingJob 操作员
](#trainingjob-operator)
+ [

## HyperParameterTuningJob 操作员
](#hyperparametertuningjobs-operator)
+ [

## BatchTransformJob 操作员
](#batchtransformjobs-operator)
+ [

## HostingDeployment 操作员
](#hosting-deployment-operator)
+ [

## ProcessingJob 操作员
](#kubernetes-processing-job-operator)
+ [

## HostingAutoscalingPolicy (HAP) 操作员
](#kubernetes-hap-operator)

## TrainingJob 操作员


通过在 AI 中为你启动 SageMaker AI，训练作业操作员将你指定的训练作业规范与 SageMaker AI 进行协调。您可以在 SageMaker A [CreateTrainingJob I API 文档](https://docs.amazonaws.cn/sagemaker/latest/dg/API_CreateTrainingJob.html)中了解有关 SageMaker 训练作业的更多信息。

**Topics**
+ [

### TrainingJob 使用 YAML 文件创建
](#create-a-trainingjob-using-a-simple-yaml-file)
+ [

### TrainingJob 使用 Helm Chart 创建一个
](#create-a-trainingjob-using-a-helm-chart)
+ [

### 名单 TrainingJobs
](#list-training-jobs)
+ [

### 描述一个 TrainingJob
](#describe-a-training-job)
+ [

### 查看来自的日志 TrainingJobs
](#view-logs-from-training-jobs)
+ [

### 删除 TrainingJobs
](#delete-training-jobs)

### TrainingJob 使用 YAML 文件创建


1. 使用以下命令下载示例 YAML 文件进行训练：

   ```
   wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/samples/xgboost-mnist-trainingjob.yaml
   ```

1. 编辑该`xgboost-mnist-trainingjob.yaml`文件以将`roleArn`参数替换为您的`<sagemaker-execution-role>`和 A SageMaker I 执行角色`outputPath`具有写入权限的 Amazon S3 存储桶。`roleArn`必须拥有权限，这样 SageMaker AI 才能代表您访问 Amazon S3 CloudWatch、Amazon 和其他服务。有关创建 SageMaker AI 的更多信息 ExecutionRole，请参阅 [SageMaker AI 角色](https://docs.amazonaws.cn/sagemaker/latest/dg/sagemaker-roles.html#sagemaker-roles-createtrainingjob-perms)。使用以下命令应用 YAML 文件：

   ```
   kubectl apply -f xgboost-mnist-trainingjob.yaml
   ```

### TrainingJob 使用 Helm Chart 创建一个


你可以使用 Helm Charts 来运行 TrainingJobs。

1. 使用以下命令克隆 GitHub 存储库以获取源代码：

   ```
   git clone https://github.com/aws/amazon-sagemaker-operator-for-k8s.git
   ```

1. 导航到 `amazon-sagemaker-operator-for-k8s/hack/charts/training-jobs/` 文件夹并编辑 `values.yaml` 文件，将 `rolearn` 和 `outputpath` 之类的值替换为与您的账户对应的值。RoLearn 必须拥有权限，这样 SageMaker AI 才能代表您访问亚马逊 S3 CloudWatch、亚马逊和其他服务。有关创建 SageMaker AI 的更多信息 ExecutionRole，请参阅 [SageMaker AI 角色](https://docs.amazonaws.cn/sagemaker/latest/dg/sagemaker-roles.html#sagemaker-roles-createtrainingjob-perms)。

#### 创建 TrainingJob


将角色和 Amazon S3 存储桶替换为 `values.yaml` 中的相应值后，您可以使用以下命令创建训练作业：

```
helm install . --generate-name
```

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

```
NAME: chart-12345678
LAST DEPLOYED: Wed Nov 20 23:35:49 2019
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thanks for installing the sagemaker-k8s-trainingjob.
```

#### 验证您的训练 Helm 图表


要验证 Helm 图表是否已成功创建，请运行：

```
helm ls
```

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

```
NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
chart-12345678        default         1               2019-11-20 23:35:49.9136092 +0000 UTC   deployed        sagemaker-k8s-trainingjob-0.1.0
rolebased-12345678    default         1               2019-11-20 23:14:59.6777082 +0000 UTC   deployed        sagemaker-k8s-operator-0.1.0
```

`helm install` 创建一个 `TrainingJob` Kubernetes 资源。操作员在 SageMaker AI 中启动实际训练作业，并更新 `TrainingJob` Kubernetes 资源以反映 AI 中作业的状态。 SageMaker 在工作期间使用的 SageMaker AI 资源会产生费用。作业完成或停止后，您无需支付任何费用。

**注意**： SageMaker AI 不允许你更新跑步训练作业。您不能编辑任何参数并重新应用配置文件。要么更改元数据名称，要么删除现有作业并创建新作业。与 Kubeflow TFJob 中现有的训练作业操作员类似，`update`不支持。

### 名单 TrainingJobs


使用以下命令列出使用 Kubernetes Operator 创建的所有作业：

```
kubectl get TrainingJob
```

列出所有作业的输出应与以下内容类似：

```
kubectl get trainingjobs
NAME                        STATUS       SECONDARY-STATUS   CREATION-TIME          SAGEMAKER-JOB-NAME
xgboost-mnist-from-for-s3   InProgress   Starting           2019-11-20T23:42:35Z   xgboost-mnist-from-for-s3-examplef11eab94e0ed4671d5a8f
```

训练作业无论是完成还是失败，都将继续列在列表中。您可以按照[删除 TrainingJobs](#delete-training-jobs) 步骤从列表中删除 `TrainingJob` 作业。已完成或停止的任务不会对 SageMaker 人工智能资源产生任何费用。

#### TrainingJob 状态值


`STATUS` 字段可以是以下任一值：
+ `Completed` 
+ `InProgress` 
+ `Failed` 
+ `Stopped` 
+ `Stopping` 

这些状态直接来自 SageMaker A [I 官方 API 文档](https://docs.amazonaws.cn/sagemaker/latest/dg/API_DescribeTrainingJob.html#SageMaker-DescribeTrainingJob-response-TrainingJobStatus)。

除了官方 SageMaker 的人工智能身份外，还有可能成`STATUS`为`SynchronizingK8sJobWithSageMaker`。这意味着 Operator 尚未处理该作业。

#### 次要状态值


次要状态直接来自 SageMaker A [I 官方 API 文档](https://docs.amazonaws.cn/sagemaker/latest/dg/API_DescribeTrainingJob.html#SageMaker-DescribeTrainingJob-response-SecondaryStatus)。它们包含有关作业状态的更详细信息。

### 描述一个 TrainingJob


您可以使用 `describe` `kubectl` 命令获取有关训练作业的更多详细信息。这通常用于调试问题或检查训练作业的参数。要获取有关训练作业的信息，请使用以下命令：

```
kubectl describe trainingjob xgboost-mnist-from-for-s3
```

训练作业的输出应与以下内容类似：

```
Name:         xgboost-mnist-from-for-s3
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  sagemaker.aws.amazon.com/v1
Kind:         TrainingJob
Metadata:
  Creation Timestamp:  2019-11-20T23:42:35Z
  Finalizers:
    sagemaker-operator-finalizer
  Generation:        2
  Resource Version:  23119
  Self Link:         /apis/sagemaker.aws.amazon.com/v1/namespaces/default/trainingjobs/xgboost-mnist-from-for-s3
  UID:               6d7uiui-0bef-11ea-b94e-0ed467example
Spec:
  Algorithm Specification:
    Training Image:       8256416981234.dkr.ecr.us-east-2.amazonaws.com/xgboost:1
    Training Input Mode:  File
  Hyper Parameters:
    Name:   eta
    Value:  0.2
    Name:   gamma
    Value:  4
    Name:   max_depth
    Value:  5
    Name:   min_child_weight
    Value:  6
    Name:   num_class
    Value:  10
    Name:   num_round
    Value:  10
    Name:   objective
    Value:  multi:softmax
    Name:   silent
    Value:  0
  Input Data Config:
    Channel Name:      train
    Compression Type:  None
    Content Type:      text/csv
    Data Source:
      S 3 Data Source:
        S 3 Data Distribution Type:  FullyReplicated
        S 3 Data Type:               S3Prefix
        S 3 Uri:                     https://s3-us-east-2.amazonaws.com/amzn-s3-demo-bucket/sagemaker/xgboost-mnist/train/
    Channel Name:                    validation
    Compression Type:                None
    Content Type:                    text/csv
    Data Source:
      S 3 Data Source:
        S 3 Data Distribution Type:  FullyReplicated
        S 3 Data Type:               S3Prefix
        S 3 Uri:                     https://s3-us-east-2.amazonaws.com/amzn-s3-demo-bucket/sagemaker/xgboost-mnist/validation/
  Output Data Config:
    S 3 Output Path:  s3://amzn-s3-demo-bucket/sagemaker/xgboost-mnist/xgboost/
  Region:             us-east-2
  Resource Config:
    Instance Count:     1
    Instance Type:      ml.m4.xlarge
    Volume Size In GB:  5
  Role Arn:             arn:aws:iam::12345678910:role/service-role/AmazonSageMaker-ExecutionRole
  Stopping Condition:
    Max Runtime In Seconds:  86400
  Training Job Name:         xgboost-mnist-from-for-s3-6d7fa0af0bef11eab94e0example
Status:
  Cloud Watch Log URL:           https://us-east-2.console.aws.amazon.com/cloudwatch/home?region=us-east-2#logStream:group=/aws/sagemaker/TrainingJobs;prefix=<example>;streamFilter=typeLogStreamPrefix
  Last Check Time:               2019-11-20T23:44:29Z
  Sage Maker Training Job Name:  xgboost-mnist-from-for-s3-6d7fa0af0bef11eab94eexample
  Secondary Status:              Downloading
  Training Job Status:           InProgress
Events:                          <none>
```

### 查看来自的日志 TrainingJobs


使用以下命令查看 `kmeans-mnist` 训练作业的日志：

```
kubectl smlogs trainingjob xgboost-mnist-from-for-s3
```

您的输出应类似于以下内容。实例日志按时间顺序排列。

```
"xgboost-mnist-from-for-s3" has SageMaker TrainingJobName "xgboost-mnist-from-for-s3-123456789" in region "us-east-2", status "InProgress" and secondary status "Starting"
xgboost-mnist-from-for-s3-6d7fa0af0bef11eab94e0ed46example/algo-1-1574293123 2019-11-20 23:45:24.7 +0000 UTC Arguments: train
xgboost-mnist-from-for-s3-6d7fa0af0bef11eab94e0ed46example/algo-1-1574293123 2019-11-20 23:45:24.7 +0000 UTC [2019-11-20:23:45:22:INFO] Running standalone xgboost training.
xgboost-mnist-from-for-s3-6d7fa0af0bef11eab94e0ed46example/algo-1-1574293123 2019-11-20 23:45:24.7 +0000 UTC [2019-11-20:23:45:22:INFO] File size need to be processed in the node: 1122.95mb. Available memory size in the node: 8586.0mb
xgboost-mnist-from-for-s3-6d7fa0af0bef11eab94e0ed46example/algo-1-1574293123 2019-11-20 23:45:24.7 +0000 UTC [2019-11-20:23:45:22:INFO] Determined delimiter of CSV input is ','
xgboost-mnist-from-for-s3-6d7fa0af0bef11eab94e0ed46example/algo-1-1574293123 2019-11-20 23:45:24.7 +0000 UTC [23:45:22] S3DistributionType set as FullyReplicated
```

### 删除 TrainingJobs


使用以下命令停止 Amazon A SageMaker I 上的训练作业：

```
kubectl delete trainingjob xgboost-mnist-from-for-s3
```

此命令会从 Kubernetes 中移除 SageMaker 训练作业。此命令将返回以下输出：

```
trainingjob.sagemaker.aws.amazon.com "xgboost-mnist-from-for-s3" deleted
```

如果 SageMaker AI 上的作业仍在进行中，则该作业将停止。任务停止或完成后，您无需为 SageMaker 人工智能资源支付任何费用。

**注意**： SageMaker AI 不会删除训练作业。已停止的作业继续显示在 SageMaker AI 控制台上。该`delete`命令大约需要 2 分钟才能从 SageMaker AI 中清理资源。

## HyperParameterTuningJob 操作员


超参数调优作业操作员通过在 AI 中启动您指定的超参数调整作业规范与 SageMaker AI 进行协调。 SageMaker 您可以在 AI [CreateHyperParameterTuningJob AP SageMaker I 文档](https://docs.amazonaws.cn/sagemaker/latest/dg/API_CreateHyperParameterTuningJob.html)中了解有关 A SageMaker I 超参数调整任务的更多信息。

**Topics**
+ [

### HyperparameterTuningJob 使用 YAML 文件创建
](#create-a-hyperparametertuningjob-using-a-simple-yaml-file)
+ [

### HyperparameterTuningJob 使用 Helm Chart 创建
](#create-a-hyperparametertuningjob-using-a-helm-chart)
+ [

### 名单 HyperparameterTuningJobs
](#list-hyperparameter-tuning-jobs)
+ [

### 描述一个 HyperparameterTuningJob
](#describe-a-hyperparameter-tuning-job)
+ [

### 查看来自的日志 HyperparameterTuningJobs
](#view-logs-from-hyperparametertuning-jobs)
+ [

### 删除一个 HyperparameterTuningJob
](#delete-hyperparametertuning-jobs)

### HyperparameterTuningJob 使用 YAML 文件创建


1. 使用以下命令下载超参数优化作业的示例 YAML 文件：

   ```
   wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/samples/xgboost-mnist-hpo.yaml
   ```

1. 编辑 `xgboost-mnist-hpo.yaml` 文件以将 `roleArn` 参数替换为您的 `sagemaker-execution-role`。要成功运行超参数优化作业，您还必须将 `s3InputPath` 和 `s3OutputPath` 更改为与您的账户对应的值。使用以下命令应用更新 YAML 文件：

   ```
   kubectl apply -f xgboost-mnist-hpo.yaml
   ```

### HyperparameterTuningJob 使用 Helm Chart 创建


您可以使用 Helm 图表运行超参数优化作业。

1. 使用以下命令克隆 GitHub 存储库以获取源代码：

   ```
   git clone https://github.com/aws/amazon-sagemaker-operator-for-k8s.git
   ```

1. 导航到 `amazon-sagemaker-operator-for-k8s/hack/charts/hyperparameter-tuning-jobs/`文件夹。

1. 编辑 `values.yaml` 文件以将 `roleArn` 参数替换为您的 `sagemaker-execution-role`。要成功运行超参数优化作业，您还必须将 `s3InputPath` 和 `s3OutputPath` 更改为与您的账户对应的值。

#### 创建 HyperparameterTuningJob


将角色和 Amazon S3 路径替换为 `values.yaml` 中的相应值后，您可以使用以下命令创建超参数优化作业：

```
helm install . --generate-name
```

您的输出应类似于以下内容：

```
NAME: chart-1574292948
LAST DEPLOYED: Wed Nov 20 23:35:49 2019
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thanks for installing the sagemaker-k8s-hyperparametertuningjob.
```

#### 验证图表安装


要验证是否已成功创建 Helm 图表，请运行以下命令：

```
helm ls
```

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

```
NAME                    NAMESPACE       REVISION        UPDATED
chart-1474292948        default         1               2019-11-20 23:35:49.9136092 +0000 UTC   deployed        sagemaker-k8s-hyperparametertuningjob-0.1.0                               STATUS          CHART                           APP VERSION
chart-1574292948        default         1               2019-11-20 23:35:49.9136092 +0000 UTC   deployed        sagemaker-k8s-trainingjob-0.1.0
rolebased-1574291698    default         1               2019-11-20 23:14:59.6777082 +0000 UTC   deployed        sagemaker-k8s-operator-0.1.0
```

`helm install` 创建一个 `HyperParameterTuningJob` Kubernetes 资源。操作员在 SageMaker AI 中启动实际的超参数优化作业，并更新 `HyperParameterTuningJob` Kubernetes 资源以反映该任务在 AI 中的状态。 SageMaker 在工作期间使用的 SageMaker AI 资源会产生费用。作业完成或停止后，您无需支付任何费用。

**注意**： SageMaker AI 不允许您更新正在运行的超参数调整作业。您不能编辑任何参数并重新应用配置文件。您必须更改元数据名称，或删除现有作业并创建新作业。与 Kubeflow 中的 `TFJob` 等现有训练作业 Operator 类似，`update` 不受支持。

### 名单 HyperparameterTuningJobs


使用以下命令列出使用 Kubernetes Operator 创建的所有作业：

```
kubectl get hyperparametertuningjob
```

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

```
NAME         STATUS      CREATION-TIME          COMPLETED   INPROGRESS   ERRORS   STOPPED   BEST-TRAINING-JOB                               SAGEMAKER-JOB-NAME
xgboost-mnist-hpo   Completed   2019-10-17T01:15:52Z   10          0            0        0         xgboostha92f5e3cf07b11e9bf6c06d6-009-4c7a123   xgboostha92f5e3cf07b11e9bf6c123
```

超参数优化作业无论是完成还是失败，都将继续列在列表中。您可以按照[删除一个 HyperparameterTuningJob](#delete-hyperparametertuning-jobs) 中的步骤从列表中删除 `hyperparametertuningjob`。已完成或停止的任务不会对 SageMaker 人工智能资源产生任何费用。

#### 超参数优化作业状态值


`STATUS` 字段可以是以下任一值：
+ `Completed` 
+ `InProgress` 
+ `Failed` 
+ `Stopped` 
+ `Stopping` 

这些状态直接来自 SageMaker A [I 官方 API 文档](https://docs.amazonaws.cn/sagemaker/latest/dg/API_DescribeHyperParameterTuningJob.html#SageMaker-DescribeHyperParameterTuningJob-response-HyperParameterTuningJobStatus)。

除了官方 SageMaker 的人工智能身份外，还有可能成`STATUS`为`SynchronizingK8sJobWithSageMaker`。这意味着 Operator 尚未处理该作业。

#### 状态计数器


输出有几个计数器，如 `COMPLETED` 和 `INPROGRESS`。它们分别表示已完成和正在进行的训练作业的数量。有关如何确定这些值的更多信息，请参阅 SageMaker API 文档[TrainingJobStatusCounters](https://docs.amazonaws.cn/sagemaker/latest/dg/API_TrainingJobStatusCounters.html)中的。

#### 最佳 TrainingJob


此列包含对所选指标进行了最佳优化的 `TrainingJob` 的名称。

要查看已优化超参数的摘要，请运行：

```
kubectl describe hyperparametertuningjob xgboost-mnist-hpo
```

要查看有关 `TrainingJob` 的详细信息，请运行：

```
kubectl describe trainingjobs <job name>
```

#### 已生成 TrainingJobs


您还可以运行以下命令，跟踪 `HyperparameterTuningJob` 在 Kubernetes 中启动的所有 10 个训练作业：

```
kubectl get trainingjobs
```

### 描述一个 HyperparameterTuningJob


您可以使用 `describe` `kubectl` 命令获取调试详细信息。

```
kubectl describe hyperparametertuningjob xgboost-mnist-hpo
```

除了有关调优作业的信息外，Kubernetes 的 SageMaker AI Operator 还会在输出中显示超参数调优[作业找到的最佳训练](https://docs.amazonaws.cn/sagemaker/latest/dg/automatic-model-tuning-monitor.html#automatic-model-tuning-best-training-job)作业，如下所示：`describe`

```
Name:         xgboost-mnist-hpo
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"sagemaker.aws.amazon.com/v1","kind":"HyperparameterTuningJob","metadata":{"annotations":{},"name":"xgboost-mnist-hpo","namespace":...
API Version:  sagemaker.aws.amazon.com/v1
Kind:         HyperparameterTuningJob
Metadata:
  Creation Timestamp:  2019-10-17T01:15:52Z
  Finalizers:
    sagemaker-operator-finalizer
  Generation:        2
  Resource Version:  8167
  Self Link:         /apis/sagemaker.aws.amazon.com/v1/namespaces/default/hyperparametertuningjobs/xgboost-mnist-hpo
  UID:               a92f5e3c-f07b-11e9-bf6c-06d6f303uidu
Spec:
  Hyper Parameter Tuning Job Config:
    Hyper Parameter Tuning Job Objective:
      Metric Name:  validation:error
      Type:         Minimize
    Parameter Ranges:
      Integer Parameter Ranges:
        Max Value:     20
        Min Value:     10
        Name:          num_round
        Scaling Type:  Linear
    Resource Limits:
      Max Number Of Training Jobs:     10
      Max Parallel Training Jobs:      10
    Strategy:                          Bayesian
    Training Job Early Stopping Type:  Off
  Hyper Parameter Tuning Job Name:     xgboostha92f5e3cf07b11e9bf6c06d6
  Region:                              us-east-2
  Training Job Definition:
    Algorithm Specification:
      Training Image:       12345678910.dkr.ecr.us-east-2.amazonaws.com/xgboost:1
      Training Input Mode:  File
    Input Data Config:
      Channel Name:  train
      Content Type:  text/csv
      Data Source:
        s3DataSource:
          s3DataDistributionType:  FullyReplicated
          s3DataType:              S3Prefix
          s3Uri:                   https://s3-us-east-2.amazonaws.com/amzn-s3-demo-bucket/sagemaker/xgboost-mnist/train/
      Channel Name:                validation
      Content Type:                text/csv
      Data Source:
        s3DataSource:
          s3DataDistributionType:  FullyReplicated
          s3DataType:              S3Prefix
          s3Uri:                   https://s3-us-east-2.amazonaws.com/amzn-s3-demo-bucket/sagemaker/xgboost-mnist/validation/
    Output Data Config:
      s3OutputPath:  https://s3-us-east-2.amazonaws.com/amzn-s3-demo-bucket/sagemaker/xgboost-mnist/xgboost
    Resource Config:
      Instance Count:     1
      Instance Type:      ml.m4.xlarge
      Volume Size In GB:  5
    Role Arn:             arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole
    Static Hyper Parameters:
      Name:   base_score
      Value:  0.5
      Name:   booster
      Value:  gbtree
      Name:   csv_weights
      Value:  0
      Name:   dsplit
      Value:  row
      Name:   grow_policy
      Value:  depthwise
      Name:   lambda_bias
      Value:  0.0
      Name:   max_bin
      Value:  256
      Name:   max_leaves
      Value:  0
      Name:   normalize_type
      Value:  tree
      Name:   objective
      Value:  reg:linear
      Name:   one_drop
      Value:  0
      Name:   prob_buffer_row
      Value:  1.0
      Name:   process_type
      Value:  default
      Name:   rate_drop
      Value:  0.0
      Name:   refresh_leaf
      Value:  1
      Name:   sample_type
      Value:  uniform
      Name:   scale_pos_weight
      Value:  1.0
      Name:   silent
      Value:  0
      Name:   sketch_eps
      Value:  0.03
      Name:   skip_drop
      Value:  0.0
      Name:   tree_method
      Value:  auto
      Name:   tweedie_variance_power
      Value:  1.5
    Stopping Condition:
      Max Runtime In Seconds:  86400
Status:
  Best Training Job:
    Creation Time:  2019-10-17T01:16:14Z
    Final Hyper Parameter Tuning Job Objective Metric:
      Metric Name:        validation:error
      Value:
    Objective Status:     Succeeded
    Training End Time:    2019-10-17T01:20:24Z
    Training Job Arn:     arn:aws:sagemaker:us-east-2:123456789012:training-job/xgboostha92f5e3cf07b11e9bf6c06d6-009-4sample
    Training Job Name:    xgboostha92f5e3cf07b11e9bf6c06d6-009-4c7a3059
    Training Job Status:  Completed
    Training Start Time:  2019-10-17T01:18:35Z
    Tuned Hyper Parameters:
      Name:                                    num_round
      Value:                                   18
  Hyper Parameter Tuning Job Status:           Completed
  Last Check Time:                             2019-10-17T01:21:01Z
  Sage Maker Hyper Parameter Tuning Job Name:  xgboostha92f5e3cf07b11e9bf6c06d6
  Training Job Status Counters:
    Completed:            10
    In Progress:          0
    Non Retryable Error:  0
    Retryable Error:      0
    Stopped:              0
    Total Error:          0
Events:                   <none>
```

### 查看来自的日志 HyperparameterTuningJobs


超参数优化作业没有日志，但它们启动的所有训练作业都有日志。可以像访问普通的训练作业一样访问这些日志。有关更多信息，请参阅 [查看来自的日志 TrainingJobs](#view-logs-from-training-jobs)。

### 删除一个 HyperparameterTuningJob


使用以下命令停止 A SageMaker I 中的超参数作业。

```
kubectl delete hyperparametertuningjob xgboost-mnist-hpo
```

此命令从 Kubernetes 集群中移除超参数调整任务和相关的训练作业，并在 AI 中停止它们。 SageMaker 已停止或已完成的任务不会对 SageMaker 人工智能资源产生任何费用。 SageMaker AI 不会删除超参数调整作业。已停止的作业继续显示在 SageMaker AI 控制台上。

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

```
hyperparametertuningjob.sagemaker.aws.amazon.com "xgboost-mnist-hpo" deleted
```

**注意**：删除命令需要大约 2 分钟才能从 SageMaker AI 中清理资源。

## BatchTransformJob 操作员


Batch transform 作业操作员通过在 SageMaker AI 中启动指定的批量转换作业规格来将其与 SageMaker AI 进行协调。您可以在 AI [CreateTransformJob AP SageMaker I 文档](https://docs.amazonaws.cn/sagemaker/latest/dg/API_CreateTransformJob.html)中了解有关 A SageMaker I 批量转换作业的更多信息。

**Topics**
+ [

### BatchTransformJob 使用 YAML 文件创建
](#create-a-batchtransformjob-using-a-simple-yaml-file)
+ [

### BatchTransformJob 使用 Helm Chart 创建
](#create-a-batchtransformjob-using-a-helm-chart)
+ [

### 名单 BatchTransformJobs
](#list-batch-transform-jobs)
+ [

### 描述一个 BatchTransformJob
](#describe-a-batch-transform-job)
+ [

### 查看来自的日志 BatchTransformJobs
](#view-logs-from-batch-transform-jobs)
+ [

### 删除一个 BatchTransformJob
](#delete-a-batch-transform-job)

### BatchTransformJob 使用 YAML 文件创建


1. 使用以下命令下载批量转换作业的示例 YAML 文件：

   ```
   wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/samples/xgboost-mnist-batchtransform.yaml
   ```

1. 编辑文件`xgboost-mnist-batchtransform.yaml`以更改必要的参数，将替换为您的输入数据和 A SageMaker I 执行角色`s3OutputPath`具有写入权限的 Amazon S3 存储桶。`inputdataconfig`

1. 使用以下命令应用 YAML 文件：

   ```
   kubectl apply -f xgboost-mnist-batchtransform.yaml
   ```

### BatchTransformJob 使用 Helm Chart 创建


您可以使用 Helm 图表来运行批量转换作业。

#### 获取 Helm 安装程序目录


使用以下命令克隆 GitHub 存储库以获取源代码：

```
git clone https://github.com/aws/amazon-sagemaker-operator-for-k8s.git
```

#### 配置 Helm 图表


导航到 `amazon-sagemaker-operator-for-k8s/hack/charts/batch-transform-jobs/`文件夹。

编辑`values.yaml`文件以`inputdataconfig`使用您的输入数据替换 OutputPath，将 OutputPath 替换为 SageMaker AI 执行角色具有写入权限的 S3 存储桶。

#### 创建一个 BatchTransformJob


1. 使用以下命令创建批量转换作业：

   ```
   helm install . --generate-name
   ```

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

   ```
   NAME: chart-1574292948
   LAST DEPLOYED: Wed Nov 20 23:35:49 2019
   NAMESPACE: default
   STATUS: deployed
   REVISION: 1
   TEST SUITE: None
   NOTES:
   Thanks for installing the sagemaker-k8s-batch-transform-job.
   ```

1. 要验证是否已成功创建 Helm 图表，请运行以下命令：

   ```
   helm ls
   NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
   chart-1474292948        default         1               2019-11-20 23:35:49.9136092 +0000 UTC   deployed        sagemaker-k8s-batchtransformjob-0.1.0
   chart-1474292948        default         1               2019-11-20 23:35:49.9136092 +0000 UTC   deployed        sagemaker-k8s-hyperparametertuningjob-0.1.0
   chart-1574292948        default         1               2019-11-20 23:35:49.9136092 +0000 UTC   deployed        sagemaker-k8s-trainingjob-0.1.0
   rolebased-1574291698    default         1               2019-11-20 23:14:59.6777082 +0000 UTC   deployed        sagemaker-k8s-operator-0.1.0
   ```

   此命令创建一个 `BatchTransformJob` Kubernetes 资源。操作员在 SageMaker AI 中启动实际的转换任务，并更新 `BatchTransformJob` Kubernetes 资源以反映人工智能中作业的状态。 SageMaker 在工作期间使用的 SageMaker AI 资源会产生费用。作业完成或停止后，您无需支付任何费用。

**注意**： SageMaker AI 不允许您更新正在运行的批处理转换作业。您不能编辑任何参数并重新应用配置文件。您必须更改元数据名称，或删除现有作业并创建新作业。与 Kubeflow 中的 `TFJob` 等现有训练作业 Operator 类似，`update` 不受支持。

### 名单 BatchTransformJobs


使用以下命令列出使用 Kubernetes Operator 创建的所有作业：

```
kubectl get batchtransformjob
```

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

```
NAME                                STATUS      CREATION-TIME          SAGEMAKER-JOB-NAME
xgboost-mnist-batch-transform       Completed   2019-11-18T03:44:00Z   xgboost-mnist-a88fb19809b511eaac440aa8axgboost
```

批量转换作业无论是完成还是失败，都将继续列在列表中。您可以按照 [删除一个 BatchTransformJob](#delete-a-batch-transform-job) 步骤从列表中删除 `hyperparametertuningjob`。已完成或停止的任务不会对 SageMaker 人工智能资源产生任何费用。

#### 批量转换状态值


`STATUS` 字段可以是以下任一值：
+ `Completed` 
+ `InProgress` 
+ `Failed` 
+ `Stopped` 
+ `Stopping` 

这些状态直接来自 SageMaker A [I 官方 API 文档](https://docs.amazonaws.cn/sagemaker/latest/dg/API_DescribeHyperParameterTuningJob.html#SageMaker-DescribeHyperParameterTuningJob-response-HyperParameterTuningJobStatus)。

除了官方 SageMaker 的人工智能身份外，还有可能成`STATUS`为`SynchronizingK8sJobWithSageMaker`。这意味着 Operator 尚未处理该作业。

### 描述一个 BatchTransformJob


您可以使用 `describe` `kubectl` 命令获取调试详细信息。

```
kubectl describe batchtransformjob xgboost-mnist-batch-transform
```

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

```
Name:         xgboost-mnist-batch-transform
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"sagemaker.aws.amazon.com/v1","kind":"BatchTransformJob","metadata":{"annotations":{},"name":"xgboost-mnist","namespace"...
API Version:  sagemaker.aws.amazon.com/v1
Kind:         BatchTransformJob
Metadata:
  Creation Timestamp:  2019-11-18T03:44:00Z
  Finalizers:
    sagemaker-operator-finalizer
  Generation:        2
  Resource Version:  21990924
  Self Link:         /apis/sagemaker.aws.amazon.com/v1/namespaces/default/batchtransformjobs/xgboost-mnist
  UID:               a88fb198-09b5-11ea-ac44-0aa8a9UIDNUM
Spec:
  Model Name:  TrainingJob-20190814SMJOb-IKEB
  Region:      us-east-1
  Transform Input:
    Content Type:  text/csv
    Data Source:
      S 3 Data Source:
        S 3 Data Type:  S3Prefix
        S 3 Uri:        s3://amzn-s3-demo-bucket/mnist_kmeans_example/input
  Transform Job Name:   xgboost-mnist-a88fb19809b511eaac440aa8a9SMJOB
  Transform Output:
    S 3 Output Path:  s3://amzn-s3-demo-bucket/mnist_kmeans_example/output
  Transform Resources:
    Instance Count:  1
    Instance Type:   ml.m4.xlarge
Status:
  Last Check Time:                2019-11-19T22:50:40Z
  Sage Maker Transform Job Name:  xgboost-mnist-a88fb19809b511eaac440aaSMJOB
  Transform Job Status:           Completed
Events:                           <none>
```

### 查看来自的日志 BatchTransformJobs


使用以下命令查看 `xgboost-mnist` 批量转换作业的日志：

```
kubectl smlogs batchtransformjob xgboost-mnist-batch-transform
```

### 删除一个 BatchTransformJob


使用以下命令停止 A SageMaker I 中的批量转换作业。

```
kubectl delete batchTransformJob xgboost-mnist-batch-transform
```

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

```
batchtransformjob.sagemaker.aws.amazon.com "xgboost-mnist" deleted
```

此命令将批量转换任务从 Kubernetes 集群中移除，并在 AI 中将其停止。 SageMaker 已停止或已完成的任务不会对 SageMaker 人工智能资源产生任何费用。删除大约需要 2 分钟才能清除 SageMaker AI 中的资源。

**注意**： SageMaker AI 不会删除批量转换作业。已停止的作业继续显示在 SageMaker AI 控制台上。

## HostingDeployment 操作员


HostingDeployment 操作员支持创建和删除终端节点，以及更新现有端点，以便进行实时推理。托管部署操作员通过在 AI 中创建模型、端点配置和端点，将您指定的托管部署任务规范与 SageMaker AI 进行协调。 SageMaker 您可以在 AI [CreateEndpointAP SageMaker I 文档](https://docs.amazonaws.cn/sagemaker/latest/dg/API_CreateEndpoint.html)中了解有关 A SageMaker I 推断的更多信息。

**Topics**
+ [

### 配置 HostingDeployment 资源
](#configure-a-hostingdeployment-resource)
+ [

### 创建一个 HostingDeployment
](#create-a-hostingdeployment)
+ [

### 名单 HostingDeployments
](#list-hostingdeployments)
+ [

### 描述一个 HostingDeployment
](#describe-a-hostingdeployment)
+ [

### 调用端点
](#invoking-the-endpoint)
+ [

### 更新 HostingDeployment
](#update-hostingdeployment)
+ [

### 删除 HostingDeployment
](#delete-the-hostingdeployment)

### 配置 HostingDeployment 资源


使用以下命令下载托管部署作业的示例 YAML 文件：

```
wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/samples/xgboost-mnist-hostingdeployment.yaml
```

`xgboost-mnist-hostingdeployment.yaml` 文件包含以下组件，可根据需要进行编辑：
+ *ProductionVariants*。 生产变体是为单个模型提供服务的一组实例。 SageMaker 人工智能根据设定的权重在所有生产变体之间进行负载平衡。
+ *模型*。模型是处理模型所必需的容器和执行角色 ARN。它至少需要一个容器。
+ *容器*。容器用于指定数据集和处理映像。如果您使用的是自己的自定义算法而不是 SageMaker AI 提供的算法，则推理代码必须满足 SageMaker AI 要求。有关更多信息，请参阅在 [ SageMaker AI 中使用您自己的算法](https://docs.amazonaws.cn/sagemaker/latest/dg/your-algorithms.html)。

### 创建一个 HostingDeployment


要创建 HostingDeployment，`kubectl`请`hosting.yaml`使用以下命令应用文件：

```
kubectl apply -f hosting.yaml
```

SageMaker AI 使用指定配置创建终端节点。终端节点生命周期内使用的 SageMaker AI 资源会产生费用。一旦端点删除，您就无需支付任何费用。

创建过程大约需要 10 分钟。

### 名单 HostingDeployments


要验证是否 HostingDeployment 已创建，请使用以下命令：

```
kubectl get hostingdeployments
```

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

```
NAME           STATUS     SAGEMAKER-ENDPOINT-NAME
host-xgboost   Creating   host-xgboost-def0e83e0d5f11eaaa450aSMLOGS
```

#### HostingDeployment 状态值


状态字段可以是以下值之一：
+ `SynchronizingK8sJobWithSageMaker`：Operator 正准备创建端点。
+ `ReconcilingEndpoint`：Operator 正在创建、更新或删除端点资源。如果 HostingDeployment 仍处于此状态，`kubectl describe`请使用在`Additional`字段中查看原因。
+ `OutOfService`：端点无法接受传入的请求。
+ `Creating`: [CreateEndpoint](https://docs.amazonaws.cn/sagemaker/latest/dg/API_CreateEndpoint.html)正在运行。
+ `Updating`: [UpdateEndpoint](https://docs.amazonaws.cn/sagemaker/latest/dg/API_UpdateEndpoint.html)或者[UpdateEndpointWeightsAndCapacities](https://docs.amazonaws.cn/sagemaker/latest/dg/API_UpdateEndpointWeightsAndCapacities.html)正在运行。
+ `SystemUpdating`：端点正在进行维护，维护完成之前无法更新、删除或重新扩缩。此维护操作不会更改任何客户指定的值，例如 VPC 配置、 Amazon KMS 加密、模型、实例类型或实例计数。
+ `RollingBack`：端点无法扩展或缩减，也无法更改其变体权重，并且正在回滚到其先前的配置。回滚完成后，端点将返回 `InService` 状态。此过渡状态仅适用于已开启自动缩放功能且在调用过程中或显式[UpdateEndpointWeightsAndCapacities](https://docs.amazonaws.cn/sagemaker/latest/dg/API_UpdateEndpointWeightsAndCapacities.html)调用[UpdateEndpointWeightsAndCapacities](https://docs.amazonaws.cn/sagemaker/latest/dg/API_UpdateEndpointWeightsAndCapacities.html)操作时正在发生变体权重或容量变化的端点。
+ `InService`：该端点可用于处理传入的请求。
+ `Deleting`: [DeleteEndpoint](https://docs.amazonaws.cn/sagemaker/latest/dg/API_DeleteEndpoint.html)正在运行。
+ `Failed`：无法创建、更新或重新扩缩该端点。使用 [DescribeEndpoint：FailureReason](https://docs.amazonaws.cn/sagemaker/latest/dg/API_DescribeEndpoint.html#SageMaker-DescribeEndpoint-response-FailureReason)获取有关故障的信息。 [DeleteEndpoint](https://docs.amazonaws.cn/sagemaker/latest/dg/API_DeleteEndpoint.html)是唯一可以在出现故障的端点上执行的操作。

### 描述一个 HostingDeployment


您可以使用 `describe` `kubectl` 命令获取调试详细信息。

```
kubectl describe hostingdeployment
```

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

```
Name:         host-xgboost
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"sagemaker.aws.amazon.com/v1","kind":"HostingDeployment","metadata":{"annotations":{},"name":"host-xgboost","namespace":"def..."
API Version:  sagemaker.aws.amazon.com/v1
Kind:         HostingDeployment
Metadata:
  Creation Timestamp:  2019-11-22T19:40:00Z
  Finalizers:
    sagemaker-operator-finalizer
  Generation:        1
  Resource Version:  4258134
  Self Link:         /apis/sagemaker.aws.amazon.com/v1/namespaces/default/hostingdeployments/host-xgboost
  UID:               def0e83e-0d5f-11ea-aa45-0a3507uiduid
Spec:
  Containers:
    Container Hostname:  xgboost
    Image:               123456789012.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest
    Model Data URL:      s3://amzn-s3-demo-bucket/inference/xgboost-mnist/model.tar.gz
  Models:
    Containers:
      xgboost
    Execution Role Arn:  arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole
    Name:                xgboost-model
    Primary Container:   xgboost
  Production Variants:
    Initial Instance Count:  1
    Instance Type:           ml.c5.large
    Model Name:              xgboost-model
    Variant Name:            all-traffic
  Region:                    us-east-2
Status:
  Creation Time:         2019-11-22T19:40:04Z
  Endpoint Arn:          arn:aws:sagemaker:us-east-2:123456789012:endpoint/host-xgboost-def0e83e0d5f11eaaaexample
  Endpoint Config Name:  host-xgboost-1-def0e83e0d5f11e-e08f6c510d5f11eaaa450aexample
  Endpoint Name:         host-xgboost-def0e83e0d5f11eaaa450a350733ba06
  Endpoint Status:       Creating
  Endpoint URL:          https://runtime.sagemaker.us-east-2.amazonaws.com/endpoints/host-xgboost-def0e83e0d5f11eaaaexample/invocations
  Last Check Time:       2019-11-22T19:43:57Z
  Last Modified Time:    2019-11-22T19:40:04Z
  Model Names:
    Name:   xgboost-model
    Value:  xgboost-model-1-def0e83e0d5f11-df5cc9fd0d5f11eaaa450aexample
Events:     <none>
```

状态字段使用以下字段提供更多信息：
+ `Additional`：有关托管部署状态的其他消息。此字段为可选字段，只有在出错时才会填入。
+ `Creation Time`: 在 SageMaker AI 中创建端点时。
+ `Endpoint ARN`: SageMaker 人工智能终端节点 ARN。
+ `Endpoint Config Name`: 端点配置的 SageMaker AI 名称。
+ `Endpoint Name`: 端点的 SageMaker AI 名称。
+ `Endpoint Status`：端点的状态。
+ `Endpoint URL`：可用于访问端点的 HTTPS URL。有关更多信息，请参阅[在 SageMaker AI 托管服务上部署模型](https://docs.amazonaws.cn/sagemaker/latest/dg/deploy-model.html)。
+ `FailureReason`：如果创建、更新或删除命令失败，则在此处显示原因。
+ `Last Check Time`：Operator 上次检查端点状态的时间。
+ `Last Modified Time`：上次修改端点的时间。
+ `Model Names`：模型名称与 SageMaker AI HostingDeployment 模型名称的键值对。

### 调用端点


终端节点状态变为后`InService`，您可以通过两种方式调用终端节点：使用 Amazon CLI（执行身份验证和 URL 请求签名），或者使用像 curl 这样的 HTTP 客户端。如果您使用自己的客户端，则需要自己进行 Amazon v4 网址签名和身份验证。

要使用 Amazon CLI 调用终端节点，请运行以下命令。请务必将区域和终端节点名称替换为终端节点的地区和 SageMaker AI 终端节点名称。可以从 `kubectl describe` 的输出中获取此信息。

```
# Invoke the endpoint with mock input data.
aws sagemaker-runtime invoke-endpoint \
  --region us-east-2 \
  --endpoint-name <endpoint name> \
  --body $(seq 784 | xargs echo | sed 's/ /,/g') \
  >(cat) \
  --content-type text/csv > /dev/null
```

例如，如果您的区域为 `us-east-2`，而您的端点配置名称为 `host-xgboost-f56b6b280d7511ea824b129926example`，则以下命令将调用端点：

```
aws sagemaker-runtime invoke-endpoint \
  --region us-east-2 \
  --endpoint-name host-xgboost-f56b6b280d7511ea824b1299example \
  --body $(seq 784 | xargs echo | sed 's/ /,/g') \
  >(cat) \
  --content-type text/csv > /dev/null
4.95847082138
```

此处，`4.95847082138` 是模型对模拟数据的预测值。

### 更新 HostingDeployment


1. 一旦的状态 HostingDeployment 为`InService`，就可以对其进行更新。可能需要大约 10 分钟 HostingDeployment 才能投入使用。要验证状态是否为 `InService`，请使用以下命令：

   ```
   kubectl get hostingdeployments
   ```

1.  HostingDeployment 可以在状态变为之前进行更新`InService`。操作员等到 SageMaker AI 端点出现`InService`后再应用更新。

   要应用更新，请修改 `hosting.yaml` 文件。例如，将 `initialInstanceCount` 字段从 1 更改为 2，如下所示：

   ```
   apiVersion: sagemaker.aws.amazon.com/v1
   kind: HostingDeployment
   metadata:
     name: host-xgboost
   spec:
       region: us-east-2
       productionVariants:
           - variantName: all-traffic
             modelName: xgboost-model
             initialInstanceCount: 2
             instanceType: ml.c5.large
       models:
           - name: xgboost-model
             executionRoleArn: arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole
             primaryContainer: xgboost
             containers:
               - xgboost
       containers:
           - containerHostname: xgboost
             modelDataUrl: s3://amzn-s3-demo-bucket/inference/xgboost-mnist/model.tar.gz
             image: 123456789012.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest
   ```

1. 保存文件，然后使用 `kubectl` 应用更新，如下所示。您应该会看到状态从 `InService` 变为 `ReconcilingEndpoint`，然后变为 `Updating`。

   ```
   $ kubectl apply -f hosting.yaml
   hostingdeployment.sagemaker.aws.amazon.com/host-xgboost configured
   
   $ kubectl get hostingdeployments
   NAME           STATUS                SAGEMAKER-ENDPOINT-NAME
   host-xgboost   ReconcilingEndpoint   host-xgboost-def0e83e0d5f11eaaa450a350abcdef
   
   $ kubectl get hostingdeployments
   NAME           STATUS     SAGEMAKER-ENDPOINT-NAME
   host-xgboost   Updating   host-xgboost-def0e83e0d5f11eaaa450a3507abcdef
   ```

SageMaker AI 会在您的模型中部署一组新实例，将流量切换为使用新实例，并耗尽旧实例。此过程一旦开始，状态就会变为 `Updating`。更新完成后，您的端点变为 `InService`。此过程大约需要 10 分钟。

### 删除 HostingDeployment


1. `kubectl`使用以下命令删除 a HostingDeployment ：

   ```
   kubectl delete hostingdeployments host-xgboost
   ```

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

   ```
   hostingdeployment.sagemaker.aws.amazon.com "host-xgboost" deleted
   ```

1. 要验证是否已删除托管部署，请使用以下命令：

   ```
   kubectl get hostingdeployments
   No resources found.
   ```

已删除的终端节点不会对 SageMaker 人工智能资源产生任何费用。

## ProcessingJob 操作员


ProcessingJob 操作员用于启动 Amazon SageMaker 处理任务。有关 SageMaker 处理作业的更多信息，请参阅[CreateProcessingJob](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateProcessingJob.html)。

**Topics**
+ [

### ProcessingJob 使用 YAML 文件创建
](#kubernetes-processing-job-yaml)
+ [

### 名单 ProcessingJobs
](#kubernetes-processing-job-list)
+ [

### 描述一个 ProcessingJob
](#kubernetes-processing-job-description)
+ [

### 删除一个 ProcessingJob
](#kubernetes-processing-job-delete)

### ProcessingJob 使用 YAML 文件创建


按照以下步骤使用 YAML 文件创建 Amazon SageMaker 处理任务：

1. 下载 `kmeans_preprocessing.py` 预处理脚本。

   ```
   wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/samples/kmeans_preprocessing.py
   ```

1. 在 Amazon Simple Storage Service (Amazon S3) 存储桶中，创建 `mnist_kmeans_example/processing_code` 文件夹，然后将脚本上传到该文件夹。

1. 下载 `kmeans-mnist-processingjob.yaml` 文件。

   ```
   wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/samples/kmeans-mnist-processingjob.yaml
   ```

1. 编辑 YAML 文件以指定您的 `sagemaker-execution-role`，然后将 `amzn-s3-demo-bucket` 的所有实例替换为您的 S3 存储桶。

   ```
   ...
   metadata:
     name: kmeans-mnist-processing
   ...
     roleArn: arn:aws:iam::<acct-id>:role/service-role/<sagemaker-execution-role>
     ...
     processingOutputConfig:
       outputs:
         ...
             s3Output:
               s3Uri: s3://<amzn-s3-demo-bucket>/mnist_kmeans_example/output/
     ...
     processingInputs:
       ...
           s3Input:
             s3Uri: s3://<amzn-s3-demo-bucket>/mnist_kmeans_example/processing_code/kmeans_preprocessing.py
   ```

   `sagemaker-execution-role`必须拥有权限，这样 SageMaker AI 才能代表您访问您的 S3 存储桶 CloudWatch、Amazon 和其他服务。有关创建执行角色的更多信息，请参阅 [SageMaker AI 角色](https://docs.amazonaws.cn/sagemaker/latest/dg/sagemaker-roles.html#sagemaker-roles-createtrainingjob-perms)。

1. 使用以下任一命令应用 YAML 文件。

   对于集群范围的安装：

   ```
   kubectl apply -f kmeans-mnist-processingjob.yaml
   ```

   对于命名空间范围的安装：

   ```
   kubectl apply -f kmeans-mnist-processingjob.yaml -n <NAMESPACE>
   ```

### 名单 ProcessingJobs


使用以下命令之一列出使用该 ProcessingJob 运算符创建的所有作业。 `SAGEMAKER-JOB-NAME `来自 YAML 文件的`metadata`部分。

对于集群范围的安装：

```
kubectl get ProcessingJob kmeans-mnist-processing
```

对于命名空间范围的安装：

```
kubectl get ProcessingJob -n <NAMESPACE> kmeans-mnist-processing
```

您的输出应类似于以下内容：

```
NAME                    STATUS     CREATION-TIME        SAGEMAKER-JOB-NAME
kmeans-mnist-processing InProgress 2020-09-22T21:13:25Z kmeans-mnist-processing-7410ed52fd1811eab19a165ae9f9e385
```

输出将列出所有作业，而不管其状态如何。要从列表中删除作业，请参阅[删除处理作业](https://docs.amazonaws.cn/sagemaker/latest/dg/kubernetes-processing-job-operator.html#kubernetes-processing-job-delete)。

**ProcessingJob 状态**
+ `SynchronizingK8sJobWithSageMaker` - 作业首先提交到集群。Operator 已收到请求，正准备创建处理作业。
+ `Reconciling` - Operator 正在初始化或从暂时性错误中恢复，以及出现其他错误。如果处理作业仍处于此状态，请使用 `kubectl` `describe` 命令在 `Additional` 字段中查看原因。
+ `InProgress | Completed | Failed | Stopping | Stopped`— SageMaker 处理任务的状态。有关更多信息，请参阅 [DescribeProcessingJob](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribeProcessingJob.html#sagemaker-DescribeProcessingJob-response-ProcessingJobStatus)。
+ `Error` - Operator 无法通过协调进行恢复。

已完成、停止或失败的任务不会产生额外的 SageMaker AI 资源费用。

### 描述一个 ProcessingJob


使用以下命令之一获取有关处理作业的更多详细信息。这些命令通常用于调试问题或检查处理作业的参数。

对于集群范围的安装：

```
kubectl describe processingjob kmeans-mnist-processing
```

对于命名空间范围的安装：

```
kubectl describe processingjob kmeans-mnist-processing -n <NAMESPACE>
```

处理作业的输出应类似于以下内容。

```
$ kubectl describe ProcessingJob kmeans-mnist-processing
Name:         kmeans-mnist-processing
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"sagemaker.aws.amazon.com/v1","kind":"ProcessingJob","metadata":{"annotations":{},"name":"kmeans-mnist-processing",...
API Version:  sagemaker.aws.amazon.com/v1
Kind:         ProcessingJob
Metadata:
  Creation Timestamp:  2020-09-22T21:13:25Z
  Finalizers:
    sagemaker-operator-finalizer
  Generation:        2
  Resource Version:  21746658
  Self Link:         /apis/sagemaker.aws.amazon.com/v1/namespaces/default/processingjobs/kmeans-mnist-processing
  UID:               7410ed52-fd18-11ea-b19a-165ae9f9e385
Spec:
  App Specification:
    Container Entrypoint:
      python
      /opt/ml/processing/code/kmeans_preprocessing.py
    Image Uri:  763104351884.dkr.ecr.us-west-2.amazonaws.com/pytorch-training:1.5.0-cpu-py36-ubuntu16.04
  Environment:
    Name:   MYVAR
    Value:  my_value
    Name:   MYVAR2
    Value:  my_value2
  Network Config:
  Processing Inputs:
    Input Name:  mnist_tar
    s3Input:
      Local Path:   /opt/ml/processing/input
      s3DataType:   S3Prefix
      s3InputMode:  File
      s3Uri:        s3://<s3bucket>-us-west-2/algorithms/kmeans/mnist/mnist.pkl.gz
    Input Name:     source_code
    s3Input:
      Local Path:   /opt/ml/processing/code
      s3DataType:   S3Prefix
      s3InputMode:  File
      s3Uri:        s3://<s3bucket>/mnist_kmeans_example/processing_code/kmeans_preprocessing.py
  Processing Output Config:
    Outputs:
      Output Name:  train_data
      s3Output:
        Local Path:    /opt/ml/processing/output_train/
        s3UploadMode:  EndOfJob
        s3Uri:         s3://<s3bucket>/mnist_kmeans_example/output/
      Output Name:     test_data
      s3Output:
        Local Path:    /opt/ml/processing/output_test/
        s3UploadMode:  EndOfJob
        s3Uri:         s3://<s3bucket>/mnist_kmeans_example/output/
      Output Name:     valid_data
      s3Output:
        Local Path:    /opt/ml/processing/output_valid/
        s3UploadMode:  EndOfJob
        s3Uri:         s3://<s3bucket>/mnist_kmeans_example/output/
  Processing Resources:
    Cluster Config:
      Instance Count:     1
      Instance Type:      ml.m5.xlarge
      Volume Size In GB:  20
  Region:                 us-west-2
  Role Arn:               arn:aws:iam::<acct-id>:role/m-sagemaker-role
  Stopping Condition:
    Max Runtime In Seconds:  1800
  Tags:
    Key:    tagKey
    Value:  tagValue
Status:
  Cloud Watch Log URL:             https://us-west-2.console.aws.amazon.com/cloudwatch/home?region=us-west-2#logStream:group=/aws/sagemaker/ProcessingJobs;prefix=kmeans-mnist-processing-7410ed52fd1811eab19a165ae9f9e385;streamFilter=typeLogStreamPrefix
  Last Check Time:                 2020-09-22T21:14:29Z
  Processing Job Status:           InProgress
  Sage Maker Processing Job Name:  kmeans-mnist-processing-7410ed52fd1811eab19a165ae9f9e385
Events:                            <none>
```

### 删除一个 ProcessingJob


删除处理任务时，处理任务将 SageMaker 从 Kubernetes 中移除，但不会从 AI 中删除该作业。 SageMaker 如果 SageMaker AI 中的作业状态为`InProgress`，则作业已停止。处理已停止的作业不会对 SageMaker AI 资源产生任何费用。使用以下命令之一删除处理作业。

对于集群范围的安装：

```
kubectl delete processingjob kmeans-mnist-processing
```

对于命名空间范围的安装：

```
kubectl delete processingjob kmeans-mnist-processing -n <NAMESPACE>
```

处理作业的输出应类似于以下内容。

```
processingjob.sagemaker.aws.amazon.com "kmeans-mnist-processing" deleted
```



**注意**  
SageMaker AI 不会删除处理作业。已停止的作业继续显示在 SageMaker AI 控制台中。该`delete`命令需要几分钟才能从 SageMaker AI 中清理资源。

## HostingAutoscalingPolicy (HAP) 操作员


 HostingAutoscalingPolicy (HAP) 运算符将资源列表 IDs 作为输入，并对每个资源应用相同的策略。每个资源 ID 都是端点名称和变体名称的组合。HAP 操作员执行两个步骤：注册资源， IDs 然后将扩展策略应用于每个资源 ID。 `Delete`撤消这两个动作。您可以将 HAP 应用于现有的 SageMaker AI 终端节点，也可以使用[HostingDeployment 运算符](https://docs.amazonaws.cn/sagemaker/latest/dg/hosting-deployment-operator.html#create-a-hostingdeployment)创建新的 SageMaker AI 终端节点。您可以在[应用程序自动缩放策略文档中阅读有关 SageMaker AI 自动缩放](https://docs.amazonaws.cn/sagemaker/latest/dg/endpoint-auto-scaling.html)的更多信息。

**注意**  
在 `kubectl` 命令中，您可以使用简写形式 `hap` 代替 `hostingautoscalingpolicy`。

**Topics**
+ [

### HostingAutoscalingPolicy 使用 YAML 文件创建
](#kubernetes-hap-job-yaml)
+ [

### 名单 HostingAutoscalingPolicies
](#kubernetes-hap-list)
+ [

### 描述一个 HostingAutoscalingPolicy
](#kubernetes-hap-describe)
+ [

### 更新一个 HostingAutoscalingPolicy
](#kubernetes-hap-update)
+ [

### 删除一个 HostingAutoscalingPolicy
](#kubernetes-hap-delete)
+ [

### 使用以下命令更新或删除终端节点 HostingAutoscalingPolicy
](#kubernetes-hap-update-delete-endpoint)

### HostingAutoscalingPolicy 使用 YAML 文件创建


使用 YAML 文件创建一个 HostingAutoscalingPolicy (HAP)，将预定义或自定义指标应用于一个或多个 SageMaker AI 端点。

Amazon SageMaker AI 需要特定的值才能将自动缩放应用于您的变体。如果未在 YAML 规范中指定这些值，HAP Operator 将应用以下默认值。

```
# Do not change
Namespace                    = "sagemaker"
# Do not change
ScalableDimension            = "sagemaker:variant:DesiredInstanceCount"
# Only one supported
PolicyType                   = "TargetTrackingScaling"
# This is the default policy name but can be changed to apply a custom policy
DefaultAutoscalingPolicyName = "SageMakerEndpointInvocationScalingPolicy"
```

使用以下示例创建 HAP，将预定义或自定义指标应用于一个或多个端点。

#### 示例 1：将预定义指标应用于单个端点变体
应用预定义指标

1. 使用以下命令下载预定义指标的示例 YAML 文件：

   ```
   wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/samples/hap-predefined-metric.yaml
   ```

1. 编辑 YAML 文件以指定您的 `endpointName`、`variantName` 和 `Region`。

1. 使用以下命令之一将预定义指标应用于单个资源 ID（端点名称和变体名称组合）。

   对于集群范围的安装：

   ```
   kubectl apply -f hap-predefined-metric.yaml
   ```

   对于命名空间范围的安装：

   ```
   kubectl apply -f hap-predefined-metric.yaml -n <NAMESPACE>
   ```

#### 示例 2：将自定义指标应用于单个端点变体
应用自定义指标

1. 使用以下命令下载自定义指标的示例 YAML 文件：

   ```
   wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/samples/hap-custom-metric.yaml
   ```

1. 编辑 YAML 文件以指定您的 `endpointName`、`variantName` 和 `Region`。

1. 使用以下命令之一将自定义指标应用于单个资源 ID（端点名称和变体名称组合），以代替推荐的 `SageMakerVariantInvocationsPerInstance`。
**注意**  
Amazon SageMaker AI 不会检查你的 YAML 规范的有效性。

   对于集群范围的安装：

   ```
   kubectl apply -f hap-custom-metric.yaml
   ```

   对于命名空间范围的安装：

   ```
   kubectl apply -f hap-custom-metric.yaml -n <NAMESPACE>
   ```

#### 示例 3：将扩缩策略应用于多个端点和变体
应用扩缩策略

您可以使用 HAP 运算符将相同的扩展策略应用于多个资源 IDs。将为每个资源 ID（端点名称和变体名称组合）创建单独的 `scaling_policy` 请求。

1. 使用以下命令下载预定义指标的示例 YAML 文件：

   ```
   wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/samples/hap-predefined-metric.yaml
   ```

1. 编辑 YAML 文件以指定您的 `Region` 和多个 `endpointName` 和 `variantName` 值。

1. 使用以下命令之一将预定义的指标应用于多个资源 IDs （端点名称和变体名称组合）。

   对于集群范围的安装：

   ```
   kubectl apply -f hap-predefined-metric.yaml
   ```

   对于命名空间范围的安装：

   ```
   kubectl apply -f hap-predefined-metric.yaml -n <NAMESPACE>
   ```

#### 多个端点和变体的注意事项 HostingAutoscalingPolicies
应用扩缩策略的注意事项

当您使用多个资源时，需要考虑以下注意事项 IDs：
+ 如果您对多个资源应用单个策略 IDs，则会为每个资源 ID 创建一个 PolicYarn。五个端点有五个策略ARNs。当您在策略上运行 `describe` 命令时，响应将显示为一项作业并包含单个作业状态。
+ 如果您将自定义指标应用于多个资源 IDs，则所有资源 ID（变体）值将使用相同的维度或值。例如，如果您对实例 1-5 应用客户指标，并且端点变体维度映射到变体 1，则当变体 1 超过指标时，所有端点都会扩展或缩减。
+ HAP 操作员支持更新资源 IDs列表。如果您在规范中修改、添加或删除资源 IDs ，则自动缩放策略将从之前的变体列表中删除，并应用于新指定的资源 ID 组合。使用[https://docs.amazonaws.cn/sagemaker/latest/dg/kubernetes-hap-operator.html#kubernetes-hap-describe](https://docs.amazonaws.cn/sagemaker/latest/dg/kubernetes-hap-operator.html#kubernetes-hap-describe)命令列出当前应用策略的资源 IDs 。

### 名单 HostingAutoscalingPolicies


使用以下命令之一列出使用 HAP 运算符创建的所有 HostingAutoscalingPolicies (HAPs)。

对于集群范围的安装：

```
kubectl get hap
```

对于命名空间范围的安装：

```
kubectl get hap -n <NAMESPACE>
```

您的输出应类似于以下内容：

```
NAME             STATUS   CREATION-TIME
hap-predefined   Created  2021-07-13T21:32:21Z
```

使用以下命令检查您的 HostingAutoscalingPolicy (HAP) 的状态。

```
kubectl get hap <job-name>
```

返回以下值之一：
+ `Reconciling` - 某些类型的错误将状态显示为 `Reconciling` 而不是 `Error`。一些示例包括服务器端错误和处于 `Creating` 或 `Updating` 状态的端点。请查看状态中的 `Additional` 字段或 Operator 日志以了解更多详细信息。
+ `Created`
+ `Error`

**查看您应用策略的自动扩缩端点**

1. 打开 Amazon A SageMaker I 控制台，网址为[https://console.aws.amazon.com/sagemaker/](https://console.amazonaws.cn/sagemaker/)。

1. 在左侧面板中，展开**推理**。

1. 选择**端点**。

1. 选择相关端点的名称。

1. 滚动到**端点运行时设置**部分。

### 描述一个 HostingAutoscalingPolicy


使用以下命令获取有关 a HostingAutoscalingPolicy (HAP) 的更多详细信息。这些命令通常用于调试问题或检查 HAP 的资源 IDs （端点名称和变体名称组合）。

```
kubectl describe hap <job-name>
```

### 更新一个 HostingAutoscalingPolicy


 HostingAutoscalingPolicy (HAP) 运算符支持更新。您可以编辑 YAML 规范以更改值，然后重新应用该策略。HAP Operator 会删除现有策略并应用新策略。

### 删除一个 HostingAutoscalingPolicy


使用以下命令之一删除 HostingAutoscalingPolicy (HAP) 策略。

对于集群范围的安装：

```
kubectl delete hap hap-predefined
```

对于命名空间范围的安装：

```
kubectl delete hap hap-predefined -n <NAMESPACE>
```

此命令会删除扩缩策略并从 Kubernetes 中取消注册扩缩目标。此命令将返回以下输出：

```
hostingautoscalingpolicies.sagemaker.aws.amazon.com "hap-predefined" deleted
```

### 使用以下命令更新或删除终端节点 HostingAutoscalingPolicy
更新或删除端点

要更新具有 HostingAutoscalingPolicy (HAP) 的端点，请使用`kubectl``delete`命令删除 HAP，更新端点，然后重新应用 HAP。

要删除具有 HAP 的端点，请使用 `kubectl` `delete` 命令删除 HAP，然后再删除该端点。

# 将资源迁移到最新 Operator
迁移到最新 Operator

我们将停止对 [Kubernetes SageMaker 操作](https://github.com/aws/amazon-sagemaker-operator-for-k8s/tree/master)员的原始版本的开发和技术支持。

如果您当前使用的是 [Kubernetes SageMaker 操作员版本`v1.2.2`或更](https://github.com/aws/amazon-sagemaker-operator-for-k8s/tree/master)低版本，我们建议您将资源迁移到适用于 Amazon 的 [ACK 服务控制](https://github.com/aws-controllers-k8s/sagemaker-controller)器。 SageMakerACK 服务控制器是基于 Kubernetes 控制[Amazon 器 (ACK) 的新一代 Kuber](https://aws-controllers-k8s.github.io/community/) netes SageMaker 操作员。

有关终止对 Kubernetes SageMaker 操作员原始版本支持的常见问题解答，请参阅 [宣布终止对 Kubernetes SageMaker 人工智能运算符原始版本的支持](kubernetes-sagemaker-operators-eos-announcement.md)

使用以下步骤迁移您的资源，并使用 ACK 通过 Amazon A SageMaker I 训练、调整和部署机器学习模型。

**注意**  
适用于 Kubernetes 的最新 SageMaker 人工智能运算符不向后兼容。

**Topics**
+ [

## 前提条件
](#migrate-resources-to-new-operators-prerequisites)
+ [

## 采用资源
](#migrate-resources-to-new-operators-steps)
+ [

## 清理旧资源
](#migrate-resources-to-new-operators-cleanup)
+ [

## 使用适用于 Kubernetes 的全新 SageMaker AI 运算符
](#migrate-resources-to-new-operators-tutorials)

## 前提条件


要成功将资源迁移到适用于 Kubernetes 的最新 SageMaker 人工智能操作员，您必须执行以下操作：

1. 安装适用于 Kubernet SageMaker es 的最新人工智能运算符。有关 step-by-step说明，请参阅*使用 ACK SageMaker AI 控制器在 Machine Learning* 中进行[设置](https://aws-controllers-k8s.github.io/community/docs/tutorials/sagemaker-example/#setup)。

1. 如果您使用的是 [HostingAutoscalingPolicy 资源](#migrate-resources-to-new-operators-hap)，请安装新的 Application Auto Scaling Operator。有关 step-by-step说明，请参阅[使用 App *lication Auto Scaling 扩展 SageMaker AI 工作负载*中的设置](https://aws-controllers-k8s.github.io/community/docs/tutorials/autoscaling-example/#setup)。如果您不使用 HostingAutoScalingPolicy 资源，则此步骤是可选的。

如果权限配置正确，则 ACK SageMaker AI 服务控制器可以确定资源的规格和状态并协调 Amazon 资源，就像 ACK 控制器最初创建资源一样。

## 采用资源


适用于 Kubernetes 的全新 SageMaker AI 操作员能够采用最初不是由 ACK 服务控制器创建的资源。有关更多信息，请参阅 ACK 文档中的[采用现有 Amazon 资源](https://aws-controllers-k8s.github.io/community/docs/user-docs/adopted-resource/)。

以下步骤展示了适用于 Kubernetes 的新 SageMaker 人工智能运营商如何采用现有 SageMaker 的人工智能终端节点。将以下示例代码另存为名为 `adopt-endpoint-sample.yaml` 的文件。

```
apiVersion: services.k8s.aws/v1alpha1
kind: AdoptedResource
metadata:
  name: adopt-endpoint-sample
spec:  
  aws:
    # resource to adopt, not created by ACK
    nameOrID: xgboost-endpoint
  kubernetes:
    group: sagemaker.services.k8s.aws
    kind: Endpoint
    metadata:
      # target K8s CR name
      name: xgboost-endpoint
```

使用 `kubectl apply` 提交自定义资源 (CR)：

```
kubectl apply -f adopt-endpoint-sample.yaml
```

使用 `kubectl describe` 检查您采用的资源的状态条件。

```
kubectl describe adoptedresource adopt-endpoint-sample
```

验证 `ACK.Adopted` 条件是否为 `True`。该输出应该类似于以下示例：

```
---
kind: AdoptedResource
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: '{"apiVersion":"services.k8s.aws/v1alpha1","kind":"AdoptedResource","metadata":{"annotations":{},"name":"xgboost-endpoint","namespace":"default"},"spec":{"aws":{"nameOrID":"xgboost-endpoint"},"kubernetes":{"group":"sagemaker.services.k8s.aws","kind":"Endpoint","metadata":{"name":"xgboost-endpoint"}}}}'
  creationTimestamp: '2021-04-27T02:49:14Z'
  finalizers:
  - finalizers.services.k8s.aws/AdoptedResource
  generation: 1
  name: adopt-endpoint-sample
  namespace: default
  resourceVersion: '12669876'
  selfLink: "/apis/services.k8s.aws/v1alpha1/namespaces/default/adoptedresources/adopt-endpoint-sample"
  uid: 35f8fa92-29dd-4040-9d0d-0b07bbd7ca0b
spec:
  aws:
    nameOrID: xgboost-endpoint
  kubernetes:
    group: sagemaker.services.k8s.aws
    kind: Endpoint
    metadata:
      name: xgboost-endpoint
status:
  conditions:
  - status: 'True'
    type: ACK.Adopted
```

检查您的资源是否存在于集群中：

```
kubectl describe endpoints.sagemaker xgboost-endpoint
```

### HostingAutoscalingPolicy 资源


`HostingAutoscalingPolicy` (HAP) 资源由多个 Application Auto Scaling 资源组成：`ScalableTarget` 和 `ScalingPolicy`。在 ACK 中采用 HAP 资源时，请先安装 [Application Auto Scaling controller 控制器](https://github.com/aws-controllers-k8s/applicationautoscaling-controller)。要采用 HAP 资源，您需要同时采用 `ScalableTarget` 和 `ScalingPolicy` 资源。您可以在 `HostingAutoscalingPolicy` 资源的状态 (`status.ResourceIDList`) 中找到这些资源的资源标识符。

### HostingDeployment 资源


该`HostingDeployment`资源由多个 SageMaker AI 资源组成：`Endpoint``EndpointConfig`、和每个`Model`。如果您在 ACK 中采用 A SageMaker I 端点，则需要`Model`分别采用`Endpoint``EndpointConfig`、和。可在 `HostingDeployment` 资源的状态（`status.endpointName`、`status.endpointConfigName` 和 `status.modelNames`）中找到 `Endpoint`、`EndpointConfig` 和 `Model` 名称。

有关所有支持的 SageMaker AI 资源的列表，请参阅 [ACK API 参考](https://aws-controllers-k8s.github.io/community/reference/)。

## 清理旧资源


在适用于 Kubernetes 的新 SageMaker AI 操作员采用您的资源后，您可以卸载旧的运算符并清理旧资源。

### 步骤 1：卸载旧 Operator


要卸载旧 Operator，请参阅[删除 Operator](kubernetes-sagemaker-operators-end-of-support.md#delete-operators)。

**警告**  
删除任何旧资源之前，请先卸载旧 Operator。

### 第 2 步：删除终结器并删除旧资源


**警告**  
删除旧资源之前，请确保已卸载旧 Operator。

卸载旧 Operator 后，必须明确删除终结器才能删除旧 Operator 资源。以下示例脚本显示如何删除给定命名空间中由旧 Operator 管理的所有训练作业。新 Operator 采用其他资源后，您可以使用类似的模式删除这些资源。

**注意**  
必须使用完整的资源名称才能获取资源。例如，使用 `kubectl get trainingjobs.sagemaker.aws.amazon.com` 而不是 `kubectl get trainingjob`。

```
namespace=sagemaker_namespace
training_jobs=$(kubectl get trainingjobs.sagemaker.aws.amazon.com -n $namespace -ojson | jq -r '.items | .[] | .metadata.name')
 
for job in $training_jobs
do
    echo "Deleting $job resource in $namespace namespace"
    kubectl patch trainingjobs.sagemaker.aws.amazon.com $job -n $namespace -p '{"metadata":{"finalizers":null}}' --type=merge
    kubectl delete trainingjobs.sagemaker.aws.amazon.com $job -n $namespace
done
```

## 使用适用于 Kubernetes 的全新 SageMaker AI 运算符


有关使用适用于 Kubernetes 的全新 SageMaker AI 运算符的深入指南，请参阅 [为 Kubernetes 使用 SageMaker 人工智能运算符](kubernetes-sagemaker-operators-ack.md#kubernetes-sagemaker-operators-ack-use)

# 宣布终止对 Kubernetes SageMaker 人工智能运算符原始版本的支持
终止支持常见问题

本页面宣布终止对适用于 [Kubernetes 的 SageMaker AI Oper](https://github.com/aws/amazon-sagemaker-operator-for-k8s) ators 原始版本的支持，并提供了常见问题的答案以及有关 Amazon A [ SageMaker I 的 ACK 服务控制器的迁移信息，Amazon A](https://github.com/aws-controllers-k8s/sagemaker-controller) I 是新一代完全支持的 Kubernetes SageMaker 人工智能运营商。有关适用于 Kubernetes 的新 SageMaker AI 运算符的一般信息，请参阅。[适用于 Kubernetes 的最新 SageMaker 人工智能运算符](kubernetes-sagemaker-operators-ack.md)

## 终止支持常见问题
终止支持常见问题

**Topics**
+ [

### 为什么我们要终止对 Kubernetes SageMaker 人工智能运算符原始版本的支持？
](#kubernetes-sagemaker-operators-eos-faq-why)
+ [

### 在哪里可以找到有关适用于 Kubernetes 和 ACK 的全新 SageMaker AI 运算符的更多信息？
](#kubernetes-sagemaker-operators-eos-faq-more)
+ [

### 终止支持 (EOS) 是什么意思？
](#kubernetes-sagemaker-operators-eos-faq-definition)
+ [

### 如何将我的工作负载迁移到适用于 Kubernetes 的全新 SageMaker AI 操作员进行训练和推理？
](#kubernetes-sagemaker-operators-eos-faq-how)
+ [

### 我应该迁移到哪个版本的 ACK？
](#kubernetes-sagemaker-operators-eos-faq-version)
+ [

### Kubernetes 的初始 SageMaker 人工智能运算符和新的运营商（Amazon A SageMaker I 的 ACK 服务控制器）在功能上是否相同？
](#kubernetes-sagemaker-operators-eos-faq-parity)

### 为什么我们要终止对 Kubernetes SageMaker 人工智能运算符原始版本的支持？


用户现在可以利用[适用于 Amazon A SageMaker I 的 ACK 服务控制器](https://github.com/aws-controllers-k8s/sagemaker-controller)。ACK 服务控制器是新一代适用于 Kubernetes SageMaker 的人工智能操作员，基于 Kubernetes [Amazon 控制器 (ACK)，这是一个针对生产进行了优化的社区驱动项目，它标准化了通过 Kubernetes](https://aws-controllers-k8s.github.io/community/) 运营商公开服务的方式。 Amazon 因此，我们宣布终止对 Kubernetes [ SageMaker 人工智能运算符](https://github.com/aws/amazon-sagemaker-operator-for-k8s)原始版本（非基于 ACK）的支持 (EOS)。该支持将于 **2023 年 2 月 15 日**连同 [Amazon Elastic Kubernetes Service Kubernetes 1.21](https://docs.amazonaws.cn/eks/latest/userguide/kubernetes-versions.html#kubernetes-release-calendar) 一起终止。

有关 ACK 的更多信息，请参阅 [ACK 历史和原则](https://aws-controllers-k8s.github.io/community/docs/community/background/)。

### 在哪里可以找到有关适用于 Kubernetes 和 ACK 的全新 SageMaker AI 运算符的更多信息？

+ 有关适用于 Kubernetes 的全新 SageMaker AI 运算符的更多信息，请参阅适用于 A [mazon A SageMaker I GitHub 存储库的 ACK 服务控制器或阅读适用于](https://github.com/aws-controllers-k8s/sagemaker-controller) Kubernetes [的Amazon 控制器文档](https://aws-controllers-k8s.github.io/community/docs/community/overview/)。
+ 有关如何使用 Amazon EKS 使用适用于 Amazon A SageMaker I 的 ACK 服务控制器训练机器学习模型的教程，请参阅此 [SageMaker AI 示例](https://aws-controllers-k8s.github.io/community/docs/tutorials/sagemaker-example/)。

  有关自动缩放的示例，请参阅[使用 Application Auto Scaling 扩展 SageMaker AI 工作负载](https://aws-controllers-k8s.github.io/community/docs/tutorials/autoscaling-example/)。
+ 有关 Amazon Controller for Kubernetes (ACK) 的信息，请参阅 [Amazon Controllers for Kubernetes](https://aws-controllers-k8s.github.io/community/) (ACK) 文档。
+ 有关支持的 SageMaker AI 资源列表，请参阅 [ACK API 参考](https://aws-controllers-k8s.github.io/community/reference/)。

### 终止支持 (EOS) 是什么意思？


虽然用户可以继续使用他们当前的运营商，但我们不再为运营商开发新功能，也不会针对发现的任何问题发布任何补丁或安全更新。 `v1.2.2`是 [Kubernetes SageMaker 人工智能运算符的最后](https://github.com/aws/amazon-sagemaker-operator-for-k8s/tree/master)一个版本。用户应将其工作负载迁移到使用[适用于 Amazon A SageMaker I 的 ACK 服务控制器](https://github.com/aws-controllers-k8s/sagemaker-controller)。

### 如何将我的工作负载迁移到适用于 Kubernetes 的全新 SageMaker AI 操作员进行训练和推理？


有关将资源从旧版迁移到新版 Kubernetes SageMaker 人工智能运算符的信息，请访问。[将资源迁移到最新 Operator](kubernetes-sagemaker-operators-migrate.md)

### 我应该迁移到哪个版本的 ACK？


用户应迁移到最新发布的[适用于 Amazon A SageMaker I 的 ACK 服务控制器](https://github.com/aws-controllers-k8s/sagemaker-controller/tags)版本。

### Kubernetes 的初始 SageMaker 人工智能运算符和新的运营商（Amazon A SageMaker I 的 ACK 服务控制器）在功能上是否相同？


是，它们具有同等的功能。

两个版本之间一些主要显著差异包括：
+ 基于 ACK 的 SageMaker AI 运营商在 Kubernetes 上使用的自定义资源定义 (CRD) 遵循 Amazon API 定义，因此它与 Kubernetes SageMaker 人工智能运营商在原始版本中的自定义资源规范不兼容。请参阅新控制器[CRDs](https://github.com/aws-controllers-k8s/sagemaker-controller/tree/main/helm/crds)中的或使用迁移指南来采用资源并使用新控制器。
+ 该`Hosting Autoscaling`策略不再是适用于 Kubernetes 的新 SageMaker AI Operators 的一部分，并且已迁移到[应用程序自动](https://github.com/aws-controllers-k8s/applicationautoscaling-controller)缩放 ACK 控制器中。要了解如何使用应用程序自动缩放控制器在 A SageMaker I 端点上配置自动缩放，请按照此[自动](https://aws-controllers-k8s.github.io/community/docs/tutorials/autoscaling-example/)缩放示例进行操作。
+ `HostingDeployment` 资源用于在一个 CRD 中创建模型、端点配置和端点。适用于 Kubernetes 的全新 SageMaker AI 操作员每种资源都有单独的 CRD。

# SageMaker Kubeflow 管道的人工智能组件


借助 Kubeflow Pipelines 的 SageMaker AI 组件，你可以从 Kubeflow Pipelines 中创建和监控原生 SageMaker AI 训练、调整、端点部署和批量转换作业。通过在 SageMaker AI 上运行 Kubeflow Pipeline 作业，您可以将数据处理和训练作业从 Kubernetes 集群转移到 SageMaker 人工智能经过机器学习优化的托管服务。本文档假设您事先了解 Kubernetes 和 Kubeflow。

**Topics**
+ [

## 什么是 Kubeflow Pipelines？
](#what-is-kubeflow-pipelines)
+ [

## 什么是 Kubeflow Pipelines 组件？
](#kubeflow-pipeline-components)
+ [

## 为什么要在 Kubeflow 管道中使用 SageMaker 人工智能组件？
](#why-use-sagemaker-components)
+ [

## SageMaker 适用于 Kubeflow 管道版本的 AI 组件
](#sagemaker-components-versions)
+ [

## Kubeflow 管道 SageMaker 的人工智能组件清单
](#sagemaker-components-list)
+ [

## IAM 权限
](#iam-permissions)
+ [

## 将管道转换为使用 SageMaker AI
](#converting-pipelines-to-use-amazon-sagemaker)
+ [

# 安装 Kubeflow Pipelines
](kubernetes-sagemaker-components-install.md)
+ [

# 使用 SageMaker AI 组件
](kubernetes-sagemaker-components-tutorials.md)

## 什么是 Kubeflow Pipelines？


Kubeflow Pipelines (KFP) 是一个基于 Docker 容器构建和部署便携式、可扩展的机器学习 (ML) 工作流的平台。Kubeflow Pipelines 平台由以下各项组成：
+ 用于管理和跟踪实验、作业和运行的用户界面 (UI)。
+ 用于计划多步骤机器学习工作流的引擎 (Argo)。
+ 用于定义和操作管道和组件的 SDK。
+ 用于使用 SDK 与系统交互的笔记本。

管道是对以[有向无环图](https://www.kubeflow.org/docs/pipelines/concepts/graph/)形式表示的机器学习工作流的描述。工作流程中的每个步骤都表示为 Kubeflow Pipeline [组件](https://www.kubeflow.org/docs/pipelines/overview/concepts/component/)，它是一个 适用于 Python (Boto3) 的 Amazon SDK 模块。

有关 Kubeflow Pipelines 的更多信息，请参阅 [Kubeflow Pipelines 文档](https://www.kubeflow.org/docs/pipelines/)。

## 什么是 Kubeflow Pipelines 组件？


Kubeflow Pipelines 组件是一组用于执行 Kubeflow 管道中一个步骤的代码。组件由 Docker 映像中内置的 Python 模块表示。当管道运行时，组件的容器将在运行 Kubeflow 的 Kubernetes 集群中的一个工作线程节点上实例化，然后执行您的逻辑。管道组件可以读取先前组件的输出，并创建管道中下一个组件可以使用的输出。利用这些组件可以快速轻松地为实验和生产环境编写管道，而无需与底层 Kubernetes 基础设施进行交互。

你可以在 Kubeflow 管道中使用 SageMaker 人工智能组件。您只需使用 Kubeflow Pipelines SDK 加载组件并描述管道，而无需在自定义容器中封装逻辑。管道运行时，您的指令将转换为 A SageMaker I 任务或部署。然后，工作负载在完全托管的 SageMaker AI 基础架构上运行。

## 为什么要在 Kubeflow 管道中使用 SageMaker 人工智能组件？
为什么要使用 SageMaker AI 组件？

SageMaker Kubeflow Pipelines 的 AI 组件为从 AI 启动计算密集型作业提供了另一种选择。 SageMaker 这些组件将 SageMaker 人工智能与 Kubeflow Pipelines 的可移植性和编排集成在一起。使用适用于 Kubeflow Pipelines 的 SageMaker AI 组件，你可以创建和监控你的 SageMaker AI 资源，这是 Kubeflow Pipelines 工作流程的一部分。管道中的每个任务都在 SageMaker AI 上运行，而不是在本地 Kubernetes 集群上运行，这样您就可以利用关键的 SageMaker AI 功能，例如数据标签、大规模超参数调整和分布式训练作业，或者一键式安全且可扩展的模型部署。仍然可以从 Kubeflow Pipelines 用户界面访问 SageMaker 来自 AI 的作业参数、状态、日志和输出。

从准备数据到构建、训练和部署机器学习模型， SageMaker A SageMaker I 组件将关键 AI 功能集成到您的机器学习工作流程中。您可以创建完全使用这些组件构建的 Kubeflow Pipelines，也可以根据需要将单个组件集成到工作流中。这些组件有一种或两个版本。组件的每个版本都利用不同的后端。有关这些版本的更多信息，请参阅 [SageMaker 适用于 Kubeflow 管道版本的 AI 组件](#sagemaker-components-versions)。

在 Kubeflow 流水线上使用 SageMaker 人工智能组件无需支付额外费用。通过这些组件使用的任何 SageMaker AI 资源都将产生费用。

## SageMaker 适用于 Kubeflow 管道版本的 AI 组件
SageMaker AI 组件版本

SageMaker Kubeflow 流水线的 AI 组件有两个版本。每个版本都利用不同的后端在 SageMaker AI 上创建和管理资源。
+ Kubeflow Pipelines 版本 1（v1.x 或更低版本）的 SageMaker AI 组件使用 **[Boto](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html)** 3 () 作为后端。适用于 Python (Boto3) 的 Amazon SDK
+ [适用于 Kubeflow Pipelines SageMaker 的人工智能组件版本 2（v2.0.0-alpha2 及更高版本）使用 SageMaker 适用于 Kubernetes 的人工智能运算符 (ACK)。](https://github.com/aws-controllers-k8s/sagemaker-controller)

  Amazon 引入 [ACK](https://aws-controllers-k8s.github.io/community/) 是为了简化 Kubernetes 原生的云资源管理方式。 Amazon ACK 包括一组 Amazon 特定于服务的控制器，其中一个是 SageMaker AI 控制器。 SageMaker 人工智能控制器使使用 Kubernetes 作为控制平面的机器学习开发人员和数据科学家可以更轻松地在 AI 中训练、调整和部署机器学习 (ML) 模型。 SageMaker 如需了解更多信息，请参阅适用于 [Kubernet SageMaker es 的人工智能运算符](https://aws-controllers-k8s.github.io/community/docs/tutorials/sagemaker-example/) 

Kubeflow 流水线的 SageMaker AI 组件的两个版本都受支持。但是，版本 2 还提供了一些额外的优势。具体而言，它提供：

1. 无论您使用的是 Kubeflow 管道、Kubernetes CLI `kubectl` () 还是其他 Kubeflow 应用程序（例如笔记本），都可以通过任何应用程序管理 SageMaker 人工智能资源的一致体验。

1. 可以灵活地在 Kubeflow 管道工作流程之外管理和监控 SageMaker AI 资源。

1. 如果您在 Amazon发布时部署了完整的 [Kubeflow](https://awslabs.github.io/kubeflow-manifests/docs/about/)，则使用 SageMaker AI 组件的设置时间为零，因为 SageMaker AI 操作员是其部署的一部分。

## Kubeflow 管道 SageMaker 的人工智能组件清单
SageMaker AI 组件清单

以下是 Kubeflow Pipelines 的所有 SageMaker AI 组件及其可用版本的列表。或者，你可以在中找到 [Kubeflow 管道的所有 SageMaker AI 组件](https://github.com/kubeflow/pipelines/tree/master/components/aws/sagemaker#versioning)。 GitHub

**注意**  
我们鼓励用户在任何可用的 A SageMaker I 组件版本2中使用该组件。

### Ground Truth 组件

+ **Ground Truth**

  Ground Truth 组件允许你直接从 Kubeflow Pipelines 工作流程中提交 SageMaker AI Ground Truth 标签作业。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/sagemaker/latest/dg/kubernetes-sagemaker-components-for-kubeflow-pipelines.html)
+ **工作团队**

  Workteam 组件允许你直接从 Kubeflow Pipelines 工作流程创建 SageMaker AI 私有工作团队作业。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/sagemaker/latest/dg/kubernetes-sagemaker-components-for-kubeflow-pipelines.html)

### 数据处理组件

+ **Processing**

  处理组件使您可以直接从 Kubeflow Pipelines 工作流程向 SageMaker AI 提交处理任务。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/sagemaker/latest/dg/kubernetes-sagemaker-components-for-kubeflow-pipelines.html)

### 训练组件

+ **训练**

  训练组件允许您直接从 Kubeflow Pipelines 工作流程提交 SageMaker 训练作业。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/sagemaker/latest/dg/kubernetes-sagemaker-components-for-kubeflow-pipelines.html)
+ **超参数优化**

  超参数优化组件使您可以直接从 Kubeflow Pipelines 工作流程向 SageMaker AI 提交超参数调整任务。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/sagemaker/latest/dg/kubernetes-sagemaker-components-for-kubeflow-pipelines.html)

### 推理组件

+ **托管部署**

  托管组件允许您使用 Kubeflow Pipelines 工作流程中的 SageMaker AI 托管服务部署模型。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/sagemaker/latest/dg/kubernetes-sagemaker-components-for-kubeflow-pipelines.html)
+ **批量转换**

  Batch Transform 组件允许你通过 Kubeflow Pipelines 工作流程在 SageMaker AI 中为整个数据集运行推理作业。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/sagemaker/latest/dg/kubernetes-sagemaker-components-for-kubeflow-pipelines.html)
+ **Model Monitor**

  模型监视器组件允许您通过 Kubeflow Pipelines 工作流程监控生产中的 SageMaker AI 机器学习模型的质量。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/sagemaker/latest/dg/kubernetes-sagemaker-components-for-kubeflow-pipelines.html)

## IAM 权限


使用 SageMaker AI 组件部署 Kubeflow Pipelines 需要以下三层身份验证：
+ 一个 IAM 角色，授予您的网关节点（可以是本地计算机，也可以是远程实例）访问 Amazon Elastic Kubernetes Service (Amazon EKS) 集群的权限。

  访问网关节点的用户代入此角色，以便：
  + 创建 Amazon EKS 集群并安装 KFP
  + 创建 IAM 角色
  + 为您的示例输入数据创建 Amazon S3 存储桶

  该角色需要以下权限：
  + CloudWatchLogsFullAccess 
  + [https://console.amazonaws.cn/iam/home?region=us-east-1#/policies/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FAWSCloudFormationFullAccess](https://console.amazonaws.cn/iam/home?region=us-east-1#/policies/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FAWSCloudFormationFullAccess) 
  + IAMFull访问权限
  + 亚马逊 3 FullAccess
  + Amazon EC2 FullAccess
  + 亚马逊EKSAdmin政策（使用 A [mazon EKS 基于身份的策略示例中的架构创建此策略](https://docs.amazonaws.cn/eks/latest/userguide/security_iam_id-based-policy-examples.html)） 
+ Kubernetes IAM 执行角色由 Kubernetes 管道容器 (**kfp-example-pod-role**) 或 Kubernetes 控制器容器的 SageMaker AI 操作员担任，用于访问 AI。 SageMaker 此角色用于创建和监控来自 Kubernet SageMaker es 的人工智能作业。

  该角色需要以下权限：
  + AmazonSageMakerFullAccess 

  您可以通过创建和附加自己的自定义策略来限制 KFP 和控制器 Pod 的权限。
+  SageMaker 人工智能任务承担的 AI IAM 执行角色， Amazon 用于访问诸如 Amazon S3 或 Amazon ECR（**kfp-example-sagemaker-execution-** role）之类的资源。 SageMaker 

  SageMaker AI 工作使用此角色来：
  + 访问 SageMaker AI 资源
  + 从 Amazon S3 输入数据
  + 将输出模型存储到 Amazon S3

  该角色需要以下权限：
  + AmazonSageMakerFullAccess 
  + 亚马逊 3 FullAccess 

## 将管道转换为使用 SageMaker AI


您可以通过移植通用 Python [处理容器和[训练容](https://docs.amazonaws.cn/sagemaker/latest/dg/your-algorithms-training-algo.html)器](https://docs.amazonaws.cn/sagemaker/latest/dg/amazon-sagemaker-containers.html)，将现有管道转换为使用 SageMaker AI。如果您使用 SageMaker AI 进行推理，则还需要将 IAM 权限附加到集群并将构件转换为模型。

# 安装 Kubeflow Pipelines


[Kubeflow Pipelines (KFP)](https://www.kubeflow.org/docs/components/pipelines/v2/introduction/) 是 Kubeflow 的管道编排组件。

您可以在现有 Amazon Elastic Kubernetes Service (Amazon EKS) 上部署 Kubeflow Pipelines (KFP)，也可以创建新的 Amazon EKS 集群。使用网关节点与您的集群进行交互。网关节点可以是您的本地计算机，也可以是 Amazon EC2 实例。

以下部分将指导您完成设置和配置这些资源的步骤。

**Topics**
+ [

## 选择安装选项
](#choose-install-option)
+ [

## 配置您的管道权限以访问 SageMaker AI
](#configure-permissions-for-pipeline)
+ [

## 访问 KFP UI（Kubeflow 控制面板）
](#access-the-kfp-ui)

## 选择安装选项


Kubeflow Pipelines 可用作 Kubeflow 完整发行版的核心组件， Amazon 也可以作为独立安装使用。

选择适用于您的使用案例的选项：

1. [部署时已完成 Kubeflow Amazon](#full-kubeflow-deployment)

   要使用 Kubeflow Pipelines 之外的其他 Kubeflow 组件，请选择完整的 [Kubeflow on Amazon 分发版](https://awslabs.github.io/kubeflow-manifests)部署。

1. [独立 Kubeflow Pipelines 部署](#kubeflow-pipelines-standalone)

   要在不使用 Kubeflow 其他组件的情况下使用 Kubeflow Pipelines，请独立安装 Kubeflow Pipelines。

### 部署时已完成 Kubeflow Amazon


要在上安装 Kubeflow 的完整版本 Amazon，请从部署[指南上的 Kubeflow 中选择普通 Amazon 部署](https://awslabs.github.io/kubeflow-manifests/docs/deployment/)选项或任何其他支持与各种服务（ Amazon 亚马逊 S3、亚马逊 RDS、亚马逊 Cognito）集成的部署选项。

### 独立 Kubeflow Pipelines 部署


本节假设您的用户有权创建角色并为该角色定义策略。

#### 设置网关节点


您可以使用本地计算机或 Amazon EC2 实例作为网关节点。网关节点用于创建 Amazon EKS 集群并访问 Kubeflow Pipelines UI。

完成以下步骤以设置节点。

1. 

**创建网关节点。**

   您可以使用现有 Amazon EC2 实例，也可以按照[启动和配置 DLAMI](https://docs.amazonaws.cn/dlami/latest/devguide/launch-config.html) 中的步骤使用最新 Ubuntu 18.04 DLAMI 版本创建一个新实例。

1. 

**创建 IAM 角色以授予网关节点对 Amazon 资源的访问权限。**

   创建具有以下资源权限的 IAM 角色： CloudWatch、、IAM、Amazon EC2 Amazon CloudFormation、Amazon S3、Amazon EKS。

   将以下策略附加到 IAM 角色：
   + CloudWatchLogsFullAccess 
   + [https://console.amazonaws.cn/iam/home?region=us-east-1#/policies/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FAWSCloudFormationFullAccess](https://console.amazonaws.cn/iam/home?region=us-east-1#/policies/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FAWSCloudFormationFullAccess)
   + IAMFull访问权限 
   + 亚马逊 3 FullAccess 
   + Amazon EC2 FullAccess 
   + 亚马逊EKSAdmin政策（使用 A [mazon EKS 基于身份的策略示例中的架构创建此策略](https://docs.amazonaws.cn/eks/latest/userguide/security_iam_id-based-policy-examples.html)） 

   有关将 IAM 权限添加到 IAM 角色的信息，请参阅[添加和删除 IAM 身份权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

1. 

**安装以下工具和客户端**

   在您的网关节点上安装和配置以下工具和资源，以访问 Amazon EKS 集群和 KFP 用户界面 (UI)。
   + [Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/cli-chap-install.html)：用于处理 Amazon 服务的命令行工具。有关 Amazon CLI 配置信息，请参阅[配置 Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/cli-chap-configure.html)。
   + [aws-iam-authenticator](https://docs.amazonaws.cn/eks/latest/userguide/install-aws-iam-authenticator.html)0.1.31 及更高版本：一种使用 Amazon IAM 凭证对 Kubernetes 集群进行身份验证的工具。
   + [https://docs.amazonaws.cn/eks/latest/userguide/eksctl.html](https://docs.amazonaws.cn/eks/latest/userguide/eksctl.html) 0.15 以上的版本：用于处理 Amazon EKS 集群的命令行工具。
   + [https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl)：用于与 Kubernetes 集群一起使用的命令行工具。该版本需要在一个次要版本中与您的 Kubernetes 版本相匹配。
   + [https://www.amazonaws.cn/sdk-for-python/](https://www.amazonaws.cn/sdk-for-python/).

     ```
     pip install boto3
     ```

#### 设置 Amazon EKS 集群


1. 如果您没有现有 Amazon EKS 集群，请在网关节点的命令行中运行以下步骤，否则请跳过此步骤。

   1. 运行以下命令创建 1.17 或更高版本的 Amazon EKS 集群。将 `<clustername>` 替换为您的任何集群名称。

      ```
      eksctl create cluster --name <clustername> --region us-east-1 --auto-kubeconfig --timeout=50m --managed --nodes=1
      ```

   1. 集群创建完成后，通过列出集群的节点来确保您可以访问集群。

      ```
      kubectl get nodes
      ```

1. 使用以下命令确保当前 `kubectl` 上下文指向您的集群。当前上下文在输出中以星号 (\$1) 标记。

   ```
   kubectl config get-contexts
   
   CURRENT NAME     CLUSTER
   *   <username>@<clustername>.us-east-1.eksctl.io   <clustername>.us-east-1.eksctl.io
   ```

1. 如果所需的集群未配置为当前的默认集群，请使用以下命令更新默认集群。

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

#### 安装 Kubeflow Pipelines


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

1. 安装所有 [cert-manager 组件](https://cert-manager.io/docs/installation/kubectl/)。

   ```
   kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.yaml
   ```

1. 安装 Kubeflow Pipelines。

   ```
   export PIPELINE_VERSION=2.0.0-alpha.5
   kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/env/cert-manager/cluster-scoped-resources?ref=$KFP_VERSION"
   kubectl wait --for condition=established --timeout=60s crd/applications.app.k8s.io
   kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/env/cert-manager/dev?ref=$KFP_VERSION"
   ```

1. 确保 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
   ```

## 配置您的管道权限以访问 SageMaker AI


在本节中，您将创建一个 IAM 执行角色，授予 Kubeflow Pipeline 容器对 SageMaker AI 服务的访问权限。

### SageMaker AI 组件版本 2 的配置


要运行适用于 Kubeflow Pipelines 的 SageMaker AI 组件版本 2，你需要安装适用于 K [ubernetes 的 SageMaker AI Operator](https://github.com/aws-controllers-k8s/sagemaker-controller) 并配置基于角色的访问控制 (RBAC)，允许 Kubeflow Pipelines pod 在你的 Kubernetes 集群中创建 AI 自定义资源。 SageMaker 

**重要**  
如果您使用的是 Kubeflow Pipelines 独立部署，请按照本节进行操作。如果你使用的是 Kubeflow 版本 1.6.0-aws-b1.0.0 或更高版本的 Amazon 发行版，那么人工智能组件版本 2 已经设置好了。 SageMaker 

1. 安装适用于 Kubernetes 的 SageMaker AI Operator 以使用 SageMaker 人工智能组件版本 2。

   按照使用 [ACK SageMaker AI 控制器的 Machine Learning 教程](https://aws-controllers-k8s.github.io/community/docs/tutorials/sagemaker-example/#setup)中的*设置*部分进行操作。

1. 为 Kubeflow Pipelines Pod 使用的执行角色（服务账号）配置 RBAC 权限。在 Kubeflow Pipelines 独立部署中，使用 `pipeline-runner` 服务账号在命名空间 `kubeflow` 中执行管道运行。

   1. 创建一个 [RoleBinding](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-example)，向服务帐号授予管理 SageMaker AI 自定义资源的权限。

      ```
      cat > manage_sagemaker_cr.yaml <<EOF
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
      name: manage-sagemaker-cr  
      namespace: kubeflow
      subjects:
      - kind: ServiceAccount
      name: pipeline-runner
      namespace: kubeflow
      roleRef:
      kind: ClusterRole
      name: ack-sagemaker-controller 
      apiGroup: rbac.authorization.k8s.io
      EOF
      ```

      ```
      kubectl apply -f manage_sagemaker_cr.yaml
      ```

   1. 确保 RoleBinding 是通过运行以下命令创建：

      ```
      kubectl get rolebinding manage-sagemaker-cr -n kubeflow -o yaml
      ```

### SageMaker AI 组件版本 1 的配置


要运行适用于 Kubeflow Pipelines 的 SageMaker AI 组件版本 1，Kubeflow Pipeline 容器需要访问人工智能。 SageMaker 

**重要**  
无论你是在 Amazon 部署时使用完整的 Kubeflow 还是独立的 Kubeflow Pilepines，都要遵循本节。

要创建授予 Kubeflow 管道容器访问 A SageMaker I 的 IAM 执行角色，请按照以下步骤操作：

1. 导出您的集群名称（例如 *my-cluster-name*）和集群区域（例如 us-ea *st-1*）。

   ```
   export CLUSTER_NAME=my-cluster-name
   export CLUSTER_REGION=us-east-1
   ```

1. 根据您的安装导出命名空间和服务账户名称。
   + 要在 Amazon 安装时获得完整的 Kubeflow，请将您的配置文件`namespace`（例如 *kubeflow-user-example-com*）和*默认编辑器导*出为服务账号。

     ```
     export NAMESPACE=kubeflow-user-example-com
     export KUBEFLOW_PIPELINE_POD_SERVICE_ACCOUNT=default-editor
     ```
   + 要独立部署 Pipelines，请将 *kubeflow* 导出为 `namespace`，将 *pipeline-runner* 导出为服务账户。

     ```
     export NAMESPACE=kubeflow
     export KUBEFLOW_PIPELINE_POD_SERVICE_ACCOUNT=pipeline-runner
     ```

1. 使用以下命令创建[适用于 Amazon EKS 集群的 IAM OIDC 提供商](https://docs.amazonaws.cn/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)。

   ```
   eksctl utils associate-iam-oidc-provider --cluster ${CLUSTER_NAME} \
               --region ${CLUSTER_REGION} --approve
   ```

1. 为 KFP 容器创建一个 IAM 执行角色以访问 Amazon 服务 (SageMaker AI、 CloudWatch)。

   ```
   eksctl create iamserviceaccount \
   --name ${KUBEFLOW_PIPELINE_POD_SERVICE_ACCOUNT} \
   --namespace ${NAMESPACE} --cluster ${CLUSTER_NAME} \
   --region ${CLUSTER_REGION} \
   --attach-policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess \
   --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchLogsFullAccess \
   --override-existing-serviceaccounts \
   --approve
   ```

[将管道权限配置为访问 SageMaker AI 组件版本 1 后，请按照 Kubeflow 上的 Kubeflow 管道 SageMaker 人工智能组件指南中的文档进行操作。 Amazon](https://awslabs.github.io/kubeflow-manifests/docs/amazon-sagemaker-integration/sagemaker-components-for-kubeflow-pipelines/)

## 访问 KFP UI（Kubeflow 控制面板）


Kubeflow Pipelines UI 用于管理和跟踪集群上的实验、作业和运行。有关如何从网关节点访问 Kubeflow Pipelines UI 的说明，请按照本节中适用于您的部署选项的步骤进行操作。

### 部署时已完成 Kubeflow Amazon


按照[Amazon 网站上 Kubeflow 上的](https://awslabs.github.io/kubeflow-manifests/docs/deployment/connect-kubeflow-dashboard/)说明连接到 Kubeflow 控制面板并导航到 “管道” 选项卡。

### 独立 Kubeflow Pipelines 部署


按照以下步骤使用端口转发从您的网关节点访问 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
   ```

1. 运行以下命令以设置到 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
     ```

  1. 选择**管道**以访问管道 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}
     ```

  1. 在浏览器中访问控制面板。

     ```
     http://localhost:9000
     ```

  1. 选择**管道**以访问 KFP UI。

#### （可选）授予 SageMaker AI 笔记本实例访问 Amazon EKS 的权限，并从您的笔记本运行 KFP 管道。


 SageMaker 笔记本实例是运行 Jupyter 笔记本应用程序的完全托管的 Amazon EC2 计算实例。您可以使用笔记本实例来创建和管理 Jupyter 笔记本，然后使用 适用于 Python (Boto3) 的 Amazon SDK 或 KFP CLI 定义、编译、部署和运行 KFP 管道。

1. 按照创建[ SageMaker 笔记本实例中的步骤创建您的笔记本实](https://docs.amazonaws.cn/sagemaker/latest/dg/gs-setup-working-env.html)例，然后将`S3FullAccess`策略附加到其 IAM 执行角色。

1. 在网关节点的命令行中，运行以下命令以检索您创建的笔记本实例的 IAM 角色 ARN。将 `<instance-name>` 替换为实例的名称。

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

   此命令将输出采用 `arn:aws:iam::<account-id>:role/<role-name>` 格式的 IAM 角色 ARN。记下此 ARN。

1. 运行此命令将以下策略（Amazon AmazonSageMakerFullAccess EKSWorker NodePolicy、AmazonS3FullAccess）附加到此 IAM 角色。将 `<role-name>` 替换为 ARN 中的 `<role-name>`。

   ```
   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
   ```

1. Amazon EKS 集群使用 IAM 角色来控制对集群的访问权限。这些规则是在名为 `aws-auth` 的配置映射中实施。`eksctl` 提供了读取和编辑 `aws-auth` 配置映射的命令。只有有权访问集群的用户才能编辑此配置映射。

   `system:masters` 是具有集群超级用户权限的默认用户组之一。将您的用户添加到此组，或创建具有更严格权限的组。

1. 运行以下命令以将角色绑定到您的集群。将 `<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>
   ```

1. 在你的 SageMaker AI 实例上打开 Jupyter 笔记本并运行以下命令以确保它可以访问集群。

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

# 使用 SageMaker AI 组件


在本教程中，您将使用适用于 Kubeflow Pipelines 的 SageMaker AI 组件运行管道，在 AI 上使用 Kmeans 和 MNIST 数据集训练分类模型。 SageMaker 该工作流程使用 Kubeflow Pipelines 作为协调器，并使用 SageMaker AI 来执行工作流程的每个步骤。该示例取自现有的 [ SageMaker AI 示例](https://github.com/aws/amazon-sagemaker-examples/blob/8279abfcc78bad091608a4a7135e50a0bd0ec8bb/sagemaker-python-sdk/1P_kmeans_highlevel/kmeans_mnist.ipynb)，并进行了修改以与 Kubeflow P SageMaker ipelines 的 AI 组件配合使用。

你可以使用 Python 定义管道， 适用于 Python (Boto3) 的 Amazon SDK 然后使用 KFP 控制面板、KFP CLI 或 Boto3 来编译、部署和运行工作流程。[Kubeflow GitHub 存储库](https://github.com/kubeflow/pipelines/tree/master/samples/contrib/aws-samples/mnist-kmeans-sagemaker#mnist-classification-with-kmeans)中提供了 MNIST 分类管道示例的完整代码。要使用该代码，请将 Python 文件克隆到您的网关节点。

你可以在上找到更多 [ SageMaker AI Kubeflow Pipelines 示例](https://github.com/kubeflow/pipelines/tree/master/samples/contrib/aws-samples)。 GitHub有关所用组件的信息，请参阅 Pipelin [KubeFlow es GitHub 存储库](https://github.com/kubeflow/pipelines/tree/master/components/aws/sagemaker)。

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

## 创建 A SageMaker I 执行角色


I `kfp-example-sagemaker-execution-role` AM 角色是 A SageMaker I 作业担任的访问 Amazon 资源的运行时角色。在以下命令中，您可以创建名为的 IAM 执行角色`kfp-example-sagemaker-execution-role`，附加两个托管策略（AmazonSageMakerFullAccessAmazonS3FullAccess），并与 A SageMaker I 建立信任关系以授予 SageMaker AI 任务访问这些 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'
```

## 部署时已完成 Kubeflow Amazon


按照 [K-Means 分类的 MNIST SageMaker 训练管道教程中的说明进行](https://awslabs.github.io/kubeflow-manifests/docs/amazon-sagemaker-integration/sagemaker-components-for-kubeflow-pipelines/)操作。

## 独立 Kubeflow Pipelines 部署


### 准备数据集


要运行管道，您需要将数据提取预处理脚本上传到 Amazon S3 存储桶。此存储桶和本示例的所有资源必须位于 `us-east-1` 区域。有关创建存储桶的信息，请参阅[创建存储桶](https://docs.amazonaws.cn/AmazonS3/latest/gsg/CreatingABucket.html)。

从您在网关节点上克隆的 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 文档](https://www.kubeflow.org/docs/pipelines/sdk/install-sdk/)中的说明安装 KFP SDK。

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

   ```
   pip show kfp
   ```

1. 验证是否已正确安装 `dsl-compile`，如下所示：

   ```
   which dsl-compile
   ```

#### 编译管道


您可以通过三种方式与 Kubeflow Pipelines 进行交互：KFP UI、KFP CLI 或 KFP SDK。以下几节说明了使用 KFP UI 和 CLI 的工作流。

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

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

1. 使用命令行中的 `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
   ...
   ...
   ```

1. 使用以下命令创建运行。KFP CLI 运行命令目前不支持在创建运行时指定输入参数。在编译之前，您需要更新 适用于 Python (Boto3) 的 Amazon SDK 管道文件中的参数。将 `<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 |
   +--------------------------------------+--------+----------+---------------------------+
   ```

1. 导航到 UI 以检查作业的进度。

#### 使用 KFP UI 上传并运行管道


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

1. **在右上角，选择 \$1。UploadPipeline**

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

1. 选择**上传文件**，然后输入您使用 CLI 或使用 适用于 Python (Boto3) 的 Amazon SDK创建的 tar.gz 文件的路径。

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

1. 找到您创建的管道。

1. 选择 **\$1CreateRun**。

1. 输入您的输入参数。

1. 选择**运行**。

### 运行预测


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

#### 配置运行预测的权限


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

**要使用任何其他计算机运行预测，请为客户端计算机使用的 IAM 角色分配 `sagemaker:InvokeEndpoint` 权限。**

1. 在您的网关节点上，运行以下命令以创建 IAM 策略文件：

   ```
   cat <<EoF > ./sagemaker-invoke.json
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "sagemaker:InvokeEndpoint"
               ],
               "Resource": "*"
           }
       ]
   }
   EoF
   ```

1. 将策略附加到客户端节点的 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`的 适用于 Python (Boto3) 的 Amazon SDK 文件。替换 `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)
   ```

1. 按如下方式运行该 适用于 Python (Boto3) 的 Amazon SDK 文件：

   ```
   python mnist-predictions.py
   ```

### 查看结果和日志


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

如果成功处理了 KFP 请求并创建了 A SageMaker I 作业，KFP UI 中的组件日志将提供指向在 AI 中 SageMaker 创建的任务的链接。如果任务成功创建，还会提供 CloudWatch 日志。

如果您在同一集群上运行过多管道作业，则可能会看到一条错误消息，表明您没有足够的 Pod 可用。要解决此问题，请登录您的网关节点，然后删除由您未使用的管道创建的 Pod：

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

### 清理


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

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

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

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

1. 使用您的 Amazon 帐户登录 A SageMaker I 服务。手动停止所有训练、批量转换和 HPO 作业。删除模型、数据存储桶和端点，以免产生任何额外费用。终止管道运行并不能停止 SageMaker AI 中的作业。

# SageMaker 笔记本职位
Notebook Jobs

您可以使用 Amazon SageMaker AI 在任何环境中通过 Jupyter 笔记本以交互方式构建、训练和部署机器学习模型。 JupyterLab 但是，在许多场景中，您可能希望将笔记本作为非交互式计划作业运行。例如，您可能想要创建定期审计报告，以分析在特定时间范围内运行的所有训练作业，并分析将这些模型部署到生产环境中所带来的业务价值。或者，在对一小部得分据子集进行数据转换逻辑测试后，您可能想扩展特征工程作业。其他常见使用案例包括：
+ 计划作业以进行模型偏差监控
+ 探索参数空间以获得更好的模型

在这些场景中，您可以使用 SageMaker Notebook Jobs 创建非交互式作业（ SageMaker AI 将其作为底层训练作业运行），以按需运行或按计划运行。 SageMaker Notebook Jobs 提供了直观的用户界面，因此您可以 JupyterLab 通过选择笔记本中的 “笔记本作业” 控件 (![\[Blue icon of a calendar with a checkmark, representing a scheduled task or event.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/icons/notebook-schedule.png)) 直接安排作业。您还可以使用 SageMaker AI Python SDK 安排作业，该软件包提供了在管道工作流程中安排多个笔记本作业的灵活性。您可以并行运行多个笔记本，并对笔记本中的单元格进行参数化以自定义输入参数。

此功能利用了 Amazon EventBridge、Tra SageMaker ining 和 Pipelines 服务，可在以下任何环境下的 Jupyter 笔记本中使用：
+ Studio、Studio Lab、Studio Classic 或笔记本实例
+ 本地设置，例如您运行的本地计算机 JupyterLab

**先决条件**

要计划笔记本作业，请确保满足以下条件：
+ 确保您的 Jupyter 笔记本以及所有初始化或启动脚本在代码和软件包方面都是独立的。否则，您的非交互式作业可能会出现错误。
+ 查看[约束和注意事项](notebook-auto-run-constraints.md)以确保正确配置了 Jupyter 笔记本、网络设置和容器设置。
+ 确保您的笔记本可以访问所需的外部资源，如 Amazon EMR 集群。
+ 如果您正在本地 Jupyter 笔记本中设置笔记本作业，请完成安装。有关说明，请参阅[安装指南](scheduled-notebook-installation.md)。
+ 如果您在笔记本中连接到 Amazon EMR 集群，并且希望对 Amazon EMR 连接命令进行参数化，则必须应用一种解决方法，使用环境变量来传递参数。有关更多信息，请参阅 [从笔记本连接到 Amazon EMR 集群](scheduled-notebook-connect-emr.md)。
+ 如果您使用 Kerberos、LDAP 或 HTTP 基本身份验证连接到 Amazon EMR 集群，则必须使用将您的安全证书传递 Amazon Secrets Manager 给您的 Amazon EMR 连接命令。有关更多信息，请参阅 [从笔记本连接到 Amazon EMR 集群](scheduled-notebook-connect-emr.md)。
+ （可选）如果您想让 UI 预加载脚本以在笔记本启动时运行，则您的管理员必须使用生命周期配置 (LCC) 进行安装。有关如何使用 LCC 脚本的信息，请参阅[使用生命周期配置脚本自定义笔记本实例](https://docs.amazonaws.cn/sagemaker/latest/dg/notebook-lifecycle-config.html)。

# 安装指南


以下内容提供了有关在您的 JupyterLab 环境中使用笔记本作业所需的安装内容的信息。

**适用于亚马逊 SageMaker Studio 和亚马逊 SageMaker Studio 实验室**

如果您的笔记本电脑在 Amazon SageMaker Studio 或 Amazon SageMaker Studio Lab 中，则无需进行额外安装，因为平台内置了SageMaker 笔记本作业。要设置 Studio 所需的权限，请参阅[为 Studio 设置策略和权限](scheduled-notebook-policies-studio.md)。

**对于本地 Jupyter 笔记本**

如果要在本地 JupyterLab 环境中使用 SageMaker Notebook Jobs，则需要执行其他安装。

要安装 SageMaker 笔记本作业，请完成以下步骤：

1. 安装 Python 3。有关详细信息，请参阅[安装 Python 3 和 Python 程序包](https://www.codecademy.com/article/install-python3)。

1. 安装 JupyterLab 版本 4 或更高版本。有关详细信息，请参阅 [JupyterLab SDK 文档](https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html)。

1. 安装 Amazon CLI。有关详细信息，请参阅[安装或更新 Amazon CLI的最新版本](https://docs.amazonaws.cn/cli/latest/userguide/getting-started-install.html)。

1. 安装两组权限。IAM 用户需要权限才能向 A SageMaker I 提交作业，提交后，笔记本作业本身将扮演一个 IAM 角色，该角色需要根据任务访问资源的权限。

   1. 如果您尚未创建 IAM 用户，请参阅[在您的 Amazon 账户中创建 IAM 用户](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_users_create.html)。

   1. 如果您尚未创建笔记本作业角色，请参阅[创建向 IAM 用户委派权限的角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_create_for-user.html)。

   1. 附加必要的权限和信任策略以附加到您的用户和角色。有关 step-by-step说明和权限的详细信息，请参阅[为本地 Jupyter 环境安装策略和权限](scheduled-notebook-policies-other.md)。

1. 为您新创建的 IAM 用户生成 Amazon 证书，并将其保存在您环境的证书文件（\$1/.aws/credentions）中。 JupyterLab 可以使用 CLI 命令 `aws configure` 执行此操作。有关说明，请参阅[配置和凭证文件设置](https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-files.html)中的*使用命令设置和查看配置设置*部分。

1. （可选）默认情况下，调度器扩展使用带有 Python 2.0 的预构建的 SageMaker AI Docker 镜像。笔记本中使用的任何非默认内核都应安装在容器中。如果要在容器或 Docker 映像中运行笔记本，则需要创建 Amazon Elastic Container Registry (Amazon ECR) 映像。有关如何将 Docker 映像推送到 Amazon ECR 的信息，请参阅[推送 Docker 映像](https://docs.amazonaws.cn/AmazonECR/latest/userguide/docker-push-ecr-image.html)。

1. 为 SageMaker 笔记本作业添加 JupyterLab 扩展程序。您可以使用命令将其添加到您的 JupyterLab环境中:`pip install amazon_sagemaker_jupyter_scheduler`。您可能需要使用 `sudo systemctl restart jupyter-server` 命令重新启动 Jupyter 服务器。

1. 从命令 JupyterLab 开始:`jupyter lab`.

1. 验证 Jupyter 笔记本任务栏中显示了 Notebook Jobs 小部件 (![\[Blue icon of a calendar with a checkmark, representing a scheduled task or event.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/icons/notebook-schedule.png))。

# 为 Studio 设置策略和权限


在安排首次运行笔记本之前，您需要安装适当的策略和权限。以下是设置以下权限的说明：
+ 作业执行角色信任关系
+ 附加到作业执行角色的其他 IAM 权限
+ （可选）使用自定义 KMS 密钥的 Amazon KMS 权限策略

**重要**  
如果您的 Amazon 账户属于具有服务控制策略 (SCP) 的组织，则您的有效权限是您的 IAM 角色 SCPs 和用户策略允许的内容与允许的权限之间的逻辑交叉点。例如，如果您组织的 SCP 规定您只能访问 `us-east-1` 和 `us-west-1` 中的资源，而您的策略仅允许访问 `us-west-1` 和 `us-west-2` 中的资源，那么最终您只能访问 `us-west-1` 中的资源。如果您想行使角色和用户策略中允许的所有权限，则您的组织 SCPs 应授予与您自己的 IAM 用户和角色策略相同的权限集。有关如何确定允许的请求的详细信息，请参阅[确定是允许还是拒绝账户内的请求](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow)。

**信任关系**

要修改信任关系，请完成以下步骤：

1. 打开 [IAM 控制台](https://console.amazonaws.cn/iam/)。

1. 在左侧面板中选择**角色**。

1. 找到笔记本作业的作业执行角色并选择角色名称。

1. 选择**信任关系**选项卡。

1. 选择**编辑信任策略**。

1. 复制并粘贴以下策略：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "sagemaker.amazonaws.com"
               },
               "Action": "sts:AssumeRole"
           },
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "events.amazonaws.com"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

1. 选择**更新策略**。

## 其他 IAM 权限


在以下情况下，您可能需要包括其他 IAM 权限：
+ 您的 Studio 执行角色和笔记本作业角色不同
+ 您需要通过 S3 VPC 端点访问 Amazon S3 资源
+ 您想使用自定义 KMS 密钥来加密输入和输出 Amazon S3 存储桶

以下讨论提供了每种情况所需的策略。

### 如果您的 Studio 执行角色和笔记本作业角色不同，则需要相应权限


以下 JSON 代码片段是一个示例策略，如果不将 Studio 执行角色用作笔记本作业角色，则应将其添加到 Studio 执行角色和笔记本作业角色中。如果需要进一步限制权限，请查看并修改此策略。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":"iam:PassRole",
         "Resource":"arn:aws:iam::*:role/*",
         "Condition":{
            "StringLike":{
               "iam:PassedToService":[
                  "sagemaker.amazonaws.com",
                  "events.amazonaws.com"
               ]
            }
         }
      },
      {
         "Effect":"Allow",
         "Action":[
            "events:TagResource",
            "events:DeleteRule",
            "events:PutTargets",
            "events:DescribeRule",
            "events:PutRule",
            "events:RemoveTargets",
            "events:DisableRule",
            "events:EnableRule"
         ],
         "Resource":"*",
         "Condition":{
            "StringEquals":{
               "aws:ResourceTag/sagemaker:is-scheduling-notebook-job":"true"
            }
         }
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:CreateBucket",
            "s3:PutBucketVersioning",
            "s3:PutEncryptionConfiguration"
         ],
         "Resource":"arn:aws:s3:::sagemaker-automated-execution-*"
      },
      {
            "Sid": "S3DriverAccess",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::sagemakerheadlessexecution-*"
            ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "sagemaker:ListTags"
         ],
         "Resource":[
            "arn:aws:sagemaker:*:*:user-profile/*",
            "arn:aws:sagemaker:*:*:space/*",
            "arn:aws:sagemaker:*:*:training-job/*",
            "arn:aws:sagemaker:*:*:pipeline/*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "sagemaker:AddTags"
         ],
         "Resource":[
            "arn:aws:sagemaker:*:*:training-job/*",
            "arn:aws:sagemaker:*:*:pipeline/*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "ec2:DescribeDhcpOptions",
            "ec2:DescribeNetworkInterfaces",
            "ec2:DescribeRouteTables",
            "ec2:DescribeSecurityGroups",
            "ec2:DescribeSubnets",
            "ec2:DescribeVpcEndpoints",
            "ec2:DescribeVpcs",
            "ecr:BatchCheckLayerAvailability",
            "ecr:BatchGetImage",
            "ecr:GetDownloadUrlForLayer",
            "ecr:GetAuthorizationToken",
            "s3:ListBucket",
            "s3:GetBucketLocation",
            "s3:GetEncryptionConfiguration",
            "s3:PutObject",
            "s3:DeleteObject",
            "s3:GetObject",
            "sagemaker:DescribeApp",
            "sagemaker:DescribeDomain",
            "sagemaker:DescribeUserProfile",
            "sagemaker:DescribeSpace",
            "sagemaker:DescribeStudioLifecycleConfig",
            "sagemaker:DescribeImageVersion",
            "sagemaker:DescribeAppImageConfig",
            "sagemaker:CreateTrainingJob",
            "sagemaker:DescribeTrainingJob",
            "sagemaker:StopTrainingJob",
            "sagemaker:Search",
            "sagemaker:CreatePipeline",
            "sagemaker:DescribePipeline",
            "sagemaker:DeletePipeline",
            "sagemaker:StartPipelineExecution"
         ],
         "Resource":"*"
      }
   ]
}
```

------

### 通过 S3 VPC 端点访问 Amazon S3 资源所需的权限


如果您在私有 VPC 模式下运行 SageMaker Studio 并通过 S3 VPC 终端节点访问 S3，则可以向 VPC 终端节点策略添加权限以控制可通过 VPC 终端节点访问哪些 S3 资源。将以下权限添加到 VPC 端点策略。如果需要进一步限制权限，则可以修改策略，例如可以为 `Principal` 字段提供更严格的规范。

```
{
    "Sid": "S3DriverAccess",
    "Effect": "Allow",
    "Principal": "*",
    "Action": [
        "s3:GetBucketLocation",
        "s3:GetObject",
        "s3:ListBucket"
    ],
    "Resource": "arn:aws:s3:::sagemakerheadlessexecution-*"
}
```

有关如何设置 S3 VPC 端点策略的详细信息，请参阅[编辑 VPC 端点策略](https://docs.amazonaws.cn/vpc/latest/privatelink/vpc-endpoints-s3.html#edit-vpc-endpoint-policy-s3)。

### 使用自定义 KMS 密钥时所需的权限（可选）


默认情况下，输入和输出 Amazon S3 存储桶使用服务器端加密进行加密，但您可以指定自定义 KMS 密钥来加密输出 Amazon S3 存储桶和附加到笔记本作业的存储卷中的数据。

如果您想使用自定义 KMS 密钥，请附加以下策略并提供您自己的 KMS 密钥 ARN。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
         "Effect":"Allow",
         "Action":[
            "kms:Encrypt",
            "kms:Decrypt",
            "kms:ReEncrypt*",
            "kms:GenerateDataKey*",
            "kms:DescribeKey",
            "kms:CreateGrant"
         ],
         "Resource":"arn:aws:kms:us-east-1:111122223333:key/key-id"
      }
   ]
}
```

------

# 为本地 Jupyter 环境安装策略和权限


您需要设置必要的权限和策略，以便在本地 Jupyter 环境中安排笔记本作业。IAM 用户需要权限才能向 A SageMaker I 提交作业，而笔记本作业本身承担的 IAM 角色需要访问资源的权限，具体视任务而定。下面将说明如何设置必要的权限和策略。

您需要安装两套权限。下图显示了在本地 Jupyter 环境中安排笔记本作业的权限结构。IAM 用户需要设置 IAM 权限才能向 A SageMaker I 提交任务。用户提交笔记本作业后，作业本身将代入一个 IAM 角色，该角色需要根据作业任务获得资源访问权限。

![\[\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/notebook-jobs-permissions.png)


以下几节将帮助您为 IAM 用户和作业执行角色安装必要的策略和权限。

## IAM 用户权限


**向 SageMaker AI 提交任务的权限**

要添加提交作业的权限，请完成以下步骤：

1. 打开 [IAM 控制台](https://console.amazonaws.cn/iam/)。

1. 在左侧面板中选择**用户**。

1. 找到您的笔记本作业的 IAM 用户并选择用户名。

1. 选择**添加权限**，然后从下拉菜单中选择**创建内联策略**。

1. 选择 **JSON** 选项卡。

1. 复制并粘贴以下策略：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "EventBridgeSchedule",
               "Effect": "Allow",
               "Action": [
                   "events:TagResource",
                   "events:DeleteRule",
                   "events:PutTargets",
                   "events:DescribeRule",
                   "events:EnableRule",
                   "events:PutRule",
                   "events:RemoveTargets",
                   "events:DisableRule"
               ],
               "Resource": "*",
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceTag/sagemaker:is-scheduling-notebook-job": "true"
                   }
               }
           },
           {
               "Sid": "IAMPassrole",
               "Effect": "Allow",
               "Action": "iam:PassRole",
               "Resource": "arn:aws:iam::*:role/*",
               "Condition": {
                   "StringLike": {
                       "iam:PassedToService": [
                           "sagemaker.amazonaws.com",
                           "events.amazonaws.com"
                       ]
                   }
               }
           },
           {
               "Sid": "IAMListRoles",
               "Effect": "Allow",
               "Action": "iam:ListRoles",
               "Resource": "*"
           },
           {
               "Sid": "S3ArtifactsAccess",
               "Effect": "Allow",
               "Action": [
                   "s3:PutEncryptionConfiguration",
                   "s3:CreateBucket",
                   "s3:PutBucketVersioning",
                   "s3:ListBucket",
                   "s3:PutObject",
                   "s3:GetObject",
                   "s3:GetEncryptionConfiguration",
                   "s3:DeleteObject",
                   "s3:GetBucketLocation"
               ],
               "Resource": [
                   "arn:aws:s3:::sagemaker-automated-execution-*"
               ]
           },
           {
               "Sid": "S3DriverAccess",
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket",
                   "s3:GetObject",
                   "s3:GetBucketLocation"
               ],
               "Resource": [
                   "arn:aws:s3:::sagemakerheadlessexecution-*"
               ]
           },
           {
               "Sid": "SagemakerJobs",
               "Effect": "Allow",
               "Action": [
                   "sagemaker:DescribeTrainingJob",
                   "sagemaker:StopTrainingJob",
                   "sagemaker:DescribePipeline",
                   "sagemaker:CreateTrainingJob",
                   "sagemaker:DeletePipeline",
                   "sagemaker:CreatePipeline"
               ],
               "Resource": "*",
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceTag/sagemaker:is-scheduling-notebook-job": "true"
                   }
               }
           },
           {
               "Sid": "AllowSearch",
               "Effect": "Allow",
               "Action": "sagemaker:Search",
               "Resource": "*"
           },
           {
               "Sid": "SagemakerTags",
               "Effect": "Allow",
               "Action": [
                   "sagemaker:ListTags",
                   "sagemaker:AddTags"
               ],
               "Resource": [
                   "arn:aws:sagemaker:*:*:pipeline/*",
                   "arn:aws:sagemaker:*:*:space/*",
                   "arn:aws:sagemaker:*:*:training-job/*",
                   "arn:aws:sagemaker:*:*:user-profile/*"
               ]
           },
           {
               "Sid": "ECRImage",
               "Effect": "Allow",
               "Action": [
                   "ecr:GetAuthorizationToken",
                   "ecr:BatchGetImage"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

**Amazon KMS 权限策略（可选）**

默认情况下，输入和输出 Amazon S3 存储桶使用服务器端加密进行加密，但您可以指定自定义 KMS 密钥来加密输出 Amazon S3 存储桶和附加到笔记本作业的存储卷中的数据。

如果要使用自定义 KMS 密钥，请重复前面的说明，附加以下策略，并提供自己的 KMS 密钥 ARN。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
         "Effect":"Allow",
         "Action":[
            "kms:Encrypt",
            "kms:Decrypt",
            "kms:ReEncrypt*",
            "kms:GenerateDataKey*",
            "kms:DescribeKey",
            "kms:CreateGrant"
         ],
         "Resource":"arn:aws:kms:us-east-1:111122223333:key/key-id"
      }
   ]
}
```

------

## 作业执行角色权限


**信任关系**

要修改作业执行角色信任关系，请完成以下步骤：

1. 打开 [IAM 控制台](https://console.amazonaws.cn/iam/)。

1. 在左侧面板中选择**角色**。

1. 找到笔记本作业的作业执行角色并选择角色名称。

1. 选择**信任关系**选项卡。

1. 选择**编辑信任策略**。

1. 复制并粘贴以下策略：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": [
                       "sagemaker.amazonaws.com",
                       "events.amazonaws.com"
                   ]
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

**其他权限**

提交后，笔记本作业需要访问资源的权限。以下说明向您介绍如何添加一组最低限度的权限。如果需要，您可根据笔记本作业的需求添加更多权限。要为作业执行角色添加权限，请完成以下步骤：

1. 打开 [IAM 控制台](https://console.amazonaws.cn/iam/)。

1. 在左侧面板中选择**角色**。

1. 找到笔记本作业的作业执行角色并选择角色名称。

1. 选择**添加权限**，然后从下拉菜单中选择**创建内联策略**。

1. 选择 **JSON** 选项卡。

1. 复制并粘贴以下策略：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "PassroleForJobCreation",
               "Effect": "Allow",
               "Action": "iam:PassRole",
               "Resource": "arn:aws:iam::*:role/*",
               "Condition": {
                   "StringLike": {
                       "iam:PassedToService": "sagemaker.amazonaws.com"
                   }
               }
           },
           {
               "Sid": "S3ForStoringArtifacts",
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject",
                   "s3:GetObject",
                   "s3:ListBucket",
                   "s3:GetBucketLocation"
               ],
               "Resource": "arn:aws:s3:::sagemaker-automated-execution-*"
           },
           {
               "Sid": "S3DriverAccess",
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket",
                   "s3:GetObject",
                   "s3:GetBucketLocation"
               ],
               "Resource": [
                   "arn:aws:s3:::sagemakerheadlessexecution-*"
               ]
           },
           {
               "Sid": "SagemakerJobs",
               "Effect": "Allow",
               "Action": [
                   "sagemaker:StartPipelineExecution",
                   "sagemaker:CreateTrainingJob"
               ],
               "Resource": "*"
           },
           {
               "Sid": "ECRImage",
               "Effect": "Allow",
               "Action": [
                   "ecr:GetDownloadUrlForLayer",
                   "ecr:BatchGetImage",
                   "ecr:GetAuthorizationToken",
                   "ecr:BatchCheckLayerAvailability"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 添加对笔记本作业访问的其他资源的权限。

1. 选择**查看策略**。

1. 输入策略的名称。

1. 选择**创建策略**。

# 在哪里可以创建笔记本作业


如果您想创建笔记本作业，您有多种选择。以下内容为您提供了用于创建笔记本作业的 SageMaker AI 选项。

您可以在 Studio 用户界面的 JupyterLab 笔记本中创建作业，也可以使用 SageMaker Python SDK 以编程方式创建作业：
+ 如果在 Studio UI 中创建笔记本作业，提供有关映像和内核、安全配置以及任何自定义变量或脚本的详细信息，作业就会被调度。有关如何使用 SageMaker 笔记本作业安排作业的详细信息，请参阅[在 Studio 中创建笔记本作业](create-notebook-auto-run-studio.md)。
+ 要使用 SageMaker Python SDK 创建笔记本作业，您可以创建一个带有 Notebook Job 步骤的管道并启动按需运行，或者可以选择使用管道调度功能来安排未来的运行。S SageMaker DK 使您可以灵活地自定义管道——您可以将管道扩展到包含多个笔记本作业步骤的工作流程。由于您同时创建了 SageMaker Notebook Job 步骤和管道，因此您可以在 SageMaker Notebook Job 作业控制面板中跟踪管道执行状态，也可以在 Studio 中查看工作流图。有关如何使用 SageMaker Python SDK 安排任务的详细信息以及指向示例笔记本的链接，请参阅[使用 SageMaker AI Python SDK 示例创建笔记本作业](create-notebook-auto-run-sdk.md)。

# 使用 SageMaker AI Python SDK 示例创建笔记本作业


要使用 SageMaker Python SDK 运行独立笔记本，您需要创建一个 Notebook Job 步骤，将其附加到管道中，然后使用 Pipelines 提供的实用程序按需运行作业，或者可以选择安排一个或多个未来的作业。以下各节介绍了创建按需或计划笔记本作业以及跟踪运行的基本步骤。此外，如果需要向笔记本作业传递参数或在笔记本中连接 Amazon EMR，请参阅下面的讨论--在这些情况下，需要对 Jupyter Notebook 进行额外的准备。您还可以为 `NotebookJobStep` 的参数子集应用默认值，这样就不必在每次创建笔记本作业步骤时都指定参数。

要查看演示如何使用 SageMaker AI Python SDK 安排笔记本作业的示例笔记本，请参阅[笔记本作业示例笔记本](https://github.com/aws/amazon-sagemaker-examples/tree/main/sagemaker-pipelines/notebook-job-step)。

**Topics**
+ [

## 创建笔记本作业的步骤
](#create-notebook-auto-run-overall)
+ [

## 在 Studio UI 面板上查看笔记本作业
](#create-notebook-auto-run-dash)
+ [

## 在 Studio 中查看管道图
](#create-notebook-auto-run-graph)
+ [

## 向笔记本传递参数
](#create-notebook-auto-run-passparam)
+ [

## 在输入笔记本中连接 Amazon EMR 集群
](#create-notebook-auto-run-emr)
+ [

## 设置默认选项
](#create-notebook-auto-run-intdefaults)

## 创建笔记本作业的步骤


您可以创建一个立即运行或按计划运行的笔记本作业。以下说明介绍了这两种方法。

**要计划笔记本作业，请完成以下基本步骤：**

1. 创建一个 `NotebookJobStep` 实例。有关`NotebookJobStep`参数的详细信息，请参阅 [sagemaker.workflow.steps。 NotebookJobStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.notebook_job_step.NotebookJobStep)。至少可以提供以下参数，如以下代码片段所示：
**重要**  
如果您使用 SageMaker Python SDK 安排笔记本作业，则只能指定某些图像来运行笔记本作业。有关更多信息，请参阅 [SageMaker AI Python SDK 笔记本作业的图像限制](notebook-auto-run-constraints.md#notebook-auto-run-constraints-image-sdk)。

   ```
   notebook_job_step = NotebookJobStep(
       input_notebook=input-notebook,
       image_uri=image-uri,
       kernel_name=kernel-name
   )
   ```

1. 创建一个管道，将 `NotebookJobStep` 作为一个步骤，如以下代码所示：

   ```
   pipeline = Pipeline(
       name=pipeline-name,
       steps=[notebook_job_step],
       sagemaker_session=sagemaker-session,
   )
   ```

1. 按需运行管道，或选择性地安排未来的管道运行。要启动立即运行，请使用以下命令：

   ```
   execution = pipeline.start(
       parameters={...}
   )
   ```

   您还可以选择安排未来单次管道运行或按预定时间间隔安排多次运行。您可以在 `PipelineSchedule` 中指定日程表，然后用 `put_triggers` 将时间表对象传递给管道。有关管道调度的更多信息，请参阅 [使用 SageMaker Python 软件开发工具包安排管道](pipeline-eventbridge.md#build-and-manage-scheduling)。

   下面的示例安排管道在 2023 年 12 月 12 日 10:31:32 UTC 运行一次。

   ```
   my_schedule = PipelineSchedule(  
       name="my-schedule“,  
       at=datetime(year=2023, month=12, date=25, hour=10, minute=31, second=32) 
   )  
   pipeline.put_triggers(triggers=[my_schedule])
   ```

   以下示例将管道调度为在 2022 年至 2023 年期间每月最后一个星期五上午 10:15 UTC 运行。有关基于 cron 的调度的详细信息，请参阅[基于 cron 的调度](https://docs.amazonaws.cn/scheduler/latest/UserGuide/schedule-types.html#cron-based)。

   ```
   my_schedule = PipelineSchedule(  
       name="my-schedule“,  
       cron="15 10 ? * 6L 2022-2023"
   )  
   pipeline.put_triggers(triggers=[my_schedule])
   ```

1. （可选）在 “笔记本作业” 控制面板中查看您的 SageMaker 笔记本作业。您为笔记本作业步骤的 `tags` 参数提供的值可控制 Studio UI 捕捉和显示作业的方式。有关更多信息，请参阅 [在 Studio UI 面板上查看笔记本作业](#create-notebook-auto-run-dash)。

## 在 Studio UI 面板上查看笔记本作业


如果您指定了某些标签，作为管道步骤创建的笔记本作业就会出现在 Studio 笔记本作业控制面板中。

**注意**  
只有在 Studio 或本地 JupyterLab 环境中创建的笔记本作业才能创建作业定义。因此，如果您使用 SageMaker Python SDK 创建笔记本作业，则在 “笔记本作业” 控制面板中看不到作业定义。不过，您可以按照 [查看笔记本作业](view-notebook-jobs.md) 中的说明查看笔记本作业。

您可以使用以下标签控制哪些团队成员可以查看您的笔记本作业：
+ 要将笔记本显示到域中的所有用户配置文件或[空格](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-updated-jl-user-guide.html)，请使用域添加域标签。下面展示了一个示例：
  + 键：`sagemaker:domain-name`，值：`d-abcdefghij5k`
+ 要向域中的某个用户配置文件显示笔记本作业，请同时添加用户配置文件和域标签。用户配置文件标签示例如下：
  + 键：`sagemaker:user-profile-name`，值：`studio-user`
+ 要将笔记本作业显示为[空格](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-updated-jl-user-guide.html)，请同时添加空格和域标签。空格标签示例如下：
  + 键：`sagemaker:shared-space-name`，值：`my-space-name`
+ 如果不附加任何域、用户配置文件或空间标签，Studio UI 就不会显示管道步骤创建的笔记本作业。在这种情况下，您可以在训练作业管理控制台中查看基础训练作业，也可以在[管道执行列表](https://docs.amazonaws.cn/sagemaker/latest/dg/pipelines-studio-view-execution.html)中查看状态。

一旦设置了在控制面板上查看作业所需的标签，请参阅 [查看笔记本作业](view-notebook-jobs.md) 了解如何查看作业和下载输出结果。

## 在 Studio 中查看管道图


由于笔记本作业步骤是管道的一部分，因此可以在 Studio 中查看管道图 (DAG)。在管道图中，您可以查看管道运行的状态，并跟踪管道沿线。有关更多信息，请参阅 [查看管道运行的详细信息](pipelines-studio-view-execution.md)。

## 向笔记本传递参数


如果您要向笔记本作业传递参数（使用 `NotebookJobStep` 的 `parameters` 参数），则需要准备好接收参数的输入笔记本。

基于 Papermill 的笔记本作业执行器会搜索带有 `parameters` 标记的 Jupyter 单元，并在该单元后立即应用新参数或参数重载。有关更多信息，请参阅 [参数化笔记本](notebook-auto-run-troubleshoot-override.md)。

完成此步骤后，将参数传递给 `NotebookJobStep`，如下例所示：

```
notebook_job_parameters = {
    "company": "Amazon"
}

notebook_job_step = NotebookJobStep(
    image_uri=image-uri,
    kernel_name=kernel-name,
    role=role-name,
    input_notebook=input-notebook,
    parameters=notebook_job_parameters,
    ...
)
```

## 在输入笔记本中连接 Amazon EMR 集群


如果您通过 Studio 中的 Jupyter Notebook 连接到 Amazon EMR 集群，可能需要进一步修改 Jupyter Notebook。如果您需要在笔记本中执行以下任务，请参阅 [从笔记本连接到 Amazon EMR 集群](scheduled-notebook-connect-emr.md)：
+ **将参数传递到 Amazon EMR 连接命令中。**Studio 使用 Papermill 来运行笔记本。在 SparkMagic内核中，由于 Papermill 向其传递信息的方式，您传递给 Amazon EMR 连接命令的参数可能无法按预期工作。 SparkMagic
+ **将用户凭证传递给经过 Kerberos、LDAP 或 HTTP Basic Auth 身份验证的 Amazon EMR 集群**。您必须通过 Amazon Secrets Manager传递用户凭证。

## 设置默认选项


S SageMaker DK 为您提供了为部分参数设置默认值的选项，这样您就不必在每次创建`NotebookJobStep`实例时都指定这些参数。这些参数是 `role`、`s3_root_uri`、`s3_kms_key`、`volume_kms_key`、`subnets` 和 `security_group_ids`。使用 A SageMaker I 配置文件为该步骤设置默认值。有关 SageMaker AI 配置文件的信息，请参阅[在 SageMaker Python SDK 中配置和使用默认值。](https://sagemaker.readthedocs.io/en/stable/overview.html#configuring-and-using-defaults-with-the-sagemaker-python-sdk) 。

要设置笔记本作业默认值，请将新的默认值应用到配置文件的笔记本作业部分，如下文所示：

```
SageMaker:
  PythonSDK:
    Modules:
      NotebookJob:
        RoleArn: 'arn:aws:iam::555555555555:role/IMRole'
        S3RootUri: 's3://amzn-s3-demo-bucket/my-project'
        S3KmsKeyId: 's3kmskeyid'
        VolumeKmsKeyId: 'volumekmskeyid1'
        VpcConfig:
          SecurityGroupIds:
            - 'sg123'
          Subnets:
            - 'subnet-1234'
```

# 在 Studio 中创建笔记本作业


**注意**  
笔记本调度器由 Amazon EventBridge、 SageMaker Training 和 Pipelines 服务构建。如果笔记本作业失败，您可能会看到与这些服务相关的错误。下面将介绍如何在 Studio UI 中创建笔记本作业。

SageMaker Notebook Jobs 为你提供了使用 “笔记本作业” 控件创建和管理非交互式笔记本作业的工具。您可以创建作业，查看创建的作业，以及暂停、停止或恢复现有作业。您也可以修改笔记本计划。

当您使用小工具创建预定的笔记本作业时，调度程序会尝试选择默认选项，并自动填充表单，帮助您快速上手。如果您使用的是 Studio，则至少可以在不设置任何选项的情况下提交按需作业。您也可以提交（计划的）笔记本作业定义，仅提供特定于时间的计划信息。但是，如果您的计划作业需要专门的设置，可以自定义其他字段。如果您运行的是本地 Jupyter 笔记本，则调度器扩展程序提供一项特征，让您可以指定自己的默认值（针对部分选项），这样就不必每次都手动插入相同的值。

创建笔记本作业时，可以包含数据集、映像和本地脚本等附加文件。为此，选择**运行带有输入文件夹**的作业。笔记本作业现在可以访问输入文件文件夹下的所有文件。笔记本作业运行时，目录的文件结构保持不变。

要计划笔记本作业，请完成以下步骤：

1. 打开**创建作业**表单。

   在本地 JupyterLab 环境中，选择任务栏中的**创建笔记本作业**图标 (![\[Blue icon of a calendar with a checkmark, representing a scheduled task or event.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/icons/notebook-schedule.png))。如果没有看到该图标，请按照[安装指南](scheduled-notebook-installation.md)中的说明进行安装。

   在 Studio 中，请通过以下两种方式之一打开表单：
   + 使用**文件浏览器**

     1. 在左侧面板的**文件浏览器**中，右键单击要作为计划作业运行的笔记本。

     1. 选择**创建笔记本作业**。
   + 在 Studio 笔记本中
     + 在要作为计划作业运行的 Studio 笔记本中，选择 Studio 工具栏中的**创建笔记本作业**图标 (![\[Blue icon of a calendar with a checkmark, representing a scheduled task or event.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/icons/notebook-schedule.png))。

1. 填写弹出表单。该表单显示以下字段：
   + **作业名称**：您为作业指定的描述性名称。
   + **输入文件**：您计划在非交互模式下运行的笔记本的名称。
   + **计算类型**：您要在其中运行笔记本的 Amazon EC2 实例的类型。
   + **参数**：自定义参数，您可以选择将其指定为笔记本的输入。要使用此功能，您可能需要在 Jupyter Notebook 中的特定单元格上标记 **parameters** 标签，以控制参数的应用位置。有关更多详细信息，请参阅[参数化笔记本](notebook-auto-run-troubleshoot-override.md)。
   + （可选）**使用输入文件夹运行任务**：如果选择此选项，计划任务将可以访问与**输入文件**位于同一文件夹中的所有文件。
   + **其他选项**：您可以为作业指定其他自定义项。例如，您可以指定映像或内核、输入和输出文件夹、作业重试和超时选项、加密详细信息以及自定义初始化脚本。有关您可以应用的自定义项的完整列表，请参阅[可用选项](create-notebook-auto-execution-advanced.md)。

1. 计划您的作业。您可以按需运行笔记本，也可以按固定计划运行笔记本。
   + 要按需运行笔记本，请完成以下步骤：
     + 选择**立即运行**。
     + 选择**创建**。
     + 此时将显示**笔记本作业**选项卡。选择**重新加载**以将作业加载到控制面板。
   + 要按固定计划运行笔记本，请完成以下步骤：
     + 选择**按计划运行**。
     + 选择**间隔**下拉列表并选择间隔。间隔从每分钟到每月不等。也可以选择**自定义计划**。
     + 根据所选的间隔，系统会显示其他字段，以帮助您进一步指定所需的运行日期和时间。例如，如果选择**日**进行每日运行，则系统会显示一个附加字段供您指定所需的时间。请注意，您指定的任何时间均采用 UTC 格式。另请注意，如果您选择较小的间隔（例如一分钟），则当下一个作业开始时，如果前一个作业尚未完成，您的作业就会重叠。

       如果选择自定义计划，则可以在表达式框中使用 cron 语法来指定确切的运行日期和时间。cron 语法是一个以空格分隔的数字列表，每个数字代表一个时间单位，从秒到年不等。要获取有关 cron 语法的帮助，可以在表达式框下选择**获取有关 cron 语法的帮助**。
     + 选择**创建**。
     + 此时将显示**笔记本作业定义**选项卡。选择**重新加载**以将作业定义加载到控制面板中。

# 为本地笔记本设置默认选项


**重要**  
截至 2023 年 11 月 30 日，之前的亚马逊 SageMaker Studio 体验现在被命名为 Amazon St SageMaker udio Classic。以下部分专门介绍如何使用 Studio Classic 应用程序。有关使用更新的 Studio 体验的信息，请参阅 [亚马逊 SageMaker Studio](studio-updated.md)。  
Studio Classic 仍针对现有工作负载进行维护，但不再可供入门使用。您只能停止或删除现有的 Studio Classic 应用程序，不能创建新的应用程序。我们建议您将[工作负载迁移到全新 Studio 体验](studio-updated-migrate.md)。

创建笔记本作业时，可以设置默认选项。如果您计划创建多个笔记本作业，并使用与提供的默认值不同的选项，这可以节省您的时间。下面将介绍如何设置本地笔记本的默认选项。

如果必须在**创建作业**表单中手动键入（或粘贴）自定义值，则可以存储新的默认值，并且每当您创建新的作业定义时，调度器扩展程序都会插入新值。此特征可用于以下选项：
+ **角色 ARN**
+ **S3 输入文件夹**
+ **S3 输出文件夹**
+ **输出加密 KMS 密钥**（如果打开**配置作业加密**）。
+ **作业实例卷加密 KMS 密钥**（如果打开**配置作业加密**）。

如果您插入的值与提供的默认值不同，并且在将来的作业运行中继续使用这些值，则此特征可以为您节省时间。您选择的用户设置存储在运行 JupyterLab 服务器的计算机上，并借助本机 API 进行检索。如果您为一个或多个而不是全部五个选项提供了新的默认值，那么您没有自定义的选项将使用以前的默认值。

以下说明将向您介绍如何预览现有默认值、设置新的默认值以及重置笔记本作业的默认值。

**要预览笔记本作业的现有默认值，请完成以下步骤：**

1. 按照中的说明打开 Amazon SageMaker Studio Classic 主机[推出亚马逊 SageMaker Studio 经典版](studio-launch.md)。

1. 在左侧面板的**文件浏览器**中，右键单击要作为计划作业运行的笔记本。

1. 选择**创建笔记本作业**。

1. 选择**附加选项**，展开笔记本作业设置选项卡。您可以在此处查看默认设置。

**要为未来的笔记本作业设置新的默认值，请完成以下步骤：**

1. 按照中的说明打开 Amazon SageMaker Studio Classic 主机[推出亚马逊 SageMaker Studio 经典版](studio-launch.md)。

1. 在 Studio Classic 的顶部菜单中选择**设置**，然后选择 **高级设置编辑器**。

1. 从 “**设置**” 下方的列表中选择 **Amazon SageMaker 日程安排**。默认情况下可能已经打开。

1. 您可以直接在此用户界面页面或使用 JSON 编辑器更新默认设置。
   + 在用户界面中，您可以为**角色 ARN**、**S3 输入文件夹**、**S3 输出文件夹**、**输出加密 KMS 键**或**任务实例卷加密 KMS 键**插入新值。如果更改了这些值，在**其他选项**下创建下一个笔记本作业时，就会看到这些字段的新默认值。
   + （可选）要使用 **JSON 设置编辑器**更新用户默认设置，请完成以下步骤：

     1. 在右上角，选择 **JSON 设置编辑器**。

     1. 在 **“设置”** 左侧栏中，选择 **Amazon SageMaker AI 计划程序**。默认情况下可能已经打开。

        您可以在**用户偏好**面板中查看当前默认值。

        您可以在**系统默认**面板中查看系统默认值。

     1. 要更新默认值，请将 JSON 代码片段从**系统默认值**面板复制并粘贴到**用户首选项**面板，然后更新字段。

     1. 如果更新了默认值，请选择右上角的**保存用户设置**图标 (![\[Icon of a cloud with an arrow pointing upward, representing cloud upload functionality.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/icons/Notebook_save.png))。关闭编辑器并不会保存更改。

**如果您之前进行过更改，而现在想要重置用户定义的默认值，请完成以下步骤：**

1. 在 Studio Classic 的顶部菜单中选择**设置**，然后选择 **高级设置编辑器**。

1. 从 “**设置**” 下方的列表中选择 **Amazon SageMaker 日程安排**。默认情况下可能已经打开。

1. 您可以直接使用此 UI 页面或使用 JSON 编辑器恢复默认值。
   + 在用户界面中，您可以选择右上角的**恢复默认值**。您的默认值将恢复为空字符串。仅当您之前更改过默认值时，才会看到此选项。
   + （可选）要使用 **JSON 设置编辑器**重新启动默认设置，请完成以下步骤：

     1. 在右上角，选择 **JSON 设置编辑器**。

     1. 在 **“设置”** 左侧栏中，选择 **Amazon SageMaker AI 计划程序**。默认情况下可能已经打开。

        您可以在**用户偏好**面板中查看当前默认值。

        您可以在**系统默认**面板中查看系统默认值。

     1. 要恢复当前默认设置，请将**系统默认**面板中的内容复制到**用户偏好**面板。

     1. 选择右上角的**保存用户设置**图标 (![\[Icon of a cloud with an arrow pointing upward, representing cloud upload functionality.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/icons/Notebook_save.png))。关闭编辑器并不会保存更改。

# 笔记本作业工作流程


由于笔记本作业运行的是自定义代码，因此您可以创建一个包含一个或多个笔记本作业步骤的管道。智能语言工作流程通常包含多个步骤，例如预处理数据的处理步骤、建立模型的训练步骤以及模型评测步骤等等。笔记本作业的一个可能用途是处理预处理：您可能有一个笔记本来执行数据转换或摄取，一个 EMR 步骤来执行数据清理，而另一个笔记本作业则在启动训练步骤之前对输入进行功能化处理。笔记本作业可能需要管道中先前步骤的信息或用户指定的自定义信息，作为输入笔记本的参数。有关如何向笔记本传递环境变量和参数以及从先前步骤获取信息的示例，请参阅 [笔记本步骤之间的信息传递](create-notebook-auto-run-dag-seq.md)。

在另一种使用情况下，您的一个笔记本作业可能会调用另一个笔记本，以便在笔记本运行期间执行某些任务 - 在这种情况下，您需要在笔记本作业步骤中将这些来源笔记本指定为依赖项。有关如何调用其他笔记本的信息，请参阅 [在笔记本作业中调用另一个笔记本](create-notebook-auto-run-dag-call.md)。

要查看演示如何使用 SageMaker AI Python SDK 安排笔记本作业的示例笔记本，请参阅[笔记本作业示例笔记本](https://github.com/aws/amazon-sagemaker-examples/tree/main/sagemaker-pipelines/notebook-job-step)。

# 笔记本步骤之间的信息传递


以下章节介绍了以环境变量和参数形式向笔记本传递信息的方法。

## 传递环境变量


如下例所示，将环境变量作为字典传递给 `NotebookJobStep` 的 `environment_variable` 参数：

```
environment_variables = {"RATE": 0.0001, "BATCH_SIZE": 1000}

notebook_job_step = NotebookJobStep(
    ...
    environment_variables=environment_variables,
    ...
)
```

您可以使用 `os.getenv()` 在笔记本中使用环境变量，如下例所示：

```
# inside your notebook
import os
print(f"ParentNotebook: env_key={os.getenv('env_key')}")
```

## 传递参数


将参数传递给 `NotebookJobStep` 实例中的第一个笔记本作业步骤时，您可能需要在 Jupyter Notebook 中标记一个单元格，以指示应用新参数或参数覆盖的位置。有关如何在 Jupyter Notebook 中标记单元格的说明，请参阅 [参数化笔记本](notebook-auto-run-troubleshoot-override.md)。

您可以通过笔记本作业步骤的 `parameters` 参数传递参数，如以下代码段所示：

```
notebook_job_parameters = {
    "company": "Amazon",
}

notebook_job_step = NotebookJobStep(
    ...
    parameters=notebook_job_parameters,
    ...
)
```

在输入笔记本中，参数会应用于标记有 `parameters` 的单元格之后，如果没有标记单元格，则会应用于笔记本的开头。

```
# this cell is in your input notebook and is tagged with 'parameters'
# your parameters and parameter overrides are applied after this cell
company='default'
```

```
# in this cell, your parameters are applied
# prints "company is Amazon"
print(f'company is {company}')
```

## 检索前一步的信息


下面将讨论如何从上一个步骤中提取数据，并将其传递到笔记本作业步骤中。

**使用 `properties` 属性**

您可以将以下属性与上一步的 `properties` 属性一起使用：
+ `ComputingJobName`：训练作业名称
+ `ComputingJobStatus`：训练作业状态
+ `NotebookJobInputLocation`：输入的 Amazon S3 位置
+ `NotebookJobOutputLocationPrefix`：通向训练作业输出的路径，更具体地说是 `{NotebookJobOutputLocationPrefix}/{training-job-name}/output/output.tar.gz`。
+ `InputNotebookName`：输入的笔记本文件名
+ `OutputNotebookName`：输出笔记本文件名（如果作业失败，该文件名可能不存在于训练作业输出文件夹中）

以下代码片段展示了如何从属性中提取参数。

```
notebook_job_step2 = NotebookJobStep(
    ....
    parameters={
        "step1_JobName": notebook_job_step1.properties.ComputingJobName,
        "step1_JobStatus": notebook_job_step1.properties.ComputingJobStatus,
        "step1_NotebookJobInput": notebook_job_step1.properties.NotebookJobInputLocation,
        "step1_NotebookJobOutput": notebook_job_step1.properties.NotebookJobOutputLocationPrefix,
    }
```

**使用 JsonGet**

如果要传递的参数不包括前面提到的参数，且上一步的 JSON 输出位于 Amazon S3 中，请使用 `JsonGet`。`JsonGet` 是一种通用机制，可以直接从 Amazon S3 中的 JSON 文件中提取数据。

要使用 `JsonGet` 提取 Amazon S3 中的 JSON 文件，请完成以下步骤：

1. 将 JSON 文件上传到 Amazon S3。如果您的数据已经上传到 Amazon S3，请跳过此步骤。下面的示例演示了将 JSON 文件上传到 Amazon S3。

   ```
   import json
   from sagemaker.s3 import S3Uploader
   
   output = {
       "key1": "value1", 
       "key2": [0,5,10]
   }
               
   json_output = json.dumps(output)
   
   with open("notebook_job_params.json", "w") as file:
       file.write(json_output)
   
   S3Uploader.upload(
       local_path="notebook_job_params.json",
       desired_s3_uri="s3://path/to/bucket"
   )
   ```

1. 提供您的 S3 URI 和要提取的值的 JSON 路径。在下面的示例中，`JsonGet` 返回一个对象，代表与密钥 `key2` 关联的值的索引 2 (`10`)。

   ```
   NotebookJobStep(
       ....
       parameters={
           # the key job_key1 returns an object representing the value 10
           "job_key1": JsonGet(
               s3_uri=Join(on="/", values=["s3:/", ..]),
               json_path="key2[2]" # value to reference in that json file
           ), 
           "job_key2": "Amazon" 
       }
   )
   ```

# 在笔记本作业中调用另一个笔记本


您可以设置一个管道，让一个笔记本作业调用另一个笔记本。下面是一个带有笔记本作业步骤的管道示例，其中笔记本调用了另外两个笔记本。输入笔记本包含以下几行：

```
%run 'subfolder/notebook_to_call_in_subfolder.ipynb'
%run 'notebook_to_call.ipynb'
```

如以下代码所示，使用 `additional_dependencies` 将这些笔记本传递到 `NotebookJobStep` 实例中。请注意，`additional_dependencies` 中为笔记本提供的路径是从根位置开始提供的。有关 SageMaker AI 如何将您的依赖文件和文件夹上传到 Amazon S3 以便您可以正确提供依赖项路径的信息，请参阅`additional_dependencies`中的[NotebookJobStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.notebook_job_step.NotebookJobStep)描述。

```
input_notebook = "inputs/input_notebook.ipynb"
simple_notebook_path = "inputs/notebook_to_call.ipynb"
folder_with_sub_notebook = "inputs/subfolder"

notebook_job_step = NotebookJobStep(
    image_uri=image-uri,
    kernel_name=kernel-name,
    role=role-name,
    input_notebook=input_notebook,
    additional_dependencies=[simple_notebook_path, folder_with_sub_notebook],
    tags=tags,
)
```

# 可用选项
可用选项

下表显示了您可以用来自定义笔记本作业的所有可用选项，无论是在 Studio、本地 Jupyter 环境中运行笔记本作业，还是使用 Pyth SageMaker on SDK。该表包括自定义选项的类型、描述、有关如何使用该选项的其他指南、Studio 中该选项的字段名称（如果可用）以及 SageMaker Python SDK 中笔记本作业步骤的参数名称（如果有）。

对于某些选项，您还可以预设自定义默认值，这样就不必在每次设置笔记本作业时都指定这些值。对于 Studio，这些选项是**角色**、**输入文件夹**、**输出文件夹**和 **KMS 密钥 ID**，并在下表中指定。如果您为这些选项预设了自定义默认值，那么在创建笔记本作业时，这些字段就会预先填入**创建作业**表单中。有关如何在 Studio 和本地 Jupyter 环境中创建自定义默认设置的详细信息，请参阅 [为本地笔记本设置默认选项](create-notebook-auto-execution-advanced-default.md)。

S SageMaker DK 还为您提供了设置智能默认值的选项，这样您就不必在创建时指定这些参数`NotebookJobStep`。这些参数分别为 `role`、`s3_root_uri`、`s3_kms_key`、`volume_kms_key`、`subnets`、`security_group_ids`，并在下表中指定。有关如何设置智能默认值的信息，请参阅 [设置默认选项](create-notebook-auto-run-sdk.md#create-notebook-auto-run-intdefaults)。


| 自定义选项 | 说明 | Studio 特定指南 | 本地 Jupyter 环境指南 | SageMaker Python 开发工具包指南 | 
| --- | --- | --- | --- | --- | 
| 作业名称 | 您的作业名称应显示在笔记本作业控制面板中。 | 字段 Job name。 | 与 Studio 相同。 | 参数 notebook\$1job\$1name。默认值为 None。 | 
| Image | 用于在所选计算类型上以非交互方式运行笔记本的容器映像。 | 字段 Image。此字段默认为笔记本的当前映像。如果需要，将此字段从默认值更改为自定义值。如果 Studio 无法推断出此值，则表单会显示一个验证错误，要求您指定该值。此图片可以是自定义图片、[bring-your-own 图片](https://docs.amazonaws.cn/sagemaker/latest/dg/studio-byoi.html)或可用的 Amazon SageMaker 图片。有关笔记本调度程序支持的可用 SageMaker 图像的列表，请参阅[亚马逊 SageMaker 图片可用于 Studio Classic 笔记本电脑](notebooks-available-images.md)。 | 字段 Image。此字段需要 Docker 映像的 ECR URI，该映像可以在所选计算类型上运行所提供的笔记本。默认情况下，调度器扩展使用预先构建的 SageMaker AI Docker 镜像（基于 Python 2.0）。这是来自 boto3 和 Python 3 内核 DockerHub 的官方 Python 3.8 图片。 Amazon CLI您还可以提供符合笔记本自定义映像规范的任何 ECR URI。有关更多信息，请参阅 [亚马逊 SageMaker Studio 经典版的自定义 SageMaker 图片规格](studio-byoi-specs.md)。此映像应包含笔记本运行所需的所有内核和库。 | 必填项。参数 image\$1uri。ECR 上 Docker 映像的 URI 位置。您可以使用特定的 SageMaker 分发映像或基于这些映像的自定义映像，也可以使用预先安装的 notebook 作业依赖项满足其他要求的自己的映像。有关更多信息，请参阅 [SageMaker AI Python SDK 笔记本作业的图像限制](notebook-auto-run-constraints.md#notebook-auto-run-constraints-image-sdk)。 | 
| 实例类型 | 用于运行笔记本作业的 EC2 实例类型。notebook 作业使用 T SageMaker raining Job 作为计算层，因此指定的实例类型应为 Tra SageMaker ining 支持的实例类型。 | 字段 Compute type。默认值为 ml.m5.large。 | 与 Studio 相同。 | 参数 instance\$1type。默认值为 ml.m5.large。 | 
| 内核 | 用于运行笔记本作业的 Jupyter 内核。 | 字段 Kernel。此字段默认为笔记本的当前内核。如果需要，将此字段从默认值更改为自定义值。如果 Studio 无法推断出此值，则表单会显示一个验证错误，要求您指定该值。 | 字段 Kernel。此内核应出现在映像中并遵循 Jupyter 内核规范。该字段默认为在基本 Python 2.0 镜像中找到的 Python3 内核。 SageMaker 如果需要，请将此字段更改为自定义值。 | 必填项。参数 kernel\$1name。此内核应出现在映像中并遵循 Jupyter 内核规范。要查看映像的内核标识符，请参阅 (LINK)。 | 
| SageMaker 人工智能会话 | 委托 SageMaker AI 服务调用的底层 SageMaker AI 会话。 | 不适用 | 不适用 | 参数 sagemaker\$1session。如果未指定，则使用默认配置链创建一个。 | 
| 角色 ARN | 用于笔记本作业的角色的 Amazon 资源名称 (ARN)。 | 字段 Role ARN。此字段默认为 Studio 执行角色。如果需要，请将此字段更改为自定义值。 如果 Studio 无法推断出此值，则**角色 ARN** 字段为空。在这种情况下，请插入要使用的 ARN。  | 字段 Role ARN。此字段默认为任何前缀为 SagemakerJupyterScheduler 的角色。如果您有多个带有该前缀的角色，则扩展程序会选择其中一个。如果需要，请将此字段更改为自定义值。对于此字段，您可以设置自己的用户默认值，只要您创建新的作业定义，就会预填充该默认值。有关更多信息，请参阅 [为本地笔记本设置默认选项](create-notebook-auto-execution-advanced-default.md)。 | 参数 role。如果软件开发工具包在 SageMaker 笔记本或 SageMaker Studio 笔记本中运行，则默认为 A SageMaker I 默认 IAM 角色。否则会抛出一个 ValueError。允许智能默认设置。 | 
| 输入笔记本 | 您计划运行的笔记本的名称。 | 必填项。字段 Input file。 | 与 Studio 相同。 | 必填参数 input\$1notebook。 | 
| 输入文件夹 | 包含您的输入的文件夹。作业输入（包括输入笔记本和任何可选的启动或初始化脚本）都放在此文件夹中。 | 字段 Input folder。如果您不提供文件夹，则调度器会为您的输入创建一个默认 Amazon S3 存储桶。 | 与 Studio 相同。对于此字段，您可以设置自己的用户默认值，只要您创建新的作业定义，就会预填充该默认值。有关更多信息，请参阅 [为本地笔记本设置默认选项](create-notebook-auto-execution-advanced-default.md)。 | 不适用。输入文件夹放置在参数 s3\$1root\$1uri 指定的位置内。 | 
| 输出文件夹 | 包含您的输出的文件夹。作业输出（包括输出笔记本和日志）都放在此文件夹中。 | 字段 Output folder。如果您未指定文件夹，则调度器会为您的输出创建一个默认 Amazon S3 存储桶。 | 与 Studio 相同。对于此字段，您可以设置自己的用户默认值，只要您创建新的作业定义，就会预填充该默认值。有关更多信息，请参阅 [为本地笔记本设置默认选项](create-notebook-auto-execution-advanced-default.md)。 | 不适用。输出文件夹放在参数 s3\$1root\$1uri 指定的位置内。 | 
| 参数 | 一个变量和数值字典，用于向笔记本作业传递变量和数值。 | 字段 Parameters。您需要[对笔记本进行参数化](https://docs.amazonaws.cn/sagemaker/latest/dg/notebook-auto-run-troubleshoot-override.html)，以便接受参数。 | 与 Studio 相同。 | 参数 parameters。您需要[对笔记本进行参数化](https://docs.amazonaws.cn/sagemaker/latest/dg/notebook-auto-run-troubleshoot-override.html)，以便接受参数。 | 
| 附加（文件或文件夹）依赖项 | 笔记本作业上传到 s3 暂存文件夹的文件或文件夹依赖关系列表。 | 不支持。 | 不支持。 | 参数 additional\$1dependencies。笔记本作业会将这些依赖关系上传到 S3 暂存文件夹，以便在执行过程中使用。 | 
| S3 根 URI | 包含您的输入的文件夹。作业输入（包括输入笔记本和任何可选的启动或初始化脚本）都放在此文件夹中。此 S3 存储桶必须在用于运行笔记本作业的同一 Amazon Web Services 账户 中。 | 不适用。使用 Input Folder 和 Output folder。 | 与 Studio 相同。 | 参数 s3\$1root\$1uri。默认为默认 S3 存储桶。允许智能默认设置。 | 
| 环境变量 | 您要覆盖的任何现有环境变量，或者要在笔记本中引入和使用的新环境变量。 | 字段 Environment variables。 | 与 Studio 相同。 | 参数 environment\$1variables。默认值为 None。 | 
| 标签 | 作业所附的标记列表。 | 不适用 | 不适用 | 参数 tags。默认值为 None。您的标记控制着 Studio UI 捕捉和显示管道创建的作业的方式。有关更多信息，请参阅 [在 Studio UI 面板上查看笔记本作业](create-notebook-auto-run-sdk.md#create-notebook-auto-run-dash)。 | 
| 启动脚本 | 笔记本启动菜单中预加载的脚本，您可以选择在运行笔记本之前运行该脚本。 | 字段 Start-up script。选择启动时在映像上运行的生命周期配置 (LCC) 脚本。 启动脚本在 Studio 环境之外的 Shell 中运行。因此，此脚本不能依赖于 Studio 本地存储、环境变量或应用程序元数据（`/opt/ml/metadata` 中）。此外，如果您使用启动脚本和初始化脚本，则启动脚本将首先运行。   | 不支持。 | 不支持。 | 
| 初始化脚本 | 指向可在笔记本启动时运行的本地脚本的路径。 | 字段 Initialization script。输入本地脚本或生命周期配置 (LCC) 脚本所在的 EFS 文件路径。如果您使用启动脚本和初始化脚本，则启动脚本将首先运行。 初始化脚本源自与笔记本作业相同的 Shell。之前描述的启动脚本则不是这种情况。此外，如果您使用启动脚本和初始化脚本，则启动脚本将首先运行。   | 字段 Initialization script。输入本地脚本或生命周期配置 (LCC) 脚本所在的本地文件路径。 | 参数 initialization\$1script。默认值为 None。 | 
| 最大重试次数 | Studio 尝试重新运行失败作业的次数。 | 字段 Max retry attempts。默认值为 1。 | 与 Studio 相同。 | 参数 max\$1retry\$1attempts。默认值为 1。 | 
| 最大运行时间（以秒为单位） | 笔记本作业在停止之前可以运行的最长时间（以秒为单位）。如果您同时配置了最大运行时间和最大重试次数，则每次重试都会应用该运行时间。如果在这段时间内未完成作业，则其状态将设置为 Failed。 | 字段 Max run time (in seconds)。默认值为 172800 seconds (2 days)。 | 与 Studio 相同。 | 参数 max\$1runtime\$1in\$1seconds。默认值为 172800 seconds (2 days)。 | 
| 重试策略 | 重试策略列表，用于管理失败情况下的操作。 | 不支持。 | 不支持。 | 参数 retry\$1policies。默认值为 None。 | 
| 添加 Step 或 StepCollection 依赖项 | 作业所依赖的 Step 或 StepCollection 名称或实例的列表。 | 不支持。 | 不支持。 | 参数 depends\$1on。默认值为 None。用它来定义管道图中各步骤之间的显式依赖关系。 | 
| 卷大小 | 训练期间用于存储输入和输出数据的存储容量 (GB)。 | 不支持。 | 不支持。 | 参数 volume\$1size。默认为 30GB。 | 
| 加密容器之间的流量 | 用于指定训练作业是否对训练容器之间的流量进行加密的标签。 | 不适用。默认已启用。 | 不适用。默认已启用。 | 参数 encrypt\$1inter\$1container\$1traffic。默认值为 True。 | 
| 配置作业加密 | 一个指示符，指示您要加密笔记本作业输出和/或作业实例卷。 | 字段 Configure job encryption。选中此框可选择加密。如果不选中此框，则作业输出将使用账户的默认 KMS 密钥加密，而作业实例卷不会加密。 | 与 Studio 相同。 | 不支持。 | 
| 输出加密 KMS 密钥 | 当您想自定义用于笔记本作业输出的加密密钥时要使用的 KMS 密钥。仅当您选中了配置作业加密时，此字段才适用。 | 字段 Output encryption KMS key。如果您未指定此字段，则笔记本作业输出将使用默认 Amazon S3 KMS 密钥通过 SSE-KMS 进行加密。此外，如果您自己创建 Amazon S3 存储桶并使用加密，则会保留您的加密方法。 | 与 Studio 相同。对于此字段，您可以设置自己的用户默认值，只要您创建新的作业定义，就会预填充该默认值。有关更多信息，请参阅 [为本地笔记本设置默认选项](create-notebook-auto-execution-advanced-default.md)。 | 参数 s3\$1kms\$1key。默认值为 None。允许智能默认设置。 | 
| 作业实例卷加密 KMS 密钥 | 当您想加密作业实例卷时要使用的 KMS 密钥。仅当您选中了配置作业加密时，此字段才适用。 | 字段 Job instance volume encryption KMS key。 | 字段 Job instance volume encryption KMS key。对于此字段，您可以设置自己的用户默认值，只要您创建新的作业定义，就会预填充该默认值。有关更多信息，请参阅 [为本地笔记本设置默认选项](create-notebook-auto-execution-advanced-default.md)。 | 参数 volume\$1kms\$1key。默认值为 None。允许智能默认设置。 | 
| 使用 Virtual Private Cloud 运行此作业（适用于 VPC 用户） | 一个指示符，指示您要在 Virtual Private Cloud (VPC) 中运行此作业。为了提高安全性，建议您使用私有 VPC。 | 字段 Use a Virtual Private Cloud to run this job。如果您想使用 VPC，请选中此框。至少创建以下 VPC 终端节点，使您的笔记本作业能够私下连接到这些 Amazon 资源：[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/sagemaker/latest/dg/create-notebook-auto-execution-advanced.html)如果选择使用 VPC，则需要在以下选项中指定至少一个私有子网和至少一个安全组。如果不使用任何私有子网，则需要考虑其他配置选项。有关详细信息，请参阅[约束和注意事项](notebook-auto-run-constraints.md)中的不支持的公有 VPC 子网。 | 与 Studio 相同。 | 不适用 | 
| 子网（适用于 VPC 用户） | 您的子网。此字段必须包含至少一个子网，最多五个子网，并且提供的所有子网都应为私有子网。有关详细信息，请参阅[约束和注意事项](notebook-auto-run-constraints.md)中的不支持的公有 VPC 子网。 | 字段 Subnet。此字段默认为与 Studio 域关联的子网，但您可以根据需要更改此字段。 | 字段 Subnet。调度器无法检测到您的子网，因此您需要输入为 VPC 配置的任何子网。 | 参数 subnets。默认值为 None。允许智能默认设置。 | 
| 安全组（适用于 VPC 用户） | 您的安全组。此字段必须包含至少一个安全组，最多 15 个安全组。有关详细信息，请参阅[约束和注意事项](notebook-auto-run-constraints.md)中的不支持的公有 VPC 子网。 | 字段 Security groups。此字段默认为与域 VPC 关联的安全组，但您可以根据需要更改此字段。 | 字段 Security groups。调度器无法检测到您的安全组，因此您需要输入为 VPC 配置的任何安全组。 | 参数 security\$1group\$1ids。默认值为 None。允许智能默认设置。 | 
| Name | 笔记本作业步骤的名称。 | 不适用 | 不适用 | 参数 name。如果未指定，则从笔记本文件名导出。 | 
| 显示名称 | 您的作业名称应出现在管道执行列表中。 | 不适用 | 不适用 | 参数 display\$1name。默认值为 None。 | 
| 说明 | 描述您的作业。 | 不适用 | 不适用 | 参数 description。 | 

# 参数化笔记本
参数化笔记本

要将新参数或参数重载传递给预定的笔记本作业，如果您希望在单元格后应用新参数值，则可能需要修改 Jupyter Notebook。传递参数时，笔记本作业执行器会使用 Papermill 强制执行的方法。笔记本作业执行器会搜索带有 `parameters` 标记的 Jupyter 单元格，并在该单元格后立即应用新参数或参数覆盖。如果没有标记为 `parameters` 的单元格，参数将在笔记本开始时应用。如果有多个单元格标记了 `parameters`，参数将在第一个标记了 `parameters` 的单元格之后应用。

要使用 `parameters` 标签标记笔记本中的单元格，请完成以下步骤：

1. 选择要参数化的单元格。

1. 选择右侧边栏中的 **Property Inspector** 图标 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/studio/icons/gears.png))。

1. 在**添加标签**框中键入 **parameters**。

1. 选择 **\$1** 符号。

1. `parameters` 标签将显示在**单元格标签**下方，并带有对勾标记，这意味着已对单元格应用了标签。

# 从笔记本连接到 Amazon EMR 集群
从笔记本连接到 Amazon EMR 集群

如果您从 Studio 的 Jupyter 笔记本连接到 Amazon EMR 集群，则可能需要执行其他设置。具体而言，以下讨论涉及两个问题：
+ **将参数传递到 Amazon EMR 连接命令**。在 SparkMagic 内核中，由于 Papermill 传递参数的方式和 SparkMagic 接收参数的方式不同，您传递给 Amazon EMR 连接命令的参数可能无法按预期工作。解决这一限制的办法是将参数作为环境变量传递。有关此问题和解决方法的更多详细信息，请参阅[将参数传递给 EMR 连接命令](#scheduled-notebook-connect-emr-pass-param)。
+ **将用户凭证传递给经过 Kerberos、LDAP 或 HTTP Basic Auth 身份验证的 Amazon EMR 集群**。在交互模式下，Studio 会在弹出表单中要求您提供凭证，您可以在其中输入登录凭证。在非交互式计划的笔记本中，您必须通过 Amazon Secrets Manager传递它们。有关如何在安排的笔记本作业 Amazon Secrets Manager 中使用的更多详细信息，请参阅[将用户凭证传递给经过 Kerberos、LDAP 或 HTTP Basic Auth 身份验证的 Amazon EMR 集群](#scheduled-notebook-connect-emr-credentials)。

## 将参数传递给 EMR 连接命令
将参数传递给 EMR 连接命令

如果您在 SparkMagic PySpark 和 Spark 内核中使用图像并想要参数化 EMR 连接命令，请在 “**环境变量**” 字段中提供您的参数，而不是 “创建 Job” 表单（在 “**其他**选项” 下拉菜单中）的 “参数” 字段。确保 Jupyter 笔记本中的 EMR 连接命令将这些参数作为环境变量传递。例如，假设您在创建作业时将 `cluster-id` 作为环境变量传递。您的 EMR 连接命令应类似于以下内容：

```
%%local
import os
```

```
%sm_analytics emr connect —cluster-id {os.getenv('cluster_id')} --auth-type None
```

您需要这种解决方法来满足 SparkMagic 和 Papermill 的要求。对于后台上下文， SparkMagic 内核希望`%%local`魔法命令伴随您定义的任何局部变量。不过，Papermill 不会通过您的覆盖来传递 `%%local` 魔术命令。为了解决这个 Papermill 限制，必须在**环境变量**字段中将参数作为环境变量提供。

## 将用户凭证传递给经过 Kerberos、LDAP 或 HTTP Basic Auth 身份验证的 Amazon EMR 集群
将用户凭证传递给经过 Kerberos、LDAP 或 HTTP Basic Auth 身份验证的 Amazon EMR 集群

要与使用 Kerberos、LDAP 或 HTTP 基本身份验证的 Amazon EMR 集群建立安全连接，您可以使用 Amazon Secrets Manager 向您的连接命令传递用户证书。有关如何创建 Secrets Manager 密钥的信息，请参阅[创建 Amazon Secrets Manager 密钥](https://docs.amazonaws.cn/secretsmanager/latest/userguide/create_secret.html)。您的密文必须包含用户名和密码。您通过 `--secrets` 参数传递密钥，如以下示例所示：

```
%sm_analytics emr connect --cluster-id j_abcde12345 
    --auth Kerberos 
    --secret aws_secret_id_123
```

您的管理员可以使用 attribute-based-access-control (ABAC) 方法设置灵活的访问策略，该方法根据特殊标签分配访问权限。您可以设置灵活的访问权限，为账户中的所有用户创建单个密钥，或为每个用户分别创建一个密钥。以下代码示例演示了这些场景：

**为账户中的所有用户创建单个密钥**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190101T012345"
            },
            "Action": "secretsmanager:GetSecretValue",
            "Resource": [
                "arn:aws:secretsmanager:us-west-2:111122223333:secret:aes123-1a2b3c",
                "arn:aws:secretsmanager:us-west-2:111122223333:secret:aes456-4d5e6f",
                "arn:aws:secretsmanager:us-west-2:111122223333:secret:aes789-7g8h9i"
            ]
        }
    ]
}
```

------

**为每个用户分别创建不同的密钥**

您可以使用 `PrincipleTag` 标签分别为每个用户创建不同的密钥，如以下示例所示：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190101T012345"
            },
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/user-identity": "${aws:PrincipalTag/user-identity}"
                }
            },
            "Action": "secretsmanager:GetSecretValue",
            "Resource": [
                "arn:aws:secretsmanager:us-west-2:111122223333:secret:aes123-1a2b3c",
                "arn:aws:secretsmanager:us-west-2:111122223333:secret:aes456-4d5e6f",
                "arn:aws:secretsmanager:us-west-2:111122223333:secret:aes789-7g8h9i"
            ]
        }
    ]
}
```

------

# Amazon SageMaker Studio 中的笔记本职位详情
Studio 中的笔记本作业详情

SageMaker Notebook Jobs 仪表板有助于组织您安排的作业定义，还可以跟踪根据您的作业定义运行的实际作业。计划笔记本作业时，需要了解两个重要概念：*作业定义*和*作业运行*。作业定义是您为运行特定笔记本而设置的计划。例如，您可以创建一个每周三运行笔记本 XYZ.ipynb 的作业定义。此作业定义会启动本周三、下周三、下下周三（依此类推）发生的实际作业运行。

**注意**  
P SageMaker ython SDK 笔记本作业步骤不会创建作业定义。不过，您可以在笔记本作业控制面板中查看您的作业。如果您在 JupyterLab 环境中安排作业，则作业和作业定义都可用。

该界面提供两个主要选项卡，可帮助您跟踪现有的作业定义和作业运行：
+ **笔记本作业**选项卡：此选项卡显示按需作业和作业定义中所有作业运行的列表。在此选项卡中，您可以直接访问单个作业运行的详细信息。例如，您可以查看两个星期三前发生的单个作业运行。
+ **笔记本作业定义**选项卡：此选项卡显示所有作业定义的列表。在此选项卡中，您可以直接访问单个作业定义的详细信息。例如，您可以查看创建的每周三运行 XYZ.ipynb 的计划。

有关**笔记本作业**选项卡的详细信息，请参阅[查看笔记本作业](view-notebook-jobs.md)。

有关**笔记本作业定义**选项卡的详细信息，请参阅[查看笔记本作业定义](view-def-detail-notebook-auto-run.md)。

# 查看笔记本作业
查看笔记本作业

**注意**  
如果您从 Studio UI 计划了笔记本作业，则可以自动查看笔记本作业。如果您使用 SageMaker Python SDK 来调度笔记本作业，则需要在创建笔记本作业步骤时提供其他标签。有关更多信息，请参阅 [在 Studio UI 面板上查看笔记本作业](create-notebook-auto-run-sdk.md#create-notebook-auto-run-dash)。

下一主题将介绍**笔记本作业**选项卡以及如何查看单个笔记本作业的详细信息。**笔记本作业**选项卡（通过选择 Studio 工具栏上的**创建笔记本作业**图标 (![\[Blue icon of a calendar with a checkmark, representing a scheduled task or event.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/icons/notebook-schedule.png)) 来访问）显示了按需作业的历史记录，以及根据创建的作业定义运行的所有作业。此选项卡会在您创建按需作业后打开，您也可以自己查看此选项卡，查看过去和当前作业的历史记录。如果您为任何作业选择**作业名称**，则可以在其**作业详细信息**页面中查看单个作业的详细信息。有关**作业详细信息**页面的更多信息，请参阅下一节[查看单个作业](#view-jobs-detail-notebook-auto-run)。

**笔记本作业**选项卡包含每个作业的以下信息：
+ **输出文件**：显示输出文件的可用性。此列可能包含以下内容之一：
  + 下载图标 (![\[Cloud icon with downward arrow, representing download or cloud storage functionality.\]](http://docs.amazonaws.cn/sagemaker/latest/dg/images/icons/File_download.png))：输出笔记本和日志可供下载，选择此按钮即可下载。请注意，如果失败发生在文件创建之后，则失败的作业仍可生成输出文件。在这种情况下，查看输出笔记本有助于确定故障点。
  + 指向**笔记本**和**输出日志**的链接：已下载笔记本和输出日志。选择链接以查看其内容。
  + （空白）：作业已被用户停止，或者作业运行失败而无法生成输出文件。例如，网络故障可能会使作业无法启动。

  输出笔记本是运行笔记本中所有单元格的结果，同时也包含了您加入的任何新参数或覆盖的参数或环境变量。输出日志会捕获作业运行的详细信息，以帮助您对失败的作业进行问题排查。
+ **创建时间：**按需作业或计划作业的创建时间。
+ **状态**：作业的当前状态，可为下列状态之一：
  + **正在进行**：作业正在运行
  + **失败**：作业因配置或笔记本逻辑错误而失败
  + **已停止**：作业已被用户停止
  + **已完成**：作业已完成
+ **操作**：此列提供快捷方式，可帮助您直接在界面中停止或删除任何作业。

## 查看单个作业
查看单个作业

在**笔记本作业**选项卡中，您可以选择一个作业名称以查看特定作业的**作业详细信息**页面。**作业详细信息**页面包含您在**创建作业**表单中提供的所有详细信息。使用此页可以确认您在创建作业定义时指定的设置。

此外，您还可以访问快捷方式来帮助在页面本身中执行以下操作：
+ **删除作业**：从**笔记本作业**选项卡中删除作业。
+ **停止作业**：停止正在运行的作业。

# 查看笔记本作业定义
查看笔记本作业定义

**注意**  
如果您使用 SageMaker Python SDK 安排了笔记本作业，请跳过此部分。只有在 Studio 或本地 JupyterLab 环境中创建的笔记本作业才能创建作业定义。因此，如果您使用 SageMaker Python SDK 创建了笔记本作业，则不会在 “笔记本作业” 控制面板中看到作业定义。不过，您可以按照 [查看笔记本作业](view-notebook-jobs.md) 中的说明查看笔记本作业。

创建作业定义时，您可以为作业创建计划。**Notebook Job Definitions** 选项卡列出了这些计划以及有关特定笔记本作业定义的信息。例如，您可以创建每分钟运行特定笔记本的作业定义。激活此作业定义后，**笔记本作业**选项卡中每分钟都会显示一个新作业。下页将介绍有关 **Notebook Job Definitions** 选项卡的信息，以及如何查看笔记本作业定义。

**笔记本作业定义**选项卡显示一个包含所有作业定义的控制面板，其中包括输入笔记本、创建时间、计划和每个作业定义的状态。**状态**列中的值为以下值之一：
+ **已暂停**：您已暂停作业定义。在您恢复定义之前，Studio 不会启动任何作业。
+ **激活**：计划已开启，Studio 可以根据您指定的计划运行笔记本。

此外，**操作**列还提供快捷方式，可帮助您直接在界面中执行以下任务：
+ 暂停：暂停作业定义。在您恢复定义之前，Studio 不会创建任何作业。
+ 删除：从**笔记本作业定义**选项卡中删除作业定义。
+ 恢复：继续已暂停的作业定义，以便启动作业。

如果您创建了作业定义但它没有启动作业，请参阅[问题排查指南](notebook-auto-run-troubleshoot.md)中的[作业定义不会创建作业](notebook-auto-run-troubleshoot.md#notebook-auto-run-troubleshoot-no-jobs)。

## 查看单个作业定义
查看单个作业定义

如果在**笔记本作业定义**选项卡中选择作业定义名称，则会显示**作业定义**页面，您可以在其中查看作业定义的特定详细信息。使用此页可以确认您在创建作业定义时指定的设置。如果没有看到根据作业定义创建的任何作业，请参阅[问题排查指南](notebook-auto-run-troubleshoot.md)中的[作业定义不会创建作业](notebook-auto-run-troubleshoot.md#notebook-auto-run-troubleshoot-no-jobs)。

本页还包含一个部分，其中列出了根据此作业定义运行的作业。相比在**笔记本作业**选项卡（汇总了所有作业定义中的所有作业）中查看作业，在**作业定义**页面中查看作业可以更有效地帮助您整理作业。

此外，该页面还提供以下操作的快捷方式：
+ **暂停/恢复**：暂停您的作业定义，或恢复已暂停的定义。请注意，如果当前正在运行针对此定义的作业，Studio 不会将其停止。
+ **运行**：根据此作业定义运行单个按需作业。通过此选项，您还可以在启动作业之前为笔记本指定不同的输入参数。
+ **编辑作业定义**：更改作业定义的计划。您可以选择不同的时间间隔，也可以选择使用 cron 语法的自定义计划。
+ **删除作业定义**：从**笔记本作业定义**选项卡中删除作业定义。请注意，如果当前正在运行针对此定义的作业，Studio 不会将其停止。

# 问题排查指南
故障排除指南

请参阅此问题排查指南，以帮助调试在计划的笔记本作业运行时可能遇到的故障。

## 作业定义不会创建作业
作业定义不会创建作业

如果您的任务定义未启动任何作业，则笔记本或培训作业可能不会显示在 Amazon SageMaker Studio 左侧导航栏的 “**作业**” 部分中。如果是这种情况，您可以在 Studio 左侧导航栏的 **Pipelines** 部分找到错误信息。每个笔记本或训练作业定义都属于一个执行管道。以下是无法启动笔记本作业的常见原因。

**缺少权限**
+ 分配给任务定义的角色与 Amazon 没有信任关系 EventBridge。也就是说， EventBridge 不能担任该角色。
+ 分配给作业定义的角色没有调用 `SageMaker AI:StartPipelineExecution` 的权限。
+ 分配给作业定义的角色没有调用 `SageMaker AI:CreateTrainingJob` 的权限。

**EventBridge 已超出配额**

如果您看到如下例所示的`Put*`错误，则说明您已超出 EventBridge配额。要解决这个问题，你可以清理未使用的 EventBridge 运行次数，或者 Amazon Web Services 支持 要求增加配额。

```
LimitExceededException) when calling the PutRule operation: 
The requested resource exceeds the maximum number allowed
```

有关 EventBridge 配额的更多信息，请参阅 [Amazon EventBridge 配额](https://docs.amazonaws.cn/eventbridge/latest/userguide/eb-quota.html)。

**已超出管道配额限制**

如果您看到如下例所示的错误，则说明已超出可运行的管道数量。要解决此问题，您可以清理账户中未使用的管道，也可以要求 Amazon Web Services 支持 增加配额。

```
ResourceLimitExceeded: The account-level service limit 
'Maximum number of pipelines allowed per account' is XXX Pipelines, 
with current utilization of XXX Pipelines and a request delta of 1 Pipelines.
```

有关管道配额的更多信息，请参阅 [Amazon A SageMaker I 终端节点和配额](https://docs.amazonaws.cn/general/latest/gr/sagemaker.html)。

**已超出训练作业限制**

如果您看到如下例所示的错误，则说明已超出可运行的训练作业数量。要解决这个问题，请减少账户中的培训任务数量，或者 Amazon Web Services 支持 要求增加配额。

```
ResourceLimitExceeded: The account-level service limit 
'ml.m5.2xlarge for training job usage' is 0 Instances, with current 
utilization of 0 Instances and a request delta of 1 Instances. 
Please contact Amazon support to request an increase for this limit.
```

有关训练作业配额的更多信息，请参阅 [Amazon A SageMaker I 终端节点和配额](https://docs.amazonaws.cn/general/latest/gr/sagemaker.html)。

## 在笔记本中 SparkMagic 禁用自动可视化


如果您的 notebook 使用 SparkMagic PySpark 内核，并且您将 notebook 作为 Notebook Job 运行，则可能会在输出中看到自动可视化已被禁用。打开自动可视化功能会导致内核挂起，因此笔记本作业执行器目前禁用自动可视化功能作为一种变通办法。

# 约束和注意事项
约束和注意事项

请查看以下约束，确保您的笔记本作业成功完成。Studio 使用 Papermill 来运行笔记本。您可能需要更新 Jupyter 笔记本以符合 Papermill 的要求。LCC 脚本内容以及需要了解的有关 VPC 配置的重要细节也存在限制。

## JupyterLab 版本


JupyterLab 支持 4.0 版。

## 安装需要重启内核的软件包


Papermill 不支持调用 `pip install` 来安装需要重启内核的软件包。在这种情况下，请在初始化脚本中使用 `pip install`。对于不需要重启内核的软件包安装，您仍可在笔记本中包含 `pip install`。

## 在 Jupyter 中注册的内核和语言名称


Papermill 为特定内核和语言注册了一个转换器。如果您自带实例 (BYOI)，请使用标准内核名称，如以下代码片段所示：

```
papermill_translators.register("python", PythonTranslator)
papermill_translators.register("R", RTranslator)
papermill_translators.register("scala", ScalaTranslator)
papermill_translators.register("julia", JuliaTranslator)
papermill_translators.register("matlab", MatlabTranslator)
papermill_translators.register(".net-csharp", CSharpTranslator)
papermill_translators.register(".net-fsharp", FSharpTranslator)
papermill_translators.register(".net-powershell", PowershellTranslator)
papermill_translators.register("pysparkkernel", PythonTranslator)
papermill_translators.register("sparkkernel", ScalaTranslator)
papermill_translators.register("sparkrkernel", RTranslator)
papermill_translators.register("bash", BashTranslator)
```

## 参数和环境变量限制


**参数和环境变量限制。**当您创建笔记本作业时，它会收到您指定的参数和环境变量。最多可以传递 100 个参数。每个参数名称的长度最多为 256 个字符，关联值的长度最多为 2500 个字符。如果传递环境变量，则最多可以传递 28 个变量。变量名称和关联值长度最多为 512 个字符。如果需要超过 28 个环境变量，请在初始化脚本中使用其他环境变量，该脚本对于可以使用的环境变量数量没有限制。

## 查看作业和作业定义


**查看作业和作业定义。**如果您在笔记本的 Studio 用户界面中安排 JupyterLab 笔记本作业，则可以在 Studio 用户界面中[查看笔记本作业](https://docs.amazonaws.cn/sagemaker/latest/dg/view-notebook-jobs.html)[和笔记本作业定义](https://docs.amazonaws.cn/sagemaker/latest/dg/view-def-detail-notebook-auto-run.html)。如果您使用 SageMaker Python SDK 安排了笔记本作业，则只能查看作业， SageMaker Python SDK 笔记本作业步骤不会创建作业定义。要查看作业，还需要为笔记本作业步骤实例提供附加标记。有关更多信息，请参阅 [在 Studio UI 面板上查看笔记本作业](create-notebook-auto-run-sdk.md#create-notebook-auto-run-dash)。

## Image


您需要根据在 Studio 中运行笔记本作业还是在管道中运行 SageMaker Python SDK 笔记本作业步骤来管理图像限制。

### SageMaker AI 笔记本作业（Studio）的图像限制


**映像和内核支持。**启动笔记本作业的驱动程序假设以下条件：
+ 基本 Python 运行时环境安装在 Studio 或 bring-your-own (BYO) 映像中，并且是外壳中的默认运行环境。
+ 基本 Python 运行时环境包含正确配置了内核规格的 Jupyter 客户端。
+ 基本 Python 运行时环境包含 `pip` 函数，因此笔记本作业可以安装系统依赖项。
+ 对于具有多个环境的映像，在安装笔记本专用软件包之前，您的初始化脚本应切换到适当的内核专用环境。配置完内核 Python 运行时环境后，如果与内核运行时环境不同，应切换回默认 Python 运行时环境。

启动笔记本作业的驱动程序是一个 bash 脚本，Bash v4 必须位于 /bin/bash 下。

**已启用 bring-your-own-images (BYOI) 的 root 权限。**您必须对自己的 Studio 映像拥有根权限，无论作为根用户还是通过 `sudo` 访问。如果您不是根用户，但通过 `sudo` 访问根权限，请使用 **1000/100** 作为 `UID/GID`。

### SageMaker AI Python SDK 笔记本作业的图像限制


笔记本作业步骤支持以下映像：
+ SageMaker 中列出的分发映像[亚马逊 SageMaker 图片可用于 Studio Classic 笔记本电脑](notebooks-available-images.md)。
+ 基于前面列表中的 SageMaker 分发映像的自定义镜像。使用[SageMaker 分发图像](https://github.com/aws/sagemaker-distribution)作为基础。
+ 预先安装的带有笔记本作业依赖关系的自定义镜像 (BYOI)（即. [sagemaker-headless-execution-driver](https://pypi.org/project/sagemaker-headless-execution-driver/) 您的映像必须符合以下要求：
  + 该映像已预装了笔记本作业依赖项。
  + 已安装基本 Python 运行时环境，并默认为 shell 环境。
  + 基本 Python 运行时环境包含正确配置了内核规格的 Jupyter 客户端。
  + 您拥有根用户权限或 `sudo` 访问权限。如果您不是根用户，但通过 `sudo` 访问根权限，请使用 **1000/100** 作为 `UID/GID`。

## 作业创建期间使用的 VPC 子网


如果您使用 VPC，Studio 会使用您的私有子网来创建作业。指定 1 至 5 个私有子网（以及 1 至 15 个安全组）。

如果您使用带有私有子网的 VPC，则必须选择以下选项之一，以确保笔记本作业可以连接到从属服务或资源：
+ 如果任务需要访问支持接口 VPC 终端节点的 Amazon 服务，请创建一个终端节点来连接到该服务。有关支持接口端点的服务列表，请参阅[与集成的Amazon 服务 Amazon PrivateLink](https://docs.amazonaws.cn/vpc/latest/privatelink/aws-services-privatelink-support.html)。有关创建接口 VPC 终端节点的信息，请参阅[使用接口 VPC 终端节点访问 Amazon 服务](https://docs.amazonaws.cn/vpc/latest/privatelink/create-interface-endpoint.html)。必须至少提供 Amazon S3 VPC 端点网关。
+ 如果笔记本作业需要访问不支持接口 VPC 终端节点的 Amazon 服务或外部的资源 Amazon，请创建 NAT 网关并将您的安全组配置为允许出站连接。有关为 VPC 设置 NAT 网关的信息，请参阅《Amazon Virtual Private Cloud 用户指南》[https://docs.amazonaws.cn/vpc/latest/userguide/what-is-amazon-vpc.html](https://docs.amazonaws.cn/vpc/latest/userguide/what-is-amazon-vpc.html)中的*带有公有子网和私有子网 (NAT) 的 VPC*。

## 服务限制


由于笔记本作业计划程序是基于 Pipelines、Trainin SageMaker g 和 Amazon EventBridge 服务构建的，因此您的笔记本作业受其服务特定配额的约束。如果超过这些配额，则可能会看到与这些服务相关的错误消息。例如，一次可以运行的管道数量以及可以为单个事件总线设置的规则数量都有限制。有关 SageMaker AI 配额的更多信息，请参阅 A [mazon A SageMaker I 终端节点和配额](https://docs.amazonaws.cn/general/latest/gr/sagemaker.html)。有关 EventBridge 配额的更多信息，请参阅 [Amazon EventBridge 配额](https://docs.amazonaws.cn/eventbridge/latest/userguide/eb-quota.html)。

# SageMaker 笔记本作业的定价


当你安排笔记本作业时，你的 Jupyter 笔记本会在 SageMaker 训练实例上运行。在**创建作业**表单中选择**映像**和**内核**后，该表单会提供可用计算类型的列表。您需要根据从作业定义运行的所有笔记本作业的综合使用时长，为所选的计算类型付费。如果您未指定计算类型， SageMaker AI 会为您分配默认 Amazon EC2 实例类型。`ml.m5.large`有关按计算类型划分的 SageMaker AI 定价明细，请参阅 [Amazon SageMaker AI 定价](https://www.amazonaws.cn/sagemaker/pricing)。

# 安排您的 ML 工作流程


借助 SageMaker Amazon AI，您可以在创建数据集、执行数据转换、根据数据构建模型以及将模型部署到终端节点进行推理时管理整个 ML 工作流程。如果定期执行工作流程中的任何子步骤，也可以选择按计划运行这些步骤。例如，你可能想在 SageMaker Canvas 中安排一个作业，每小时对新数据运行一次转换。在另一种情况下，您可能希望每周安排一次作业，以监控已部署模型的模型漂移。您可以指定任何时间间隔的循环计划--可以每秒、每分钟、每天、每周、每月或每月第三个星期五下午 3 点重复一次。

**以下场景总结了根据使用情况可供选择的方案。**
+ 使用场景 1：**在无代码环境中构建和调度 ML 工作流程**。对于初学者或 SageMaker AI 新手，您可以使用 Amazon SageMaker Canvas 来构建机器学习工作流程，也可以使用基于 Canvas 用户界面的计划程序创建计划运行。
+ 使用场景 2：**在单个 Jupyter Notebook 中构建工作流程，并使用无代码调度程序**。有经验的 ML 工作者可以使用代码在 Jupyter Notebook 中构建他们的 ML 工作流程，并使用笔记本作业工具提供的无代码调度选项。如果您的 ML 工作流程由多个 Jupyter Notebook 组成，您可以使用使用场景 3 中描述的 Pipelines Python SDK 中的调度功能。
+ 使用场景 3：**使用 Pipelines 构建并调度 ML 工作流程**。高级用户可以使用 Pipelin SageMaker es 提供的[亚马逊 SageMaker Python 软件开发工具包](https://sagemaker.readthedocs.io/en/stable)、Amazon Pipelines 可视化编辑器或 Amazon EventBridge 计划选项。您可以构建一个机器学习工作流程，其中包括使用各种 SageMaker AI 功能和 Amazon 服务（例如 Amazon EMR）进行操作的步骤。


| 描述符 | 应用场景 1 | 应用场景 2 | 使用案例 3 | 
| --- | --- | --- | --- | 
| SageMaker 人工智能功能 | Amazon SageMaker Canvas 数据处理和机器学习工作流程计划 | 笔记本作业时间表小工具（用户界面） | 管道 Python SDK 调度选项 | 
| 说明 | 借助 Amazon SageMaker Canvas，您可以安排数据处理步骤的自动运行，并在单独的过程中安排数据集的自动更新。您还可以通过设置配置，在特定数据集更新时运行批量预测，从而间接安排整个 ML 工作流程。对于自动数据处理和数据集更新，C SageMaker anvas 提供了一种基本表单，您可以在其中选择开始时间和日期以及两次运行之间的时间间隔（如果您计划数据处理步骤，则可以选择 cron 表达式）。有关如何安排数据处理步骤的更多信息，请参阅 [创建自动处理新数据的计划](canvas-data-export-schedule-job.md)。有关如何安排数据集和批量预测更新的更多信息，请参阅 [如何管理自动化](canvas-manage-automations.md)。 | 如果在单个 Jupyter Notebook 中构建了数据处理和管道工作流程，则可以使用笔记本作业工具按需或按计划运行笔记本。笔记本作业 Widget 会显示一个基本表单，您可在其中指定计算类型、运行计划和可选自定义设置。您可以通过选择时间间隔或插入 cron 表达式来定义运行计划。该小组件会自动安装在 Studio 中，或者您可以执行其他安装以在本地 JupyterLab 环境中使用此功能。有关笔记本作业的更多信息，请参阅 [SageMaker 笔记本职位](notebook-auto-run.md)。 | 如果您使用 Pipelines 实现了机器学习工作流程，则可以使用 SageMaker 软件开发工具包中的计划功能。您的管道可以包括微调、数据处理和部署等步骤。管道支持两种计划管道的方式。您可以创建亚马逊 EventBridge 规则，也可以使用 SageMaker 软件开发工具包[PipelineSchedule](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.triggers.PipelineSchedule)构造函数或 Amazon Pip SageMaker elines 可视化编辑器来定义计划。有关 Pipelines 中可用调度选项的更多信息，请参阅 [安排管道运行](pipeline-eventbridge.md)。 | 
| 优化 | 为 C SageMaker anvas ML 工作流程提供计划选项 | 为基于 Jupyter Notebook 的 ML 工作流程提供基于 UI 的调度选项 | 为 ML 工作流程提供 SageMaker SDK 或 EventBridge 计划选项 | 
| 注意事项 | 您可以使用 Canvas 无代码框架安排工作流程，但数据集更新和批量转换更新最多可处理 5GB 数据。 | 您可以使用基于用户界面的计划表安排一个笔记本，但不能在同一作业中安排多个笔记本。要调度多个笔记本，请使用使用场景 3 中描述的基于 Pipelines SDK 代码的解决方案。 | 您可以使用 Pipelines 提供的更高级（基于 SDK 的）调度功能，但需要参考 API 文档来指定正确的选项，而不是从基于用户界面的选项菜单中选择。 | 
| 建议的环境 | 亚马逊 SageMaker Canvas | 工作室，当地 JupyterLab 环境 | Studio、本地 JupyterLab 环境、任何代码编辑器 | 

## 其他资源


**SageMaker AI 提供了以下用于安排工作流程的其他选项。**
+ [什么是 Amazon EventBridge 日程安排？](https://docs.amazonaws.cn/scheduler/latest/UserGuide/what-is-scheduler.html) 。本节中讨论的计划选项包括 C SageMaker anvas、Studio 和 SageMaker AI Python SDK 中提供的预建选项。所有选项都扩展了 Amazon 的功能 EventBridge，您还可以使用创建自己的自定义日程安排解决方案 EventBridge。
+ [特征处理器管道的计划执行和基于事件的执行](feature-store-feature-processor-schedule-pipeline.md)。 借助 Amazon F SageMaker eature Store 功能处理，您可以将要素处理管道配置为按计划运行或作为其他 Amazon 服务事件的结果运行。

# Amazon Batch 支持 A SageMaker I 训练作业
Amazon Batch 为培训工作提供支持

[Amazon Batch 作业队列](https://docs.amazonaws.cn/batch/latest/userguide/job_queues.html)会在提交的作业在计算资源上运行之前，对其进行存储并确定优先级。您可以将 SageMaker AI 训练作业提交到作业队列，以便利用提供的无服务器作业计划和优先级划分工具。 Amazon Batch

## 工作原理


以下步骤描述了如何将 Amazon Batch 作业队列与 SageMaker AI 训练作业配合使用的工作流程。有关更详细的教程和示例笔记本，请参阅[开始使用](#training-job-queues-get-started)部分。
+ 设置 Amazon Batch 和任何必要的权限。有关更多信息，请参阅《Amazon Batch 用户指南》**中的[设置 Amazon Batch](https://docs.amazonaws.cn/batch/latest/userguide/get-set-up-for-aws-batch.html)。
+ 在控制台中或使用创建以下 Amazon Batch 资源 Amazon CLI：
  + [服务环境](https://docs.amazonaws.cn/batch/latest/userguide/service-environments.html)-包含用于与 SageMaker AI 集成的配置参数。
  + [SageMaker AI 训练作业队列](https://docs.amazonaws.cn/batch/latest/userguide/create-sagemaker-job-queue.html) — 与 SageMaker AI 集成以提交训练作业。
+ 配置您的详细信息并请求 A SageMaker I 训练作业，例如您的训练容器镜像。要向 Amazon Batch 队列提交训练作业，你可以使用 适用于 Python (Boto3) 的 Amazon SDK、或 SageMaker AI Python SDK。 Amazon CLI
+ 将训练作业提交到作业队列。您可以使用以下选项来提交作业：
  + 使用 Amazon Batch [SubmitServiceJob](https://docs.amazonaws.cn/batch/latest/APIReference/API_SubmitServiceJob.html) API。
  + 使用 SageMaker AI Python 软件开发工具包中的[`aws_batch`模块](https://github.com/aws/sagemaker-python-sdk/tree/master/src/sagemaker/aws_batch)。创建 TrainingQueue 对象和模型训练对象（例如 Estimator 或 ModelTrainer）后，您可以使用 TrainingQueue 方法向提交训练作业。`queue.submit()`
+ 提交作业后，使用 Amazon Batch 控制台、API 或 SageMaker A Amazon Batch [DescribeServiceJob[DescribeTrainingJob](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribeTrainingJob.html)](https://docs.amazonaws.cn/batch/latest/APIReference/API_DescribeServiceJob.html)I API 查看您的任务队列和任务状态。

## 成本和可用性


有关训练作业的详细定价信息，请参阅 [Amazon A SageMaker I 定价](https://www.amazonaws.cn/sagemaker-ai/pricing/)。使用 Amazon Batch，您只需为使用的任何 Amazon 资源（例如 Amazon EC2 实例）付费。有关更多信息，请参阅[Amazon Batch 定价](https://www.amazonaws.cn/batch/pricing/)。

您可以在任何有训练作业 Amazon Web Services 区域 的地方用 Amazon Batch 于 SageMaker AI 训练作业。有关更多信息，请参阅 [Amazon A SageMaker I 终端节点和配额](https://docs.amazonaws.cn/general/latest/gr/sagemaker.html)。

为了确保在需要时拥有所需的容量，您可以使用 SageMaker AI 灵活训练计划 (FTP)。这些计划可让您为训练作业预留容量。与 Amazon Batch的排队功能结合使用时，您可以在计划有效期内最大限度地提高利用率。有关更多信息，请参阅[为您预留训练任务或 HyperPod 集群的训练计划](https://docs.amazonaws.cn/sagemaker/latest/dg/reserve-capacity-with-training-plans.html)。

## 开始使用


有关如何设置 Amazon Batch 作业队列和提交 SageMaker AI 训练作业的教程，请参阅*Amazon Batch 用户指南*中的 [ SageMaker AI 入门](https://docs.amazonaws.cn/batch/latest/userguide/getting-started-sagemaker.html)。 Amazon Batch 

有关展示如何在 AI Py SageMaker thon SDK 中使用该`aws_batch`模块的 Jupyter 笔记本，请参阅存储库[Amazon Batch 中的 SageMaker AI Training 作业笔记本示例](https://github.com/aws/amazon-sagemaker-examples/tree/default/%20%20%20%20%20%20build_and_train_models/sm-training-queues)。 amazon-sagemaker-examples GitHub 