

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

# 笔记本作业工作流程
<a name="create-notebook-auto-run-dag"></a>

由于笔记本作业运行的是自定义代码，因此您可以创建一个包含一个或多个笔记本作业步骤的管道。智能语言工作流程通常包含多个步骤，例如预处理数据的处理步骤、建立模型的训练步骤以及模型评测步骤等等。笔记本作业的一个可能用途是处理预处理：您可能有一个笔记本来执行数据转换或摄取，一个 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)。

# 笔记本步骤之间的信息传递
<a name="create-notebook-auto-run-dag-seq"></a>

以下章节介绍了以环境变量和参数形式向笔记本传递信息的方法。

## 传递环境变量
<a name="create-notebook-auto-run-dag-seq-env-var"></a>

如下例所示，将环境变量作为字典传递给 `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')}")
```

## 传递参数
<a name="create-notebook-auto-run-dag-seq-param"></a>

将参数传递给 `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}')
```

## 检索前一步的信息
<a name="create-notebook-auto-run-dag-seq-interstep"></a>

下面将讨论如何从上一个步骤中提取数据，并将其传递到笔记本作业步骤中。

**使用 `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" 
       }
   )
   ```

# 在笔记本作业中调用另一个笔记本
<a name="create-notebook-auto-run-dag-call"></a>

您可以设置一个管道，让一个笔记本作业调用另一个笔记本。下面是一个带有笔记本作业步骤的管道示例，其中笔记本调用了另外两个笔记本。输入笔记本包含以下几行：

```
%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,
)
```