

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Pipelines 動作
<a name="pipelines-build"></a>

您可以使用 Amazon SageMaker Pipelines Python SDK 或 Amazon SageMaker Studio 中的拖放視覺化設計工具來編寫、檢視、編輯、執行和監控您的 ML 工作流程。

下列螢幕擷取畫面顯示您可以用來建立和管理 Amazon SageMaker Pipelines 的視覺化設計工具。

![\[Studio 中 Pipelines 視覺化拖放介面的螢幕擷取畫面。\]](http://docs.aws.amazon.com/zh_tw/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)

# 定義管道
<a name="define-pipeline"></a>

若要使用 Amazon SageMaker Pipelines 協調您的工作流程，您必須以 JSON 管道定義的形式產生有向無環圖 (DAG)。DAG 指定 ML 程序中涉及的不同步驟，例如資料預先處理、模型訓練、模型評估和模型部署，以及這些步驟之間的相依性和資料流程。下列主題說明如何產生管道定義。

您可以使用 SageMaker Python SDK 或 Amazon SageMaker Studio 中的視覺化拖放管道設計工具功能來產生 JSON 管道定義。下圖是您在本教學課程中建立的管道 DAG 表示法：

![\[Studio 中 Pipelines 視覺化拖放介面的螢幕擷取畫面。\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/pipelines/pipelines-studio-overview.png)


您在下列各節中定義的管道可解決迴歸問題，以根據鮑魚的物理測量值確定其年齡。如需包含本教學課程中內容的可執行 Jupyter 筆記本，請參閱[使用 Amazon SageMaker 模型建構管道協調任務](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-pipelines/tabular/abalone_build_train_deploy/sagemaker-pipelines-preprocess-train-evaluate-batch-transform.html)。

**注意**  
您可以將模型位置參照為訓練步驟的屬性，如 Github 中的端對端範例 [CustomerChurn 管道](https://github.com/aws-samples/customer-churn-sagemaker-pipelines-sample/blob/main/pipelines/customerchurn/pipeline.py)所示。

**Topics**

## 定義管道 (管道設計工具)
<a name="create-pipeline-designer"></a>

下列逐步解說會引導您完成使用拖放管道設計工具建立準系統管道的步驟。如果您需要隨時在視覺化設計工具中暫停或結束管道編輯工作階段，請按一下**匯出**選項。這可讓您將管道的目前定義下載到本機環境。稍後，當您想要繼續管道編輯程序時，您可以將相同的 JSON 定義檔案匯入至視覺化設計工具。

### 建立處理步驟
<a name="create-processing-step"></a>

若要建立資料處理任務步驟，請執行下列動作：

1. 遵循 [啟動 Amazon SageMaker Studio](studio-updated-launch.md) 中的指示開啟 Studio 主控台。

1. 在左側導覽窗格中，選取**管道**。

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)。

### 建立訓練步驟
<a name="create-training-step"></a>

若要設定模型訓練步驟，請執行下列動作：

1. 在左側邊欄中，選擇**訓練模型**並將其拖曳至畫布。

1. 在畫布中，選擇您新增的**訓練模型**步驟。

1. 若要新增輸入資料集，請在右側邊欄的**資料 (輸入)** 下選擇**新增**，然後選取資料集。

1. 若要選擇一個位置以儲存您的模型成品，請在**位置 (S3 URI)** 欄位中輸入 Amazon S3 URI，或選擇**瀏覽 S3** 以導覽至目的地位置。

1. 完成右側邊欄中的其餘欄位。如需這些標籤中欄位的相關資訊，請參閱 [sagemaker.workflow.steps.TrainingStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.TrainingStep)。

1. 按一下游標並將其從您在上一節中新增的**處理資料**步驟拖曳至**訓練模型**步驟，以建立連線這兩個步驟的邊緣。

### 使用註冊模型步驟建立模型套件
<a name="create-register-model-step"></a>

若要使用模型註冊步驟建立模型套件，請執行下列動作：

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. 按一下游標並將其從您在上一節中新增的**訓練模型**步驟拖曳至**註冊模型**步驟，以建立連線這兩個步驟的邊緣。

### 使用部署模型 (端點) 步驟將模型部署至端點
<a name="create-deploy-endpoint-step"></a>

若要使用模型部署步驟部署您的模型，請執行下列動作：

1. 在左側邊欄中，選擇**部署模型 (端點)** 並將其拖曳至畫布。

1. 在畫布中，選擇您新增的**部署模型 (端點)** 步驟。

1. 若要選擇要部署的模型，請選擇**模型 (輸入)** 下的**新增**。

1. 選擇**建立端點**選項按鈕以建立新的端點。

1. 為您的端點輸入**名稱**和**描述**。

1. 按一下游標並將其從您在上一節中新增的**註冊模型**步驟拖曳至**部署模型 (端點)** 步驟，以建立連線這兩個步驟的邊緣。

1. 完成右側邊欄中的其餘欄位。

### 定義管道參數
<a name="define-pipeline-parameters"></a>

您可以設定一組管道參數，其值可以在每次執行時更新。若要定義管道參數並設定預設值，請按一下視覺化設計工具底部的齒輪圖示。

### 儲存管道
<a name="save-pipeline"></a>

在您輸入了建立管道所需的所有必要資訊之後，請按一下視覺化設計工具底部的**儲存**。這會驗證您的管道在執行時期是否有任何潛在錯誤，並通知您。在您解決了自動驗證檢查所標記的所有錯誤之前，**儲存**操作不會成功。如果您想要稍後繼續編輯，您可以將進行中管道儲存為本機環境中的 JSON 定義。您可以按一下視覺化設計工具底部的**匯出**按鈕，將管道匯出為 JSON 定義檔案。稍後，若要繼續更新您的管道，請按一下**匯入**按鈕上傳該 JSON 定義檔案。

## 定義管道 (SageMaker Python SDK)
<a name="create-pipeline-wrap"></a>

### 先決條件
<a name="define-pipeline-prereq"></a>

 若要執行下列教學課程，請完成以下操作：
+ 依照[建立筆記本執行個體](https://docs.aws.amazon.com/sagemaker/latest/dg/howitworks-create-ws.html)中所述的內容，設定筆記本執行個體。這樣，您的角色將擁有讀取和寫入 Amazon S3 的許可，並能夠在 SageMaker AI 中建立訓練、批次轉換和處理任務。
+ 如[修改角色許可政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-modify_permissions-policy)所示，授予您的筆記本取得及傳遞其角色的權限。新增下列 JSON 程式碼片段，以將此政策附加到您的角色。以用來建立筆記本執行個體的 ARN 取代 `<your-role-arn>`。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "iam:GetRole",
                  "iam:PassRole"
              ],
              "Resource": "arn:aws:iam::111122223333:role/role-name"
          }
      ]
  }
  ```

------
+  遵循[修改角色信任政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-cli.html#roles-managingrole_edit-trust-policy-cli)中的步驟，信任 SageMaker AI 服務主體。將下列陳述式片段新增至角色的信任關係：

  ```
  {
        "Sid": "",
        "Effect": "Allow",
        "Principal": {
          "Service": "sagemaker.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
  ```

#### 設定您的環境
<a name="define-pipeline-prereq-setup"></a>

使用下列程式碼區塊建立新的 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"
```

### 建立管道
<a name="define-pipeline-create"></a>

**重要**  
允許 Amazon SageMaker Studio 或 Amazon SageMaker Studio Classic 建立 Amazon SageMaker 資源的自訂 IAM 政策也必須授與許可，才能將標籤新增至這些資源。需要將標籤新增至資源的許可，因為 Studio 和 Studio Classic 會自動標記它們建立的任何資源。如果 IAM 政策允許 Studio 和 Studio Classic 建立資源，但不允許標記，則在嘗試建立資源時可能會發生 "AccessDenied" 錯誤。如需詳細資訊，請參閱[提供標記 SageMaker AI 資源的許可](security_iam_id-based-policy-examples.md#grant-tagging-permissions)。  
提供許可來建立 SageMaker 資源的 [AWS Amazon SageMaker AI 的 受管政策](security-iam-awsmanpol.md) 已包含建立這些資源時新增標籤的許可。

從 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，該 ID 可以用來做為不同執行間的唯一識別碼。

#### 步驟 1：下載資料集
<a name="define-pipeline-data-download"></a>

此筆記本使用 UCI Machine Learning 鮑魚資料集。此資料集含下列功能：
+ `length` – 測量的最長鮑魚外殼尺寸。
+ `diameter` – 與長度垂直的鮑魚直徑。
+ `height` – 鮑魚殼中鮑魚肉的高度。
+ `whole_weight` – 整個鮑魚的重量。
+ `shucked_weight` – 從鮑魚中取出的肉的重量。
+ `viscera_weight` – 鮑魚內臟經過出血處理後的重量。
+ `shell_weight` – 除肉和乾燥後鮑魚殼的重量。
+ `sex` – 鮑魚的性別。'M'、'F' 或 'I' 之一，其中 'I' 表示幼鮑。
+ `rings` – 鮑魚殼上的環數。

使用公式 `age=rings + 1.5`，可以根據鮑魚殼上的環數得到鮑魚年齡的良好近似值。不過，取得此數字是非常耗時的任務。您必須沿著螺錐切割貝殼，染色切片，然後在顯微鏡下計算環數。不過，其他的物理測量值比較容易取得。這個筆記本使用資料集，透過其他物理量測建立一個預測環數的模型。

**下載資料集**

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：定義管道參數
<a name="define-pipeline-parameters"></a>

 此程式碼區塊會為您的管道定義下列參數：
+  `processing_instance_count` – 處理任務的執行個體計數。
+  `input_data` – 輸入資料的 Amazon S3 位置。
+  `batch_data` – 用於批次轉換之輸入資料的 Amazon S3 位置。
+  `model_approval_status` – 將已訓練模型進行 CI/CD 註冊的核准狀態。如需更多資訊，請參閱[使用 SageMaker 專案進行 MLOps 自動化](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：定義特徵工程的處理步驟
<a name="define-pipeline-processing-feature"></a>

本節展示如何建立處理步驟，以透過資料集準備用於進行訓練的資料。

**建立處理步驟**

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：定義訓練步驟
<a name="define-pipeline-training"></a>

本節展示如何使用 SageMaker AI [XGBoost 演算法](https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html)，根據處理步驟的訓練資料輸出訓練模型。

**定義訓練步驟**

1.  指定儲存訓練模型的模型路徑。

   ```
   model_path = f"s3://{default_bucket}/AbaloneTrain"
   ```

1. 設定 XGBoost 演算法和輸入資料集的估算器。訓練執行個體類型會傳遞至此估算器。典型的訓練指令碼：
   + 從輸入通道載入資料
   + 使用超參數設定訓練
   + 訓練模型
   + 將模型儲存至 `model_dir`，以便稍後可以託管該模型

   SageMaker AI 會在訓練任務結束時，以 `model.tar.gz` 形式將模型上傳至 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` 的屬性建立 `S3Uri`。以 `"train"` 和 `"validation"` 輸出通道的 `TrainingStep` 傳遞至 `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：定義處理步驟進行模型評估
<a name="define-pipeline-processing-model"></a>

本節將介紹如何建立處理步驟來評估模型的準確性。此模型評估的結果會用於條件步驟，以決定要採用的執行路徑。

**定義模型評估的處理步驟**

1. 在 `/abalone` 目錄中建立名為 `evaluation.py` 的檔案。此指令碼用於處理步驟，以執行模型評估。它會採用訓練過的模型和測試資料集作為輸入，然後生成一個包含分類評估指標的 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 進行批次轉換
<a name="define-pipeline-create-model"></a>

**重要**  
我們建議您使用 [模型步驟](build-and-manage-steps-types.md#step-type-model) 在 SageMaker Python SDK v2.90.0 及更高版本中建立模型。`CreateModelStep` 將會繼續在 SageMaker Python SDK 的先前版本中運作，但不再受到主動支援。

本節將說明如何從訓練步驟的輸出建立 SageMaker AI 模型。此模型用於根據新資料集進行批次轉換。此步驟會傳入條件步驟，且只有在條件步驟評估為 `true` 時才會執行。

**為批次轉換定義 CreateModelStep**

1.  建立 SageMaker AI 模型。從 `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. 使用 `CreateModelInput` 和您定義的 SageMaker AI 模型執行個體來建立 `CreateModelStep`。

   ```
   from sagemaker.workflow.steps import CreateModelStep
   
   
   step_create_model = CreateModelStep(
       name="AbaloneCreateModel",
       model=model,
       inputs=inputs,
   )
   ```

#### 步驟 7：定義 TransformStep 以執行批次轉換
<a name="define-pipeline-transform"></a>

本節展示如何在模型訓練後建立 `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 步驟以建立模型套件
<a name="define-pipeline-register"></a>

**重要**  
我們建議您使用 [模型步驟](build-and-manage-steps-types.md#step-type-model) 在 SageMaker Python SDK v2.90.0 及更高版本中註冊模型。`RegisterModel` 將會繼續在 SageMaker Python SDK 的先前版本中運作，但不再受到主動支援。

本節說明如何建立 `RegisterModel` 的執行個體。在管道中執行 `RegisterModel` 的結果是一個模型套件。模型套件是可重複使用的模型成品抽象，可封裝推論所需的所有元件。它由推論規格以及可選模型加權位置組成，推論規格會定義要使用的推論映像。模型套件群組是模型套件的集合。您可以針對 Pipelines 使用 `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：定義條件步驟以驗證模型準確性
<a name="define-pipeline-condition"></a>

`ConditionStep` 可讓 Pipelines 根據步驟屬性的條件，在您的管道 DAG 中支援條件式執行。在這種情況下，只有該模型準確性超過所需值時，您才會想要註冊模型套件。模型的準確性是由模型評估步驟決定。如果準確性超過所需值，管道也會建立 SageMaker AI 模型，並對資料集執行批次轉換。本節展示如何定義條件步驟。

**定義條件步驟以驗證模型準確性**

1.  使用模型評估計算處理步驟 `step_eval` 之輸出中的準確性值來定義 `ConditionLessThanOrEqualTo` 條件。使用處理步驟中編製索引的屬性檔案以及均方錯誤值 `"mse"` 的相應 JSONPath 來取得此輸出。

   ```
   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 步：建立管道
<a name="define-pipeline-pipeline"></a>

您現在已建立了所有步驟，接下來將它們合併到一個管道中。

**建立管道**

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)
<a name="collapsible-section-1"></a>

您也可以使用 [boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.create_pipeline) 或 [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-pipeline.html) 來建立管道。建立管道需要管道定義，這是用以定義管道每個步驟的 JSON 物件。SageMaker SDK 提供一種建構管道定義的簡單方法，您可以與先前提到的任何 API 搭配使用來建立管道本身。在不使用 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)

# 編輯管道
<a name="edit-pipeline-before-execution"></a>

若要在執行管道之前對其進行變更，請執行下列動作：

1. 請遵循[啟動 Amazon SageMaker Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-launch.html) 中的指示來開啟 SageMaker Studio。

1. 在 Studio 的左側導覽窗格中，選擇 **Pipelines**。

1. 選取管道名稱，以檢視相關管道的詳細資訊。

1. 選擇**執行**索引標籤。

1. 選取管道執行的名稱。

1. 選擇**編輯**以開啟管道設計工具。

1. 視需要更新步驟或步驟組態之間的邊緣，然後按一下**儲存**。

   編輯後儲存管道會自動產生新的版本編號。

1. 選擇**執行**。

# 執行管道
<a name="run-pipeline"></a>

將管道的步驟定義為有向無環圖 (DAG) 之後，您可以執行管道，其會執行 DAG 中定義的步驟。下列逐步解說為您展示如何使用 Amazon SageMaker Studio 中的拖放視覺化編輯器或 Amazon SageMaker Python SDK 來執行 Amazon SageMaker AI 管道。

## 執行管道 (管道設計工具)
<a name="run-pipeline-designer"></a>

若要啟動管道的新執行，請執行下列動作：

------
#### [ Studio ]

1. 請遵循[啟動 Amazon SageMaker Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-launch.html) 中的指示來開啟 SageMaker Studio。

1. 在左側導覽窗格中，選擇 **Pipelines** (管道)。

1. (選用) 若要依名稱篩選管道清單，請在搜尋欄位中輸入完整或部分管道名稱。

1. 選擇管道名稱以開啟管道詳細資訊檢視。

1. 選擇右上角的**視覺化編輯器**。

1. 若要從最新版本開始執行，請選擇**執行**。

1. 若要從特定版本開始執行，請遵循下列步驟：
   + 選擇底部工具列中的版本圖示以開啟版本面板。
   + 選擇您要執行的管道版本。
   + 將滑鼠懸停在版本項目上方以顯示三點功能表，然後選擇**執行**。
   + (選用) 若要檢視管道的先前版本，請從版本面板的三點功能表中選擇**預覽**。您也可以在通知列中選擇**編輯**來編輯版本。

**注意**  
如果管道失敗，狀態橫幅會顯示**失敗**狀態。對失敗步驟進行故障診斷後，請在狀態橫幅上選擇**重試**，以從該步驟繼續執行管道。

------
#### [ Studio Classic ]

1. 登入 Amazon SageMaker Studio Classic。如需詳細資訊，請參閱[啟動 Amazon SageMaker Studio Classic](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-launch.html)。

1. 在 Studio Classic 側邊欄中，選擇**首頁**圖示 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 從功能表中選取 **管道**。

1. 若要依名稱縮小管道清單，請在搜尋欄位中輸入完整或部分管道名稱。

1. 選取管道名稱。

1. 從執行清單的**執行**或**圖表**標籤中，選擇**建立執行**。

1. 輸入或更新下列必填資訊：
   + **名稱** – 在 AWS 區域中，此名稱必須是您的帳戶獨有的。
   + **處理執行個體計數** – 用於處理的執行個體數目。
   + **模型批准狀態** – 供您方便參考。
   + **InputDataUrl** – 輸入資料的 Amazon S3 URI。

1. 選擇 **開始使用**。

一旦您的管道執行，您就可以在狀態橫幅上選擇**檢視詳細資訊**，以檢視執行的詳細資訊。

若要停止執行，請在狀態橫幅上選擇**停止**。若要從停止的位置繼續執行，請在狀態橫幅上選擇**繼續**。

**注意**  
如果管道失敗，狀態橫幅會顯示**失敗**狀態。對失敗步驟進行故障診斷後，請在狀態橫幅上選擇**重試**，以從該步驟繼續執行管道。

------

## 執行管道 (SageMaker Python SDK)
<a name="run-pipeline-sdk"></a>

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

### 先決條件
<a name="run-pipeline-prereq"></a>

本教學課程要求如下：
+  SageMaker 筆記本執行個體。  
+  Pipelines 管道定義。本教學課程假設您使用的完成[定義管道](define-pipeline.md)教學課程後建立的管道定義。

### 第 1 步：啟動管道
<a name="run-pipeline-submit"></a>

首先，您需要啟動管道。

**啟動管道**

1. 檢查 JSON 管道定義，以確保其格式正確。

   ```
   import json
   
   json.loads(pipeline.definition())
   ```

1. 將管道定義提交至 Pipelines 服務以建立管道 (如果管道不存在)，或更新管道 (如果管道存在)。Pipelines 會使用傳入的角色來建立步驟中定義的所有任務。

   ```
   pipeline.upsert(role_arn=role)
   ```

1. 啟動管道執行。

   ```
   execution = pipeline.start()
   ```

### 第 2 步：檢查管道執行
<a name="run-pipeline-examine"></a>

接下來，您需要檢查管道的執行情況。

**檢查管道執行**

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 步：取代管道執行的預設參數
<a name="run-pipeline-parametrized"></a>

您可以透過指定不同的管道參數來覆寫預設值，來啟動管道的額外執行。

**覆寫預設參數**

1. 建立管道執行。這會在模型批准狀態覆寫設為 “已批准” 的情況下啟動另一個管道執行。這意味著透過 `RegisterModel` 步驟產生的模型套件版本會自動準備好透過 CI/CD 管道進行部署，例如使用 SageMaker Projects。如需詳細資訊，請參閱[使用 SageMaker 專案進行 MLOps 自動化](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 步：停止並刪除管道執行
<a name="run-pipeline-delete"></a>

管道完成後，您可以停止任何正在進行的執行並刪除管道。

**停止和刪除管道執行**

1. 停止管道執行。

   ```
   execution.stop()
   ```

1. 刪除管道。

   ```
   pipeline.delete()
   ```

# 停止管道
<a name="pipelines-studio-stop"></a>

您可以在 Amazon SageMaker Studio 主控台中停止管道執行。

若要在 Amazon SageMaker Studio 主控台中停止管道執行，請根據您是使用 Studio 還是 Studio Classic 來完成下列步驟。

------
#### [ Studio ]

1. 在左側導覽窗格中，選取**管道**。

1. (選用) 若要依名稱篩選管道清單，請在搜尋欄位中輸入完整或部分管道名稱。

1. 選取管道名稱。

1. 選擇**執行**索引標籤。

1. 選取要停止的執行。

1. 選擇**停止**。若要從執行停止的位置繼續該執行，請選擇**繼續**。

------
#### [ Studio Classic ]

1. 登入 Amazon SageMaker Studio Classic。如需詳細資訊，請參閱[啟動 Amazon SageMaker Studio Classic](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-launch.html)。

1. 在 Studio Classic 側邊欄中，選擇**首頁**圖示 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 從功能表中選取 **管道**。

1. 若要依名稱縮小管道清單，請在搜尋欄位中輸入完整或部分管道名稱。

1. 若要停止管道執行，請在管道的狀態橫幅上選擇**檢視詳細資訊**，然後選擇**停止**。若要從執行停止的位置繼續該執行，請選擇**繼續**。

------

# 檢視管道的詳細資訊
<a name="pipelines-studio-list"></a>

您可以檢視 SageMaker AI 管道的詳細資訊，以了解其參數、其步驟的相依性，或監控其進度和狀態。這可協助您針對工作流程進行疑難排解或最佳化工作流程。您可以使用 Amazon SageMaker Studio 主控台存取指定管道的詳細資訊，並探索其執行歷程記錄、定義、參數和中繼資料。

或者，如果您的管道與 SageMaker AI 專案相關聯，您可以從專案的詳細資訊頁面存取管道詳細資訊。如需詳細資訊，請參閱[檢視專案資源](sagemaker-projects-resources.md)。

若要檢視 SageMaker AI 管道的詳細資訊，請根據您是使用 Studio 還是 Studio Classic 完成以下步驟。

**注意**  
當管道需要在壓縮模型檔案 (model.tar.gz) 中包含自訂指令碼，以上傳到 Amazon S3 並用來將模型部署到 SageMaker AI 端點時，會發生模型重新封裝。當 SageMaker AI 管道訓練模型並將其註冊到模型註冊庫時，*如果*訓練任務的訓練模型輸出需要包含自訂推論指令碼，則會引入重新封裝步驟。重新封裝步驟會解壓縮模型、新增新指令碼，然後重新壓縮模型。執行管道會將重新封裝步驟新增為訓練工作。

------
#### [ Studio ]

1. 請遵循[啟動 Amazon SageMaker Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-launch.html) 中的指示來開啟 SageMaker Studio 主控台。

1. 在左側導覽窗格中，選取**管道**。

1. (選用) 若要依名稱篩選管道清單，請在搜尋欄位中輸入完整或部分管道名稱。

1. 選取管道名稱，以檢視相關管道的詳細資訊。

1. 選擇下列其中一個索引標籤以檢視管道詳細資訊：
   + **執行** – 與執行相關的詳細資訊。
   + **圖形** – 管道圖形，包括所有步驟。
   + **參數** – 與管道相關的執行參數和指標。
   + **資訊** – 與管道相關聯的中繼資料，例如標籤、管道 Amazon Resource Name (ARN) 和角色 ARN。您也可以從這個頁面編輯管道描述。

------
#### [ Studio Classic ]

1. 登入 Amazon SageMaker Studio Classic。如需詳細資訊，請參閱[啟動 Amazon SageMaker Studio Classic](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-launch.html)。

1. 在 Studio Classic 側邊欄中，選擇**首頁**圖示 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 從功能表中選取 **管道**。

1. 若要依名稱縮小管道清單，請在搜尋欄位中輸入完整或部分管道名稱。

1. 選取管道名稱，以檢視相關管道的詳細資訊。管道詳細資訊標籤隨即開啟，並顯示管道執行清單。您可以開始執行或選擇某個其他標籤，以取得有關管道的詳細資訊。使用**屬性檢查器** 圖示 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/studio/icons/gears.png)) 選擇要顯示的資料欄。

1. 從管道詳細資料頁面中，選擇下列某個標籤，檢視有關管道的詳細資訊：
   + **執行** – 與執行相關的詳細資訊。您可以透過此標籤或**圖表**標籤建立執行項目。
   + **圖表** – 管道的 DAG。
   + **參數** – 包含模型核准狀態。
   + **設定** – 與管道相關聯的中繼資料。您可以下載管道定義檔案，並透過此標籤編輯管道名稱和描述。

------

# 檢視管道執行的詳細資訊
<a name="pipelines-studio-view-execution"></a>

您可以檢閱特定 SageMaker AI 管道執行的詳細資訊。這可協助您：
+ 識別並解決執行期間可能發生的問題，例如失敗的步驟或非預期的錯誤。
+ 比較不同管道執行的結果，以了解輸入資料或參數的變更如何影響整體工作流程。
+ 識別瓶頸和最佳化的機會。

若要檢視管道執行的詳細資訊，請根據您是使用 Studio 還是 Studio Classic 完成下列步驟。

------
#### [ Studio ]

1. 請遵循[啟動 Amazon SageMaker Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-launch.html) 中的指示來開啟 SageMaker Studio 主控台。

1. 在左側導覽窗格中，選取**管道**。

1. (選用) 若要依名稱篩選管道清單，請在搜尋欄位中輸入完整或部分管道名稱。

1. 選取管道名稱，以檢視相關管道的詳細資訊。

1. 選擇**執行**索引標籤。

1. 選取要檢視的管道執行名稱。該執行的管道圖隨即出現。

1. 選擇圖形中的任何管道步驟，以查看右側邊欄中的步驟設定。

1. 選擇下列其中一個索引標籤，以檢視更多的管道詳細資訊：
   + **定義** - 管道圖，包括所有步驟。
   + **參數** – 包含模型核准狀態。
   + **詳細資訊** – 與管道相關聯的中繼資料，例如標籤、管道 Amazon Resource Name (ARN) 和角色 ARN。您也可以從這個頁面編輯管道描述。

------
#### [ Studio Classic ]

1. 登入 Amazon SageMaker Studio Classic。如需詳細資訊，請參閱[啟動 Amazon SageMaker Studio Classic](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-launch.html)。

1. 在 Studio Classic 側邊欄中，選擇**首頁**圖示 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 從功能表中選取 **管道**。

1. 若要依名稱縮小管道清單，請在搜尋欄位中輸入完整或部分管道名稱。

1. 選取管道名稱。管道的**執行**頁面隨即開啟。

1. 在**執行**頁面中，選取執行名稱以檢視執行的詳細資料。執行詳細資料標籤會開啟，並顯示管道中步驟的圖形。

1. 若要依名稱搜尋步驟，請在搜尋欄位中輸入符合步驟名稱的字元。使用圖形右下角的調整大小圖示來放大和縮小圖形、使圖形符合螢幕大小，以及將圖形展開至全螢幕。若要專注於圖形的特定部分，您可以選取圖形的空白區域，然後拖曳圖形以在該區域上置中。  
![\[\]](http://docs.aws.amazon.com/zh_tw/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) API 產生的。
   + **日誌** – 由步驟產生的 Amazon CloudWatch 日誌。
   + **資訊** – 與步驟相關聯的參數和中繼資料。  
![\[\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/yosemite/execution-graph-info.png)

------

# 下載管道定義檔案
<a name="pipelines-studio-download"></a>

您可以直接從 Amazon SageMaker Studio UI 下載 SageMaker AI 管道的定義檔案。您可以將此管道定義檔案用於：
+ 備份和還原：使用下載的檔案建立管道組態的備份，讓您可以在基礎設施故障或意外變更時將其還原。
+ 版本控制：將管道定義檔案存放在來源控制系統中，以追蹤管道的變更，並視需要還原至先前的版本。
+ 程式設計互動：使用管道定義檔案做為 SageMaker SDK 或 AWS CLI的輸入。
+ 與自動化程序整合：將管道定義整合到您的 CI/CD 工作流程或其他自動化程序。

若要下載管道的定義檔案，請根據您是使用 Studio 還是 Studio Classic 完成下列步驟。

------
#### [ Studio ]

1. 請遵循[啟動 Amazon SageMaker Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-launch.html) 中的指示來開啟 SageMaker Studio 主控台。

1. 在左側導覽窗格中，選取**管道**。

1. (選用) 若要依名稱篩選管道清單，請在搜尋欄位中輸入完整或部分管道名稱。

1. 選取管道名稱。**執行**頁面隨即開啟，並顯示管道執行的清單。

1. 停留在**執行**頁面，或選擇管道執行資料表左側的**圖形**、**資訊**或**參數**頁面。您可以從其中任何頁面下載管道定義。

1. 在頁面右上角，選擇垂直省略符號，然後選擇**下載管道定義 (JSON)**。

------
#### [ Studio Classic ]

1. 登入 Amazon SageMaker Studio Classic。如需詳細資訊，請參閱[啟動 Amazon SageMaker Studio Classic](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-launch.html)。

1. 在 Studio Classic 側邊欄中，選擇**首頁**圖示 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 從功能表中選取 **管道**。

1. 若要依名稱縮小管道清單，請在搜尋欄位中輸入完整或部分管道名稱。

1. 選取管道名稱。

1. 選擇 **Settings** (設定) 標籤。

1. 選擇**下載管道定義檔案**。

------

# 從管道中存取實驗資料
<a name="pipelines-studio-experiments"></a>

**注意**  
SageMaker Experiments 是僅在 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 Experiments 實體 (如果這些實體不存在)：
+ 管道實驗
+ 每次執行管道的執行群組
+ 管道步驟中建立的每個 SageMaker AI 任務的執行

如需如何將實驗與管道整合的相關資訊，請參閱 [Amazon SageMaker Experiments 整合](pipelines-experiments.md)。如需 SageMaker Experiments 的詳細資訊，請參閱 [Studio Classic 中的 Amazon SageMaker Experiments](experiments.md)。

您可以從管道執行清單或實驗清單取得與管道相關聯的管路清單。

**從管道執行清單檢視執行清單**

1. 若要檢視管道執行清單，請遵循 [檢視管道的詳細資訊](pipelines-studio-list.md) 的 *Studio Classic* 索引標籤中的前五個步驟。

1. 在畫面右上方，選擇**篩選**圖示 (![\[Funnel or filter icon representing data filtering or narrowing down options.\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/jumpstart/jumpstart-filter-icon.png))。

1. 選取**實驗**。如果在建立管道時未停用實驗整合，則實驗名稱會顯示在執行清單中。
**注意**  
[Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable) 的 v2.41.0 版本中引入了實驗整合功能。依預設，使用舊版 SDK 建立的管道不會與實驗整合。

1. 選擇您選擇的實驗以檢視與該實驗相關的執行群組和執行。

**從實驗清單檢視執行清單**

1. 在 Studio Classic 的左側邊欄中，選擇**首頁**圖示 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 從功能表中選取**實驗**。

1. 使用搜尋列或**篩選**圖示 (![\[Funnel or filter icon representing data filtering or narrowing down options.\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/jumpstart/jumpstart-filter-icon.png))，將清單篩選為由管道建立的實驗。

1. 開啟實驗名稱並檢視管道建立的執行清單。

# 追蹤管道的歷程
<a name="pipelines-lineage-tracking"></a>

在本教學課程中，您會使用 Amazon SageMaker Studio 來追蹤 Amazon SageMaker AI ML 管道的歷程。

管道是由 [Amazon SageMaker 範例 GitHub 儲存庫](https://github.com/awslabs/amazon-sagemaker-examples)中的 [使用 Amazon 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.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/yosemite/pipeline-tutorial-steps.png)


若要在 Amazon SageMaker Studio 主控台中追蹤管道的歷程，請根據您是使用 Studio 還是 Studio Classic 完成下列步驟。

------
#### [ Studio ]

**追蹤管道的歷程**

1. 請遵循[啟動 Amazon SageMaker Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-launch.html) 中的指示來開啟 SageMaker Studio 主控台。

1. 在左側導覽窗格中，選取**管道**。

1. (選用) 若要依名稱篩選管道清單，請在搜尋欄位中輸入完整或部分管道名稱。

1. 在**名稱**欄中，選取管道名稱以檢視管道的詳細資訊。

1. 選擇**執行**索引標籤。

1. 在**執行**資料表的**名稱**欄中，選取要檢視的管道執行名稱。

1. 在**執行**頁面的右上角，選擇垂直省略符號，然後選擇**下載管道定義 (JSON)**。您可以檢視此檔案以查看管道圖形的定義方式。

1. 選擇**編輯**以開啟管道設計工具。

1. 使用畫布右上角的調整大小和縮放控制項來放大和縮小圖形、使圖形符合螢幕大小，或將圖形展開至全螢幕。

1. 若要檢視您的訓練、驗證和測試資料集，請完成下列步驟：

   1. 在您的管道圖形中選擇處理步驟。

   1. 在右側邊欄中，選擇**概觀**索引標籤。

   1. 在**檔案**區段中，尋找訓練、驗證和測試資料集的 Amazon S3 路徑。

1. 若要部署您的模型成品，請完成下列步驟：

   1. 在您的管道圖形中選擇訓練步驟。

   1. 在右側邊欄中，選擇**概觀**索引標籤。

   1. 在**檔案**區段中，尋找模型成品的 Amazon S3 路徑。

1. 若要尋找模型套件 ARN，請完成下列步驟：

   1. 選擇註冊模型步驟。

   1. 在右側邊欄中，選擇**概觀**索引標籤。

   1. 在**檔案**區段中，尋找模型套件的 ARN。

------
#### [ Studio Classic ]

**追蹤管道的歷程**

1. 登入 Amazon SageMaker Studio Classic。如需詳細資訊，請參閱[啟動 Amazon SageMaker Studio Classic](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-launch.html)。

1. 在 Studio 側邊欄中，選擇**首頁**圖示 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/studio/icons/house.png))。

1. 在功能表中，選取**管道**。

1. 您可以使用**搜尋**方塊來篩選管道清單。

1. 選擇 `AbalonePipeline` 管道以檢視執行清單和管道的其他詳細資訊。

1. 在右側邊欄中選擇**屬性檢查器** 圖示 (![\[Black square icon representing a placeholder or empty image.\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/studio/icons/gears.png)) 以開啟**資料表屬性**窗格，您可以在其中選擇要檢視的屬性。

1. 選擇**設定**標籤，然後選擇**下載管道定義檔案**。您可以檢視此檔案以查看管道圖形的定義方式。

1. 在**執行**索引標籤上，選取執行清單中的第一列，以檢視其執行圖形和執行的其他詳細資訊。請注意，此圖形與教學課程開頭顯示的圖表相符。

   使用圖形右下角的調整大小圖示來放大和縮小圖形、使圖形符合螢幕大小，或將圖形展開至全螢幕。若要專注於圖形的特定部分，您可以選取圖形的空白區域，然後拖曳圖形以在該區域上置中。圖形右下角的插頁區域顯示您在圖形中的位置。  
![\[\]](http://docs.aws.amazon.com/zh_tw/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
   ```

------