

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# パイプラインを定義する
<a name="define-pipeline"></a>

Amazon SageMaker Pipelines を使用してワークフローをオーケストレートするには、JSON パイプライン定義の形式で有向非巡回グラフ (DAG) を生成する必要があります。DAG を使用すると、データの前処理、モデルトレーニング、モデル評価、モデルデプロイなど、ML プロセスに関するさまざまなステップや、このようなステップ間のデータの依存関係とフローを指定できます。次のトピックでは、パイプライン定義を生成する方法を説明します。

JSON パイプライン定義は、SageMaker Python SDK または Amazon SageMaker Studio のビジュアルドラッグアンドドロップパイプラインデザイナー機能を使用して生成できます。このチュートリアルで作成するパイプライン DAG は、次の画像のとおりです。

![Studio の Pipelines のビジュアルドラッグアンドドロップインターフェイスのスクリーンショット](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/pipelines/pipelines-studio-overview.png)


以降のセクションで定義するパイプラインは、リグレッションに関する問題を解決し、物理的な測定値に基づいてアワビの年齢を決定します。このチュートリアルのコンテンツを含む、実行可能な Jupyter Notebook については、「[Orchestrating Jobs with Amazon SageMaker Model Building Pipelines](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-pipelines/tabular/abalone_build_train_deploy/sagemaker-pipelines-preprocess-train-evaluate-batch-transform.html)」を参照してください。

**注記**  
モデルの場所をトレーニングステップのプロパティとして参照できます。Github でエンドツーエンドの例 [CustomerChurn pipeline](https://github.com/aws-samples/customer-churn-sagemaker-pipelines-sample/blob/main/pipelines/customerchurn/pipeline.py) を参照してください。

**Topics**

## パイプラインを定義する (Pipeline Designer)
<a name="create-pipeline-designer"></a>

以下のウォークスルーでは、ドラッグアンドドロップ Pipeline Designer を使用して、基本のパイプラインを作成する手順について説明します。ビジュアルデザイナーでパイプライン編集セッションを一時停止または終了する必要がある場合は、**[エクスポート]** オプションをクリックします。これにより、パイプラインの現在の定義をローカル環境にダウンロードできます。その後、パイプライン編集プロセスを再開する場合は、同じ 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. カーソルをクリックして、前のセクションで追加した **[データ処理]** ステップから **[モデルトレーニング]** ステップにドラッグし、2 つのステップを接続するエッジを作成します。

### モデル登録ステップを使用してモデルパッケージを作成する
<a name="create-register-model-step"></a>

モデル登録ステップを使用してモデルパッケージを作成するには、次の手順を実行します。

1. 左側のサイドバーで、**[モデルの登録]** を選択し、キャンバスにドラッグします。

1. キャンバスで、追加した **[モデルの登録]** ステップを選択します。

1. 登録するモデルを選択するには、**[モデル (入力)]** の下にある **[追加]** をクリックします。

1. **[モデルグループを作成]** をクリックして、モデルを新しいモデルグループに追加します。

1. 右側のサイドバーの残りのフィールドに入力します。これらのタブのフィールドの詳細については、「[sagemaker.workflow.step\_collections.RegisterModel](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.step_collections.RegisterModel)」を参照してください。

1. カーソルをクリックして、前のセクションで追加した **[モデルトレーニング]** ステップから **[モデル登録]** ステップにドラッグし、2 つのステップを接続するエッジを作成します。

### デプロイモデル (エンドポイント) ステップを使用してモデルをエンドポイントにデプロイする
<a name="create-deploy-endpoint-step"></a>

モデルデプロイステップを使用してモデルをデプロイするには、次の手順を実行します。

1. 左側のサイドバーで、**[モデルの登録 (エンドポイント)]** を選択し、キャンバスにドラッグします。

1. キャンバスで、追加した **[モデルのデプロイ (エンドポイント)]** ステップを選択します。

1. デプロイするモデルを選択するには、**[モデル (入力)]** の下にある **[追加]** をクリックします。

1. **[エンドポイントの作成]** ラジオボタンをオンにして、新しいエンドポイントを作成します。

1. エンドポイントの **[名前]** と **[説明]** を入力します。

1. カーソルをクリックして、前のセクションで追加した **[モデル登録]** ステップから **[モデルのデプロイ (エンドポイント)]** ステップにドラッグし、2 つのステップを接続するエッジを作成します。

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
from sagemaker.core.workflow.pipeline_context import PipelineSession
from sagemaker.core.helper.session_helper import Session, get_execution_role

region = boto3.Session().region_name
sagemaker_session = Session()
role = 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) 関数を使用して、出力場所を指定できます。

#### ステップ 1: データセットをダウンロードする
<a name="define-pipeline-data-download"></a>

このノートブックでは、UCI Machine Learning Abalone Dataset を使用します。データセットには、次の特徴が含まれています。
+ `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. モデルを作成したら、バッチ変換用の 2 つ目のデータセットをダウンロードします。

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

```
from sagemaker.core.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. 処理ステップに渡すプロセッサのインスタンスを作成します。

   ```
   from sagemaker.core.processing import Processor
   from sagemaker.core import image_uris
   
   framework_version = "0.23-1"
   
   sklearn_image_uri = image_uris.retrieve(
       framework="sklearn",
       region=region,
       version=framework_version,
       instance_type="ml.m5.xlarge"
   )
   
   sklearn_processor = Processor(
       image_uri=sklearn_image_uri,
       instance_type="ml.m5.xlarge",
       instance_count=processing_instance_count,
       base_job_name="sklearn-abalone-process",
       sagemaker_session=pipeline_session,
       role=role,
   )
   ```

1. 処理ステップを作成します。

   ```
   from sagemaker.core.processing import ProcessingInput, ProcessingOutput
   from sagemaker.mlops.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 アルゴリズムを使用して、処理ステップから出力されたトレーニングデータでモデルをトレーニングする方法を説明します。

**トレーニングステップを定義するには**

1. トレーニングからモデルを保存するモデルパスを指定します。

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

1. XGBoost アルゴリズムと入力データセットのトレーニング推定器を設定します。

   ```
   from sagemaker.train import ModelTrainer
   from sagemaker.train.configs import Compute, OutputDataConfig
   from sagemaker.core import image_uris
   
   image_uri = image_uris.retrieve(
       framework="xgboost",
       region=region,
       version="1.0-1",
       py_version="py3",
       instance_type="ml.m5.xlarge"
   )
   xgb_train = ModelTrainer(
       training_image=image_uri,
       compute=Compute(instance_type="ml.m5.xlarge", instance_count=1),
       output_data_config=OutputDataConfig(s3_output_path=model_path),
       hyperparameters={
           "objective": "reg:linear",
           "num_round": "50",
           "max_depth": "5",
           "eta": "0.2",
           "gamma": "4",
           "min_child_weight": "6",
           "subsample": "0.7",
           "silent": "0"
       },
       sagemaker_session=pipeline_session,
       role=role,
   )
   ```

1. のトレーニングインスタンスとプロパティ`TrainingStep`を使用して を作成します`ProcessingStep`。

   ```
   from sagemaker.train.configs import InputData
   from sagemaker.mlops.workflow.steps import TrainingStep
   
   train_args = xgb_train.train(
       input_data_config=[
           InputData(
               channel_name="train",
               data_source=step_process.properties.ProcessingOutputConfig.Outputs[
                   "train"
               ].S3Output.S3Uri,
               content_type="text/csv"
           ),
           InputData(
               channel_name="validation",
               data_source=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. 評価`Processor`用の のインスタンスを作成します。

   ```
   from sagemaker.core.processing import Processor
   
   script_eval = Processor(
       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. プロセッサインスタンス、入力チャネルと出力チャネル、スクリプト`ProcessingStep`を使用して を作成します`evaluation.py`。

   ```
   from sagemaker.core.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>

このセクションでは、トレーニングステップの出力から SageMaker AI モデルを作成する方法を説明します。

**バッチ変換用の CreateModelStep を定義するには**
+ SageMaker AI モデルとモデルステップを作成します。

  ```
  from sagemaker.serve import ModelBuilder
  from sagemaker.mlops.workflow.model_step import ModelStep
  
  model_builder = ModelBuilder(
      image_uri=image_uri,
      s3_model_data_url=step_train.properties.ModelArtifacts.S3ModelArtifacts,
      role_arn=role,
      sagemaker_session=pipeline_session,
  )
  
  step_create_model = ModelStep(
      name="AbaloneCreateModel",
      step_args=model_builder.build(),
  )
  ```

#### ステップ 7: バッチ変換を実行するための TransformStep を定義する
<a name="define-pipeline-transform"></a>

このセクションでは、モデルのトレーニング後にデータセットにバッチ変換を実行する `TransformStep` の作成方法を説明します。

**バッチ変換を実行するための TransformStep を定義するには**
+ トランスフォーマーインスタンスと を作成します`TransformStep`。

  ```
  from sagemaker.core.transformer import Transformer
  from sagemaker.mlops.workflow.steps import TransformStep
  
  transformer = Transformer(
      model_name=step_create_model.properties.ModelName,
      instance_type="ml.m5.xlarge",
      instance_count=1,
      output_path=f"s3://{default_bucket}/AbaloneTransform",
      sagemaker_session=pipeline_session,
  )
  
  transform_args = transformer.transform(data=batch_data)
  
  step_transform = TransformStep(
      name="AbaloneTransform",
      step_args=transform_args,
  )
  ```

#### ステップ 8: モデルパッケージを作成するための RegisterModel ステップを定義する
<a name="define-pipeline-register"></a>

このセクションでは、モデルを登録する方法を示します。その結果、推論用のモデルパッケージが作成されます。

**モデル登録ステップを定義してモデルパッケージを作成するには**
+ モデル登録ステップを作成します。

  ```
  from sagemaker.core.model_metrics import MetricsSource, ModelMetrics 
  from sagemaker.mlops.workflow.model_step import ModelStep
  from sagemaker.serve import ModelBuilder
  
  model_metrics = ModelMetrics(
      model_statistics=MetricsSource(
          s3_uri="{{{}/evaluation.json}}".format(
              step_eval.arguments["ProcessingOutputConfig"]["Outputs"][0]["S3Output"]["S3Uri"]
          ),
          content_type="application/json"
      )
  )
  
  model_builder = ModelBuilder(
      image_uri=image_uri,
      s3_model_data_url=step_train.properties.ModelArtifacts.S3ModelArtifacts,
      role_arn=role,
      sagemaker_session=pipeline_session,
  )
  
  register_args = model_builder.register(
      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
  )
  
  step_register = ModelStep(
      name="{{AbaloneRegisterModel}}",
      step_args=register_args,
  )
  ```

#### ステップ 9: モデルの精度を検証するための条件ステップを定義する
<a name="define-pipeline-condition"></a>

`ConditionStep` を使用すると、ステッププロパティの条件に基づいて、パイプライン DAG での条件付き実行が Pipelines でサポートされるようになります。

**モデルの精度を検証するための条件ステップを定義するには**
+ 条件を定義し、 を構築します`ConditionStep`。

  ```
  from sagemaker.core.workflow.conditions import ConditionLessThanOrEqualTo
  from sagemaker.mlops.workflow.condition_step import ConditionStep
  from sagemaker.core.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=[], 
  )
  ```

#### ステップ 10: パイプラインを作成する
<a name="define-pipeline-pipeline"></a>

すべてのステップを作成したら、それらをパイプラインに結合します。

**パイプラインを作成するには**

1. パイプラインの `name`、`parameters`、`steps` を定義します。

   ```
   from sagemaker.mlops.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) 