

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

# 使用 SageMaker AI Python SDK 示例创建笔记本作业
<a name="create-notebook-auto-run-sdk"></a>

要使用 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)

## 创建笔记本作业的步骤
<a name="create-notebook-auto-run-overall"></a>

您可以创建一个立即运行或按计划运行的笔记本作业。以下说明介绍了这两种方法。

**要计划笔记本作业，请完成以下基本步骤：**

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.aws.amazon.com/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 面板上查看笔记本作业
<a name="create-notebook-auto-run-dash"></a>

如果您指定了某些标签，作为管道步骤创建的笔记本作业就会出现在 Studio 笔记本作业控制面板中。

**注意**  
只有在 Studio 或本地 JupyterLab 环境中创建的笔记本作业才能创建作业定义。因此，如果您使用 SageMaker Python SDK 创建笔记本作业，则在 “笔记本作业” 控制面板中看不到作业定义。不过，您可以按照 [查看笔记本作业](view-notebook-jobs.md) 中的说明查看笔记本作业。

您可以使用以下标签控制哪些团队成员可以查看您的笔记本作业：
+ 要将笔记本显示到域中的所有用户配置文件或[空格](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-jl-user-guide.html)，请使用域添加域标签。下面展示了一个示例：
  + 键：`sagemaker:domain-name`，值：`d-abcdefghij5k`
+ 要向域中的某个用户配置文件显示笔记本作业，请同时添加用户配置文件和域标签。用户配置文件标签示例如下：
  + 键：`sagemaker:user-profile-name`，值：`studio-user`
+ 要将笔记本作业显示为[空格](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-jl-user-guide.html)，请同时添加空格和域标签。空格标签示例如下：
  + 键：`sagemaker:shared-space-name`，值：`my-space-name`
+ 如果不附加任何域、用户配置文件或空间标签，Studio UI 就不会显示管道步骤创建的笔记本作业。在这种情况下，您可以在训练作业管理控制台中查看基础训练作业，也可以在[管道执行列表](https://docs.aws.amazon.com/sagemaker/latest/dg/pipelines-studio-view-execution.html)中查看状态。

一旦设置了在控制面板上查看作业所需的标签，请参阅 [查看笔记本作业](view-notebook-jobs.md) 了解如何查看作业和下载输出结果。

## 在 Studio 中查看管道图
<a name="create-notebook-auto-run-graph"></a>

由于笔记本作业步骤是管道的一部分，因此可以在 Studio 中查看管道图 (DAG)。在管道图中，您可以查看管道运行的状态，并跟踪管道沿线。有关更多信息，请参阅 [查看管道运行的详细信息](pipelines-studio-view-execution.md)。

## 向笔记本传递参数
<a name="create-notebook-auto-run-passparam"></a>

如果您要向笔记本作业传递参数（使用 `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 集群
<a name="create-notebook-auto-run-emr"></a>

如果您通过 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 集群**。您必须通过 AWS Secrets Manager传递用户凭证。

## 设置默认选项
<a name="create-notebook-auto-run-intdefaults"></a>

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'
```