

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Pipelines 단계
<a name="build-and-manage-steps"></a>

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)

# 단계 추가
<a name="build-and-manage-steps-types"></a>

다음은 각 단계 유형의 요구 사항을 설명하고 해당 단계의 예시 구현을 제공하며 Pipelines에 단계를 추가하는 방법을 설명합니다. 이는 필요한 리소스와 입력을 제공하지 않으므로 작동하는 구현이 아닙니다. 이러한 단계를 구현하는 자습서는 [Pipelines 작업](pipelines-build.md)섹션을 참조하세요.

**참고**  
로컬 기계 학습 코드에서 `@step` 데코레이터를 사용하여 파이프라인 단계로 변환하여 단계를 만들 수도 있습니다. 자세한 내용은 [@step 데코레이터](#step-type-custom) 단원을 참조하십시오.

Amazon SageMaker Pipelines은 다음과 같은 단계 유형을 지원합니다.
+ [코드 실행](#step-type-executecode)

  [처리](#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 데코레이터
<a name="step-type-custom"></a>

drag-and-drop기 파이프라인 UI에서 고급 SageMaker AI 기능 또는 기타 AWS 서비스를 활용하는 사용자 지정 ML 작업을 오케스트레이션하려면를 사용합니다[코드 실행 단계](#step-type-executecode).

`@step` 데코레이터를 사용하여 로컬 기계 학습 코드에서 단계를 만들 수 있습니다. 코드를 테스트한 후 `@step` 데코레이터로 주석을 달아 함수를 SageMaker AI 파이프라인 단계로 변환할 수 있습니다. 파이프라인은 `@step`으로 데코레이션된 함수의 출력을 파이프라인에 단계로 전달할 때 파이프라인을 만들고 실행합니다. 또한 하나 이상의 `@step`으로 데코레이션된 함수와 기존 SageMaker AI 파이프라인 단계를 포함하는 다단계 DAG 파이프라인을 만들 수 있습니다. `@step` 데코레이터로 단계를 만드는 방법에 대한 자세한 내용은 [@step 데코레이터를 사용한 Python 코드 리프트 앤 시프트](pipelines-step-decorator.md) 섹션을 참조하세요.

## 코드 실행 단계
<a name="step-type-executecode"></a>

Pipelines 드래그 앤 드롭 UI에서 **코드 실행** 단계를 사용하여 자체 코드를 파이프라인 단계로 실행할 수 있습니다. 파이프라인의 일부로 실행할 Python 함수, 스크립트 또는 노트북을 업로드할 수 있습니다. 고급 SageMaker AI 기능 또는 기타 AWS 서비스를 활용하는 사용자 지정 ML 작업을 오케스트레이션하려면이 단계를 사용해야 합니다.

**코드 실행** 단계는 Amazon SageMaker AI용 기본 Amazon S3 버킷에 파일을 업로드합니다. 이 버킷에는 필요한 교차 오리진 리소스 공유(CORS) 권한 세트가 없을 수 있습니다. CORS 권한 구성에 대한 자세한 내용은 [입력 이미지 데이터에 대한 CORS 요구 사항](sms-cors-update.md) 섹션을 참조하세요.

**코드 실행** 단계에서는 Amazon SageMaker 훈련 작업을 사용하여 코드를 실행합니다. IAM 역할에 `sagemaker:DescribeTrainingJob` 및 `sagemaker:CreateTrainingJob` API 권한이 있어야 합니다. Amazon SageMaker AI에 필요한 모든 권한과 이를 설정하는 방법에 대한 자세한 내용은 [Amazon SageMaker AI API 권한: 작업, 권한 및 리소스 참조](api-permissions-reference.md) 섹션을 참조하세요.

파이프라인 디자이너를 사용하여 파이프라인에 코드 실행 단계를 추가하려면 다음을 수행합니다.

1. [Amazon SageMaker Studio 출시](studio-updated-launch.md)의 지침에 따라 Amazon SageMaker Studio 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **파이프라인**을 클릭합니다.

1. **생성(Create)**을 선택합니다.

1. **비어 있음**을 선택합니다.

1. 왼쪽 사이드바에서 **코드 실행**을 선택하고 캔버스로 드래그합니다.

1. 캔버스에서 추가한 **코드 실행** 단계를 선택합니다.

1. 오른쪽 사이드바의 **설정** 및 **세부 정보** 탭에서 양식을 작성합니다.

1. 단일 파일을 업로드하여 여러 아티팩트가 포함된 압축 폴더를 실행하거나 업로드할 수 있습니다.

1. 단일 파일 업로드의 경우 노트북, Python 함수 또는 스크립트에 대한 파라미터를 선택적으로 제공할 수 있습니다.

1. Python 함수를 제공할 때 핸들러를 `file.py:<function_name>` 형식으로 제공해야 합니다.

1. 압축 폴더 업로드의 경우 코드에 대한 상대 경로를 제공해야 하며, 선택적으로 압축 폴더 내의 `requirements.txt` 파일 또는 초기화 스크립트에 대한 경로를 제공할 수 있습니다.

1. 캔버스에 추가한 **코드 실행** 단계 바로 앞에 있는 단계가 포함된 경우 커서를 클릭하고 단계에서 **코드 실행** 단계로 드래그하여 엣지를 만듭니다.

1. 캔버스에 추가한 **코드 실행** 단계 바로 뒤에 있는 단계가 포함된 경우 **코드 실행** 단계에서 커서를 클릭하고 단계로 드래그하여 엣지를 만듭니다. **코드 실행** 단계의 출력은 Python 함수를 위해 참조할 수 있습니다.

## 처리 단계
<a name="step-type-processing"></a>

처리 단계를 사용하여 데이터 처리를 위한 처리 작업을 생성합니다. 작업 처리에 대한 자세한 내용은 [데이터 처리 및 모델 평가](https://docs.aws.amazon.com/sagemaker/latest/dg/processing-job.html)를 참조하세요.

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

파이프라인 디자이너를 사용하여 파이프라인에 처리 단계를 추가하려면 다음을 수행합니다.

1. [Amazon SageMaker Studio 출시](studio-updated-launch.md)의 지침에 따라 Amazon SageMaker Studio 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **파이프라인**을 클릭합니다.

1. **생성(Create)**을 선택합니다.

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) 설명서를 참조하세요. 자세한 예시는 [Orchestrate Jobs to Train and Evaluate Models with Amazon SageMaker Pipelines](https://github.com/aws/amazon-sagemaker-examples/blob/62de6a1fca74c7e70089d77e36f1356033adbe5f/sagemaker-pipelines/tabular/abalone_build_train_deploy/sagemaker-pipelines-preprocess-train-evaluate-batch-transform.ipynb) 예시 노트북을 참조하세요. *Define a Processing Step for Feature Engineering* 섹션에 자세한 정보가 포함되어 있습니다.

------

## 훈련 단계
<a name="step-type-training"></a>

훈련 단계를 사용하여 모델을 훈련시키는 훈련 작업을 생성합니다. 훈련 작업에 대한 자세한 내용은 [Train a Model with Amazon SageMaker AI](https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-training.html)를 참조하세요.

훈련 단계에는 훈련 및 검증 데이터 입력뿐만 아니라 예측기가 필요합니다.

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

파이프라인 디자이너를 사용하여 파이프라인에 훈련 단계를 추가하려면 다음을 수행합니다.

1. [Amazon SageMaker Studio 출시](studio-updated-launch.md)의 지침에 따라 Amazon SageMaker Studio 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **파이프라인**을 클릭합니다.

1. **생성(Create)**을 선택합니다.

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

------

## 튜닝 단계
<a name="step-type-tuning"></a>

튜닝 단계를 사용하여 하이퍼파라미터 최적화(HPO) 라고도 하는 하이퍼파라미터 튜닝 작업을 생성합니다. 하이퍼파라미터 조정 작업은 여러 개의 훈련 작업을 실행하며 각 작업은 모델 버전을 생성합니다. 하이퍼파라미터 튜닝에 대한 자세한 내용은 [SageMaker AI로 자동 모델 튜닝](automatic-model-tuning.md)섹션을 참조하세요.

조정 작업은 파이프라인에 대한 SageMaker AI 실험과 관련이 있으며, 훈련 작업은 평가판으로 생성됩니다. 자세한 내용은 [실험 통합](pipelines-experiments.md) 단원을 참조하십시오.

튜닝 단계에는 [하이퍼파라미터 튜너](https://sagemaker.readthedocs.io/en/stable/api/training/tuner.html)와 훈련 입력이 필요합니다. `HyperparameterTuner`의 `warm_start_config`파라미터를 지정하여 이전 튜닝 작업을 다시 훈련할 수 있습니다. 하이퍼파라미터 튜닝 및 부팅에 대한 자세한 내용은 [웜 스타트 하이퍼파라미터 튜닝 작업 실행](automatic-model-tuning-warm-start.md)섹션을 참조하세요.

[SageMaker.Workflow.steps.TuningStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.steps.TuningStep) 클래스의 [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) 메서드를 사용하여 성능이 가장 우수한 모델 버전 중 하나에서 모델 아티팩트를 가져올 수 있습니다. 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)를 참조하세요.

**중요**  
조정 단계는 Amazon SageMaker Python SDK v2.48.0과 Amazon SageMaker Studio Classic v3.8.0에 도입되었습니다. 조정 단계를 사용하기 전에 Studio Classic을 업데이트해야 합니다. 업데이트하지 않으면 파이프라인 DAG가 표시되지 않습니다. Studio Classic을 업데이트하려면 [Amazon SageMaker Studio Classic 종료 및 업데이트](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.aws.amazon.com/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) 설명서를 참조하세요.

## 미세 조정 단계
<a name="step-type-fine-tuning"></a>

미세 조정은 새 데이터세트에 대해 Amazon SageMaker JumpStart의 사전 훈련된 파운데이션 모델을 훈련합니다. 전이 학습이라고도 하는 이 프로세스를 통해 더 작은 데이터세트를 사용하고 훈련 시간을 단축하여 정확한 모델을 생성할 수 있습니다. 모델을 미세 조정할 때 기본 데이터세트를 사용하거나 자체 데이터를 선택할 수 있습니다. JumpStart에서 파운데이션 모델을 미세 조정하는 방법에 대한 자세한 내용은 [모델 미세 조정](jumpstart-fine-tune.md) 섹션을 참조하세요.

미세 조정 단계에서는 Amazon SageMaker 훈련 작업을 사용하여 모델을 사용자 지정합니다. IAM 역할에 파이프라인에서 미세 조정 작업을 실행할 수 있는 `sagemaker:DescribeTrainingJob` 및 `sagemaker:CreateTrainingJob` API 권한이 있어야 합니다. Amazon SageMaker AI에 필요한 권한과 이를 설정하는 방법에 대한 자세한 내용은 [Amazon SageMaker AI API 권한: 작업, 권한 및 리소스 참조](api-permissions-reference.md) 섹션을 참조하세요.

드래그 앤 드롭 편집기를 사용하여 파이프라인에 **미세 조정 모델** 단계를 추가하려면 다음 단계를 따르세요.

1. [Amazon SageMaker Studio 출시](studio-updated-launch.md)의 지침에 따라 Studio 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **파이프라인**을 클릭합니다.

1. **생성(Create)**을 선택합니다.

1. **비어 있음**을 선택합니다.

1. 왼쪽 사이드바에서 **모델 미세 조정**을 선택하고 캔버스로 드래그합니다.

1. 캔버스에서 추가한 **모델 미세 조정** 단계를 선택합니다.

1. 오른쪽 사이드바의 **설정** 및 **세부 정보** 탭에서 양식을 작성합니다.

1. 캔버스에 추가한 **모델 미세 조정** 단계 바로 앞에 있는 단계가 포함된 경우 커서를 클릭하고 단계에서 **모델 미세 조정** 단계로 드래그하여 엣지를 만듭니다.

1. 캔버스에 추가한 **모델 미세 조정** 단계 바로 뒤에 있는 단계가 포함된 경우 **모델 미세 조정** 단계에서 커서를 클릭하고 단계로 드래그하여 엣지를 만듭니다.

## AutoML 단계
<a name="step-type-automl"></a>

[AutoML](https://sagemaker.readthedocs.io/en/stable/api/training/automl.html) API를 사용하여 모델을 자동으로 학습시키는 AutoML 작업을 생성할 수 있습니다. AutoML 작업에 대한 자세한 내용은 [Amazon SageMaker Autopilot을 사용한 모델 개발 자동화](https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-automate-model-development.html)를 참조하세요.

**참고**  
현재 AutoML 단계는 [앙상블 훈련 모드](https://docs.aws.amazon.com/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>)
```

자세한 내용은 SageMaker Python SDK의 [AutoML](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.automl_step.AutoMLStep) 단계를 참조하세요.

## 모델 단계
<a name="step-type-model"></a>

`ModelStep`을 사용하여 SageMaker AI 모델을 생성하거나 등록할 수 있습니다. `ModelStep` 요구 사항에 대한 자세한 내용은 [SageMaker.Workflow.Model\$1Step.ModelStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.model_step.ModelStep) 설명서를 참조하세요.

### 모델 생성
<a name="step-type-model-create"></a>

`ModelStep`을 사용하여 SageMaker AI 모델을 생성할 수 있습니다. `ModelStep`에는 모델 아티팩트와 모델을 생성하는 데 사용해야 하는 SageMaker AI 인스턴스 유형에 대한 정보가 필요합니다. SageMaker AI 모델 훈련에 대한 자세한 내용은 [Train a Model with Amazon SageMaker AI](https://docs.aws.amazon.com/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 name="step-type-model-register"></a>

`ModelStep`을 사용하여 Amazon SageMaker Model Registry에 `sagemaker.model.Model` 또는 `sagemaker.pipeline.PipelineModel`을 등록할 수 있습니다. `PipelineModel`은 추론 파이프라인은 데이터에 대해 추론 요청을 처리하는 컨테이너로 이루어진 선형 시퀀스로 구성된 모델입니다. 모델을 등록하는 자세한 방법은 [Model Registry를 사용한 모델 등록 배포](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,
)
```

## 모델 만들기 단계
<a name="step-type-create-model"></a>

모델 생성 단계를 사용하여 SageMaker AI 모델을 생성합니다. 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. [Amazon SageMaker Studio 출시](studio-updated-launch.md)의 지침에 따라 Studio 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **파이프라인**을 클릭합니다.

1. **생성(Create)**을 선택합니다.

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 ]

**중요**  
[모델 단계](#step-type-model)을 사용하여 SageMaker AI Python SDK v2.90.0 이후 모델을 생성하는 것이 좋습니다. `CreateModelStep`은 이전 버전의 SageMaker Python SDK에서 계속 작동하지만 더 이상 적극적으로 지원되지는 않습니다.

```
from sagemaker.workflow.steps import CreateModelStep

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

------

## 모델 등록 단계
<a name="step-type-register-model"></a>

모델 등록 단계에서는 모델을 SageMaker Model Registry에 등록합니다.

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

파이프라인 디자이너를 사용하여 파이프라인에서 모델을 등록하려면 다음을 수행합니다.

1. [Amazon SageMaker Studio 출시](studio-updated-launch.md)의 지침에 따라 Amazon SageMaker Studio 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **파이프라인**을 클릭합니다.

1. **생성(Create)**을 선택합니다.

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)을 사용하여 SageMaker AI Python SDK v2.90.0 이후 모델을 등록하는 것이 좋습니다. `RegisterModel`은 이전 버전의 SageMaker Python SDK에서 계속 작동하지만 더 이상 적극적으로 지원되지는 않습니다.

`RegisterModel` 단계를 사용하여 [Sagemaker.Model.Model](https://sagemaker.readthedocs.io/en/stable/api/inference/model.html) 또는 [Sagemaker.Pipeline.PipelineModel](https://sagemaker.readthedocs.io/en/stable/api/inference/pipeline.html#pipelinemodel)을 Amazon SageMaker Model Registry에 등록합니다. `PipelineModel`은 추론 파이프라인은 데이터에 대해 추론 요청을 처리하는 컨테이너로 이루어진 선형 시퀀스로 구성된 모델입니다.

모델을 등록하는 자세한 방법은 [Model Registry를 사용한 모델 등록 배포](model-registry.md)섹션을 참조하세요. `RegisterModel` 단계 요구 사항에 대한 자세한 내용은 [SageMaker.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
)
```

------

## 모델 배포(엔드포인트) 단계
<a name="step-type-deploy-model-endpoint"></a>

파이프라인 디자이너에서 모델 배포(엔드포인트) 단계를 사용하여 모델을 엔드포인트에 배포합니다. 새 엔드포인트를 만들거나 기존 엔드포인트를 사용할 수 있습니다. 실시간 추론은 실시간, 대화형, 짧은 지연 시간이 요구되는 추론 워크로드에 적합합니다. 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) 섹션을 참조하세요.

드래그 앤 드롭 편집기에서 파이프라인에 모델 배포 단계를 추가하려면 다음 단계를 완료하세요.

1. [Amazon SageMaker Studio 출시](studio-updated-launch.md)의 지침에 따라 Studio 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **파이프라인**을 클릭합니다.

1. **생성(Create)**을 선택합니다.

1. **비어 있음**을 선택합니다.

1. 왼쪽 사이드바에서 **모델 배포(엔드포인트)**를 선택하고 캔버스로 드래그합니다.

1. 캔버스에서 추가한 **모델 배포(엔드포인트)** 단계를 선택합니다.

1. 오른쪽 사이드바의 **설정** 및 **세부 정보** 탭에서 양식을 작성합니다.

1. 캔버스에 추가한 **모델 배포(엔드포인트)** 단계 바로 앞에 있는 단계가 포함된 경우 커서를 클릭하고 단계에서 **모델 배포(엔드포인트)** 단계로 드래그하여 엣지를 만듭니다.

1. 캔버스에 추가한 **모델 배포(엔드포인트)** 단계 바로 뒤에 있는 단계가 포함된 경우 **모델 배포(엔드포인트)** 단계에서 커서를 클릭하고 단계로 드래그하여 엣지를 만듭니다.

## 변환 단계
<a name="step-type-transform"></a>

배치 변환을 위한 변환 단계를 사용하여 전체 데이터세트에 대해 추론을 실행합니다. 배치 변환에 대한 자세한 정보는 [추론 파이프라인을 사용하여 배치 변환](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 ]

드래그 앤 드롭 시각적 편집기를 사용하여 파이프라인에 배치 변환 단계를 추가하려면 다음을 수행합니다.

1. [Amazon SageMaker Studio 출시](studio-updated-launch.md)의 지침에 따라 Studio 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **파이프라인**을 클릭합니다.

1. **생성(Create)**을 선택합니다.

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

------

## 조건 단계
<a name="step-type-condition"></a>

조건 단계를 사용하여 단계 속성의 조건을 평가하여 파이프라인에서 다음에 취해야 할 조치를 평가합니다.

조건 단계에는 다음이 필요합니다.
+ 조건 목록
+ 조건이 `true`로 평가되는 경우 실행할 단계의 목록
+ 조건이 `false`로 평가되는 경우 실행할 단계의 목록

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

파이프라인 디자이너를 사용하여 파이프라인에 조건 단계를 추가하려면 다음을 수행합니다.

1. [Amazon SageMaker Studio 출시](studio-updated-launch.md)의 지침에 따라 Amazon SageMaker Studio 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **파이프라인**을 클릭합니다.

1. **생성(Create)**을 선택합니다.

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`정의를 생성하는 방법을 보여줍니다.

**제한 사항 **
+ Pipelines은 중첩된 조건 단계의 사용을 지원하지 않습니다. 조건 단계를 다른 조건 단계의 입력으로 전달할 수 없습니다.
+ 조건 단계는 두 브랜치에서 동일한 단계를 사용할 수 없습니다. 두 브랜치에 동일한 단계 기능이 필요한 경우 단계를 복제하고 다른 이름을 지정하세요.

```
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.Condition\$1Step.ConditionStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#conditionstep) API 참조를 참조하세요. 지원되는 조건에 대한 자세한 내용은 SageMaker AI Python SDK 설명서의 *[Amazon SageMaker Pipelines - Conditions](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#conditions)*을 참조하세요.

------

## 콜백 단계
<a name="step-type-callback"></a>

`Callback` 단계를 사용하여 Amazon SageMaker Pipelines에서 직접 제공하지 않는 추가 프로세스와 AWS 서비스를 워크플로에 추가합니다. `Callback` 단계가 실행되면 다음 절차가 수행됩니다.
+ Pipelines이 고객 지정한 Amazon Simple Queue Service(Amazon SQS) 대기열에 메시지를 전송합니다. 메시지에는 Pipelines에서 생성한 토큰과 고객이 제공한 입력 파라미터 목록이 포함되어 있습니다. 메시지를 보낸 후 Pipelines은 고객의 응답을 기다립니다.
+ 고객은 Amazon SQS 대기열에서 메시지를 검색하고 사용자 지정 프로세스를 시작합니다.
+ 프로세스가 완료되면 고객은 다음 API 중 하나를 직접 호출하고 Pipelines에서 생성된 토큰을 제출합니다.
  +  [SendPipelineExecutionStepSuccess](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_SendPipelineExecutionStepSuccess.html)와 출력 파라미터 목록
  +  [SendPipelineExecutionStepFailure](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_SendPipelineExecutionStepFailure.html)와 실패 사유
+ API 직접 호출로 인해 Pipelines이 파이프라인 프로세스를 계속하거나 프로세스에 실패합니다.

`Callback` 단계 요구 사항에 대한 자세한 내용은 [SageMaker.Workflow.Callback\$1step.CallbackStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.callback_step.CallbackStep) 설명서를 참조하세요. 전체 솔루션을 보려면 [콜백 단계를 사용하여 사용자 지정 단계를 포함하도록 SageMaker Pipelines 확장](https://aws.amazon.com/blogs/machine-learning/extend-amazon-sagemaker-pipelines-to-include-custom-steps-using-callback-steps/)을 참조하세요.

**중요**  
`Callback` 단계는 Amazon SageMaker Python SDK v2.45.0과 Amazon SageMaker Studio Classic v3.6.2에 도입되었습니다. `Callback` 단계를 사용하기 전에 Studio Classic을 업데이트해야 합니다. 업데이트하지 않으면 파이프라인 DAG가 표시되지 않습니다. Studio Classic을 업데이트하려면 [Amazon SageMaker Studio Classic 종료 및 업데이트](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.aws.amazon.com/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 단계
<a name="step-type-lambda"></a>

Lambda 단계를 사용하여 AWS Lambda 함수를 실행합니다. 기존 Lambda 함수를 실행하거나 SageMaker AI는 새 Lambda 함수를 생성하고 실행할 수 있습니다. 기존 Lambda 함수를 사용하기로 선택한 경우 SageMaker AI 파이프라인 AWS 리전 과 동일한에 있어야 합니다. 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)를 참조하세요.

**중요**  
Lambda 단계는 Amazon SageMaker Python SDK v2.51.0과 Amazon SageMaker Studio Classic v3.9.1에 도입되었습니다. Lambda 단계를 사용하기 전에 Studio Classic을 업데이트해야 합니다. 업데이트하지 않으면 파이프라인 DAG가 표시되지 않습니다. Studio Classic을 업데이트하려면 [Amazon SageMaker Studio Classic 종료 및 업데이트](studio-tasks-update-studio.md) 섹션을 참조하세요.

SageMaker AI는 Lambda 함수를 생성, 업데이트, 간접 호출 및 삭제할 수 있는 [SageMaker.Lambda\$1Helper.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`유형의 `lambda_func`인수가 있습니다. 기존 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` 클래스에는 Lambda 함수를 실행할 수 있는 최대 시간을 지정하는 `timeout`인수가 있습니다. 기본값은 120초이며 최대값은 10분입니다. 제한 시간에 도달했을 때 Lambda 함수가 실행 중이면 Lambda 단계는 실패하지만 Lambda 함수는 계속 실행됩니다.

Lambda 단계에서 호출한 Lambda 함수를 중지할 수 없기 때문에 Lambda 단계가 실행되는 동안에는 파이프라인 프로세스를 중지할 수 없습니다. Lambda 함수가 실행되는 동안 프로세스를 중지하면 파이프라인은 함수가 완료될 때까지 또는 제한 시간에 도달할 때까지 기다립니다. 둘 중 어느 상황이 먼저 발생하는지에 따라 달라집니다. 그런 다음 프로세스가 중지됩니다. Lambda 함수가 완료되면 파이프라인 프로세스 상태는 `Stopped`입니다. 제한 시간에 도달하면 파이프라인 프로세스 상태는 `Failed`입니다.

## ClarifyCheck 단계
<a name="step-type-clarify-check"></a>

이 `ClarifyCheck`단계를 사용하여 바이어스 분석 및 모델 설명 가능성에 대해 이전 기준 대비 기준 드리프트 검사를 수행할 수 있습니다. 그런 다음 `model.register()`메서드로 [기준을 생성 및 등록](https://docs.aws.amazon.com/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 Model Monitor가 모델 엔드포인트에 사용할 수 있습니다. 따라서 [기준](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-create-baseline.html) 제안을 별도로 수행할 필요가 없습니다.

`ClarifyCheck` 단계에서는 모델 레지스트리에서 드리프트 검사의 기준을 가져올 수도 있습니다. `ClarifyCheck` 단계에서는 SageMaker Clarify 사전 빌드된 컨테이너를 사용합니다. 이 컨테이너는 제약 조건 제안 및 주어진 기준에 대한 제약 조건 검증을 비롯한 다양한 모델 모니터링 기능을 제공합니다. 자세한 내용은 [사전 구축된 SageMaker Clarify 컨테이너](clarify-processing-job-configure-container.md) 단원을 참조하십시오.

### ClarifyCheck 단계 구성
<a name="configuring-step-type-clarify"></a>

파이프라인에서 사용할 때마다 사용 가능한 검사 유형 중 하나만을 수행하도록 `ClarifyCheck`단계를 구성할 수 있습니다.
+ 데이터 바이어스 검사
+ 모델 바이어스 검사
+ 모델 설명 가능성 검사

그러기 위해 `clarify_check_config` 파라미터를 다음 검사 유형 값 중 하나로 설정합니다.
+ `DataBiasCheckConfig`
+ `ModelBiasCheckConfig`
+ `ModelExplainabilityCheckConfig`

`ClarifyCheck` 단계는 SageMaker AI Clarify 사전 구축된 컨테이너를 실행하는 처리 작업을 시작하며 [검사 및 처리 작업을 위한 전용 구성](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-configure-processing-jobs.html)이 필요합니다. `ClarifyCheckConfig` 및 `CheckJobConfig`는 이러한 구성을 위한 도우미 함수입니다. 이러한 도우미 함수는 SageMaker Clarify 처리 작업이 모델 편향, 데이터 편향 또는 모델 설명 가능성을 검사하기 위해 계산하는 방식에 부합합니다. 자세한 내용은 [편향 분석 및 설명 가능성을 위한 SageMaker Clarify 처리 작업 실행](clarify-processing-job-run.md) 단원을 참조하십시오.

### 드리프트 검사의 단계 동작 제어
<a name="controlling-step-type-clarify"></a>

`ClarifyCheck` 단계의 동작을 제어하려면 다음 두 개의 부울 플래그가 필요합니다.
+ `skip_check`: 이 파라미터는 이전 기준에 대한 드리프트 검사를 건너뛰었는지 여부를 나타냅니다. `False`로 설정된 경우 구성된 검사 유형의 이전 기준을 사용할 수 있어야 합니다.
+ `register_new_baseline`: 이 파라미터는 `BaselineUsedForDriftCheckConstraints`단계 속성을 통해 새로 계산된 기준에 액세스할 수 있는지 여부를 나타냅니다. `False`로 설정된 경우 구성된 검사 유형의 이전 기준 역시 사용할 수 있어야 합니다. `BaselineUsedForDriftCheckConstraints` 속성을 통해 액세스할 수 있습니다.

자세한 내용은 [Amazon SageMaker Pipelines의 명확화 검사 및 품질 검사 단계를 사용한 기준 계산, 드리프트 감지 및 수명 주기](pipelines-quality-clarify-baseline-lifecycle.md)섹션을 참조하세요.

### 기준 작업
<a name="step-type-clarify-working-with-baselines"></a>

선택적으로 `model_package_group_name`을 지정하여 기존 기준을 찾을 수 있습니다. 그런 다음 `ClarifyCheck` 단계는 모델 패키지 그룹의 승인된 최신 모델 패키지에서 `DriftCheckBaselines`을 가져옵니다.

또는 `supplied_baseline_constraints`파라미터를 통해 이전 기준을 제공할 수 있습니다. `model_package_group_name`, `supplied_baseline_constraints`를 모두 지정하는 경우 `ClarifyCheck`단계에서는 `supplied_baseline_constraints`파라미터로 지정된 기준을 사용합니다.

`ClarifyCheck` 단계 요구 사항 사용에 대한 자세한 내용은 *Amazon SageMaker AI SDK for Python*의 [SageMaker.workflow.steps.ClarifyCheckStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.clarify_check_step.ClarifyCheckStep)을 참조하세요. 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 단계
<a name="step-type-quality-check"></a>

`QualityCheck` 단계를 사용하여 파이프라인의 데이터 품질 또는 모델 품질에 대한 이전 기준과 비교하여 [기준 제안](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-create-baseline.html) 및 드리프트 검사를 수행합니다. 그런 다음 `model.register()` 메서드로 [기준을 생성 및 등록](https://docs.aws.amazon.com/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 SageMaker AI Model Monitor 사전 구축 컨테이너를 활용합니다. 이 컨테이너에는 제약 조건 제안, 통계 생성, 주어진 기준에 대한 제약 조건 검증을 비롯한 다양한 모델 모니터링 기능이 있습니다. 자세한 내용은 [Amazon SageMaker Model Monitor 사전 구축 컨테이너](model-monitor-pre-built-container.md) 단원을 참조하십시오.

### QualityCheck 단계 구성
<a name="configuring-step-type-quality"></a>

파이프라인에서 사용할 때마다 사용 가능한 검사 유형 중 하나만을 실행하도록 `QualityCheck` 단계를 구성할 수 있습니다.
+ 데이터 품질 검사
+ 모델 품질 검사

다음 검사 유형 값 중 하나로 `quality_check_config`파라미터를 설정하여 이 작업을 수행합니다.
+ `DataQualityCheckConfig`
+ `ModelQualityCheckConfig`

`QualityCheck` 단계에서는 Model Monitor 사전 빌드된 컨테이너를 실행하는 처리 작업을 시작하며 검사 및 처리 작업을 위한 전용 구성이 필요합니다. `QualityCheckConfig` 및 `CheckJobConfig`는 이러한 구성에 대한 도우미 함수입니다. 이러한 도우미 함수는 Model Monitor가 모델 품질 또는 데이터 품질 모니터링을 위한 기준을 만드는 방식에 부합합니다. 모델 모니터 기준 제안에 대한 자세한 내용은 [기준 생성](model-monitor-create-baseline.md), [모델 품질 기준 만들기](model-monitor-model-quality-baseline.md)섹션을 참조하세요.

### 드리프트 검사의 단계 동작 제어
<a name="controlling-step-type-quality"></a>

`QualityCheck` 단계의 동작을 제어하려면 다음 두 개의 부울 플래그가 필요합니다.
+ `skip_check`: 이 파라미터는 이전 기준에 대한 드리프트 검사를 건너뛰었는지 여부를 나타냅니다. `False`로 설정된 경우 구성된 검사 유형의 이전 기준을 사용할 수 있어야 합니다.
+ `register_new_baseline`: 이 파라미터는 단계 속성 `BaselineUsedForDriftCheckConstraints`및 `BaselineUsedForDriftCheckStatistics`를 통해 새로 계산된 기준에 액세스할 수 있는지 여부를 나타냅니다. `False`로 설정된 경우 구성된 검사 유형의 이전 기준 역시 사용할 수 있어야 합니다. `BaselineUsedForDriftCheckConstraints` 및 `BaselineUsedForDriftCheckStatistics`속성을 통해 이러한 속성에 액세스할 수 있습니다.

자세한 내용은 [Amazon SageMaker Pipelines의 명확화 검사 및 품질 검사 단계를 사용한 기준 계산, 드리프트 감지 및 수명 주기](pipelines-quality-clarify-baseline-lifecycle.md)섹션을 참조하세요.

### 기준 작업
<a name="step-type-quality-working-with-baselines"></a>

`supplied_baseline_statistics` 및 `supplied_baseline_constraints` 파라미터를 통해 직접 이전 기준을 지정할 수 있습니다. 또한 `model_package_group_name`을 지정할 수 있으며, `QualityCheck` 단계는 모델 패키지 그룹의 승인된 최신 모델 패키지에서 `DriftCheckBaselines`을 가져옵니다.

다음을 지정하면 `QualityCheck` 단계는 `QualityCheck` 단계의 검사 유형에서 `supplied_baseline_constraints` 및 `supplied_baseline_statistics`으로 지정된 기준을 사용합니다.
+ `model_package_group_name`
+ `supplied_baseline_constraints`
+ `supplied_baseline_statistics`

`QualityCheck` 단계 요구 사항 사용에 대한 자세한 내용은 *Amazon SageMaker AI SDK for Python*의 [sagemaker.workflow.steps.QualityCheckStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.quality_check_step.QualityCheckStep)을 참조하세요. 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 단계
<a name="step-type-emr"></a>

Amazon SageMaker Pipelines [EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-overview.html) 단계를 사용하여 다음을 수행합니다.
+ 실행 중인 Amazon EMR 클러스터에서 [Amazon EMR 단계](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-work-with-steps.html)를 처리합니다.
+ 파이프라인에서 Amazon EMR 클러스터를 만들고 관리하도록 합니다.

Amazon EMR에 대한 자세한 내용은 [Amazon EMR 시작하기](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-gs.html)를 참조하세요.

EMR 단계를 수행하려면 Amazon EMR 클러스터에서 사용하는 JAR 파일의 위치와 전달할 인수가 `EMRStepConfig`에 포함되어야 합니다. 실행 중인 EMR 클러스터에서 단계를 실행하려는 경우 Amazon EMR 클러스터 ID도 제공합니다. 클러스터 구성을 전달하여 클러스터가 만들고 관리하고 종료하는 클러스터에서 EMR 단계를 실행할 수도 있습니다. 다음 섹션에는 두 가지 방법을 모두 보여주는 샘플 노트북으로 연결되는 링크와 예제가 포함되어 있습니다.

**참고**  
EMR 단계를 수행하려면 파이프라인에 전달된 역할에 추가 권한이 있어야 합니다. [AWS 관리형 정책인 `AmazonSageMakerPipelinesIntegrations`](https://docs.aws.amazon.com/sagemaker/latest/dg/security-iam-awsmanpol-pipelines.html#security-iam-awsmanpol-AmazonSageMakerPipelinesIntegrations)을 파이프라인 역할에 연결하거나 역할에 해당 정책의 권한이 포함되어 있는지 확인합니다.
실행 중인 클러스터에서 EMR 단계를 처리하는 경우 다음 상태 중 하나에 있는 클러스터만 사용할 수 있습니다.  
`STARTING`
`BOOTSTRAPPING`
`RUNNING`
`WAITING`
실행 중인 클러스터에서 EMR 단계를 처리하는 경우 EMR 클러스터의 `PENDING`상태에서 최대 256개의 EMR 단계를 가질 수 있습니다. 이 한도를 초과하여 제출된 EMR 단계는 파이프라인 실행에 실패합니다. [파이프라인 단계에 대한 재시도 정책](pipelines-retry-policy.md) 사용을 고려해 볼 수 있습니다.
클러스터 ID와 클러스터 구성 중 하나를 지정할 수 있지만 둘 다 지정할 수는 없습니다.
EMR 단계는 Amazon EventBridge를 사용하여 EMR 단계 또는 클러스터 상태의 변경 사항을 모니터링합니다. 실행 중인 클러스터에서 Amazon EMR 작업을 처리하는 경우 EMR 단계는 `SageMakerPipelineExecutionEMRStepStatusUpdateRule`규칙을 사용하여 EMR 단계 상태를 모니터링합니다. EMR 단계에서 만드는 클러스터에서 작업을 처리하는 경우 단계는 `SageMakerPipelineExecutionEMRClusterStatusRule` 규칙을 사용하여 클러스터 상태의 변경을 모니터링합니다. AWS 계정에 이러한 EventBridge 규칙 중 하나가 표시되면 삭제하지 마십시오. 그렇지 않으면 EMR 단계가 완료되지 않을 수 있습니다.

**파이프라인에 Amazon EMR 단계 추가**

파이프라인에 EMR 단계를 추가하려면 다음을 수행합니다.
+ [Amazon SageMaker Studio 시작의 지침에 따라 Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-launch.html) 콘솔을 엽니다.
+ 왼쪽 탐색 창에서 **파이프라인**을 클릭합니다.
+ **생성(Create)**을 선택합니다.
+ **비어 있음**을 선택합니다.
+ 왼쪽 사이드바에서 **데이터 처리**를 선택하고 캔버스로 드래그합니다.
+ 캔버스에서 추가한 **데이터 처리** 단계를 선택합니다.
+ 오른쪽 사이드바의 모드에서 **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"
)
```

전체 예시를 안내하는 샘플 노트북은 [Pipelines EMR Step With Running EMR Cluster](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.aws.amazon.com/emr/latest/APIReference/API_RunJobFlow.html) 요청과 구조가 동일해야 합니다. 하지만 클러스터 구성에 다음 필드를 포함시키지 마세요.
+ [`Name`]
+ [`Steps`]
+ [`AutoTerminationPolicy`]
+ [`Instances`][`KeepJobFlowAliveWhenNoSteps`]
+ [`Instances`][`TerminationProtected`]

다른 모든 `RunJobFlow`인수는 클러스터 구성에서 사용할 수 있습니다. 요청 구문에 대한 자세한 내용은 [RunJobflow](https://docs.aws.amazon.com/emr/latest/APIReference/API_RunJobFlow.html)를 참조하세요.

다음 예시에서는 클러스터 구성을 EMR 단계 정의에 전달합니다. 그러면 새 EMR 클러스터에서 새 작업을 시작하는 단계가 표시됩니다. 이 예제의 EMR 클러스터 구성에는 기본 및 코어 EMR 클러스터 노드의 사양이 포함되어 있습니다. Amazon EMR 노드 유형에 대한 자세한 내용은 [노드 유형 이해: 기본, 코어 및 태스크 노드](https://docs.aws.amazon.com/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
)
```

전체 예시를 안내하는 샘플 노트북은 [Pipelines EMR Step With Cluster Lifecycle Management](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-pipelines/tabular/emr-step/sagemaker-pipelines-emr-step-with-cluster-lifecycle-management.ipynb)를 참조하세요.

## EMR 서버리스 단계
<a name="step-type-serverless"></a>

파이프라인에 EMR 서버리스 단계를 추가하려면 다음을 수행합니다.
+ [Amazon SageMaker Studio 시작의 지침에 따라 Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-launch.html) 콘솔을 엽니다.
+ 왼쪽 탐색 창에서 **파이프라인**을 클릭합니다.
+ **생성(Create)**을 선택합니다.
+ **비어 있음**을 선택합니다.
+ 왼쪽 사이드바에서 **데이터 처리**를 선택하고 캔버스로 드래그합니다.
+ 캔버스에서 추가한 **데이터 처리** 단계를 선택합니다.
+ 오른쪽 사이드바의 모드에서 **EMR(서버리스)**을 선택합니다.
+ 오른쪽 사이드바의 **설정 및 세부 정보** 탭에 있는 양식을 작성합니다.

## 노트북 작업 단계
<a name="step-type-notebook-job"></a>

`NotebookJobStep`을 사용하여 SageMaker 노트북 작업을 파이프라인 단계로 비대화형으로 실행합니다. Pipelines 드래그 앤 드롭 UI에서 파이프라인을 빌드하는 경우 [코드 실행 단계](#step-type-executecode)를 사용하여 노트북을 실행합니다. SageMaker 노트북 작업에 대한 자세한 정보는 [SageMaker 노트북](notebook-auto-run.md)에서 확인하세요.

`NotebookJobStep`에는 최소한 입력 노트북, 이미지 URI 및 커널 이름이 필요합니다. 노트북 작업 단계 요구 사항 및 단계를 사용자 지정하기 위해 설정할 수 있는 기타 파라미터에 대한 자세한 내용은 [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 노트북 작업으로 처리됩니다. 따라서 `tags` 인수에 특정 태그를 포함하여 Studio Classic UI 노트북 작업 대시보드에서 실행 상태를 추적합니다. 포함할 태그에 대한 자세한 내용은 [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) 단원을 참조하십시오.

## 실패 단계
<a name="step-type-fail"></a>

원하는 조건 또는 상태가 달성되지 않을 때 Amazon SageMaker Pipelines을 중지하는 데 실패 단계를 사용합니다. 또한 실패 단계를 사용하여 파이프라인 실행 실패의 원인을 나타내는 사용자 지정 오류 메시지를 입력할 수 있습니다.

**참고**  
실패 단계 및 다른 파이프라인 단계를 동시에 실행하면 모든 동시 작업 단계가 완료될 때까지 파이프라인이 종료되지 않습니다.

### 실패 단계 사용에 대한 제한 사항
<a name="step-type-fail-limitations"></a>
+ 다른 단계의 `DependsOn` 목록에 실패 단계를 추가할 수 없습니다. 자세한 내용은 [단계 간 사용자 지정 종속성](build-and-manage-steps.md#build-and-manage-custom-dependency) 단원을 참조하십시오.
+ 다른 단계는 실패 단계를 참조할 수 없습니다. 이는 항상 파이프라인 실행의 마지막 단계입니다.**
+ 실패 단계로 끝나는 파이프라인 실행은 재시도할 수 없습니다.

정적 텍스트 문자열 형태로 실패 단계 오류 메시지를 만들 수 있습니다. 또는 SDK를 사용할 경우 [파이프라인 파라미터](https://docs.aws.amazon.com/sagemaker/latest/dg/build-and-manage-parameters.html), [조인](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html?highlight=Join#sagemaker.workflow.functions.Join) 작업 또는 기타 [단계 속성](https://docs.aws.amazon.com/sagemaker/latest/dg/build-and-manage-steps.html#build-and-manage-properties)을 사용하여 보다 유용한 오류 메시지를 만들 수도 있습니다.

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

파이프라인에 실패 단계를 추가하려면 다음을 수행합니다.

1. [Amazon SageMaker Studio 출시](studio-updated-launch.md)의 지침에 따라 Studio 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **파이프라인**을 클릭합니다.

1. **생성(Create)**을 선택합니다.

1. **비어 있음**을 선택합니다.

1. 왼쪽 사이드바에서 **실패**를 선택하고 캔버스로 드래그합니다.

1. 캔버스에서 추가한 **실패** 단계를 선택합니다.

1. 오른쪽 사이드바의 **설정** 및 **세부 정보** 탭에서 양식을 작성합니다. 이러한 탭의 필드에 대한 자세한 내용은 [sagemaker.workflow.fail\$1step.FailStep](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.fail_step.FailStep)을 참조하세요.

1. 캔버스에 추가한 **실패** 단계 바로 앞에 있는 단계가 포함된 경우 커서를 클릭하고 단계에서 **실패** 단계로 드래그하여 엣지를 만듭니다.

1. 캔버스에 추가한 **실패** 단계 바로 뒤에 있는 단계가 포함된 경우 **실패** 단계에서 커서를 클릭하고 단계로 드래그하여 엣지를 만듭니다.

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

**Example**  
다음 예제 코드 스니펫은 파이프라인 파라미터로 구성된 `ErrorMessage`와 `Join`작업을 사용하는 `FailStep`을 사용합니다.  

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

------

# 통합 추가
<a name="build-and-manage-steps-integration"></a>

MLflow 통합을 사용하면 MLflow를 파이프라인과 함께 사용하여 추적 서버 또는 서버리스 애플리케이션을 선택하고, 실험을 선택하고, 지표를 로깅할 수 있습니다.

## 주요 개념
<a name="add-integration-key-concepts"></a>

**기본 앱 생성** - 파이프라인 시각적 편집기를 입력하면 기본 MLflow 애플리케이션이 생성됩니다.

**통합 패널** - 새 통합 패널에는 선택 및 구성할 수 있는 MLflow가 포함되어 있습니다.

**앱 및 실험 업데이트** - 파이프라인 실행 중에 선택한 애플리케이션 및 실험을 재정의하는 옵션입니다.

## 작동 방식
<a name="add-integration-how-it-works"></a>
+ **파이프라인 시각적 편집기**로 이동
+ 도구 모음에서 **통합**을 선택합니다.
+ **MLflow** 선택
+ MLflow 앱 및 실험 구성

## 스크린샷 예제
<a name="add-integration-example-screenshots"></a>

통합 사이드 패널

![\[할 일 설명입니다.\]](http://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/images/screenshot-pipeline-1.png)


MLflow 구성

![\[할 일 설명입니다.\]](http://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/images/screenshot-pipeline-2.png)


파이프라인 실행 중에 실험을 재정의하는 방법

![\[할 일 설명입니다.\]](http://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/images/screenshot-pipeline-3.png)


## 단계 속성
<a name="build-and-manage-properties"></a>

`properties` 속성을 사용하여 파이프라인의 단계 간에 데이터 종속성을 추가합니다. Pipelines은 이러한 데이터 종속성을 사용하여 파이프라인 정의에서 DAG를 구성합니다. 이러한 속성은 자리 표시자 값으로 참조될 수 있으며 런타임에 확인됩니다.

Pipelines 단계의 `properties` 속성은 해당 SageMaker AI 작업 유형에 대한 `Describe` 직접 호출에서 반환된 객체와 일치합니다. 각 작업 유형에 대해 `Describe`호출은 다음과 같은 응답 객체를 반환합니다.
+ `ProcessingStep` – [DescribeProcessingJob](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeProcessingJob.html)
+ `TrainingStep` – [DescribeTrainingJob](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeTrainingJob.html)
+ `TransformStep` – [DescribeTransformJob](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeTransformJob.html)

데이터 종속성 생성 중에 각 단계 유형에 대해 참조할 수 있는 속성을 확인하려면 [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable)의 [데이터 종속성 - 속성 참조](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#data-dependency-property-reference)를 참조하세요.**

## 단계 병렬화
<a name="build-and-manage-parallelism"></a>

단계가 다른 단계에 종속되지 않는 경우 파이프라인 실행 즉시 실행됩니다. 하지만 너무 많은 파이프라인 단계를 병렬로 실행하면 가용 리소스가 빠르게 고갈될 수 있습니다. `ParallelismConfiguration`을 사용하여 파이프라인 실행의 동시 단계 수를 제어할 수 있습니다.

다음 예제에서는 `ParallelismConfiguration`을 사용하여 동시 단계 제한을 5로 설정합니다.

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

## 단계 간 데이터 종속성
<a name="build-and-manage-data-dependency"></a>

단계 간 데이터 관계를 지정하여 DAG의 구조를 정의합니다. 단계 간에 데이터 종속성을 만들려면 한 단계의 속성을 파이프라인의 다른 단계에 입력으로 전달합니다. 입력을 받는 단계는 입력을 제공하는 단계가 실행을 완료할 때까지 시작되지 않습니다.

데이터 종속성은 다음 형식의 JSONPath 표기법을 사용합니다. 이 형식은 JSON 속성 파일을 통과합니다. 즉, 파일에서 원하는 중첩 속성에 도달하는 데 필요한 만큼 *<property>* 인스턴스를 추가할 수 있습니다. JSONPath 표기법에 대한 자세한 내용은 [JSONPath 리포지토리](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
    ))
)
```

데이터 종속성 생성 중에 각 단계 유형에 대해 참조할 수 있는 속성을 확인하려면 [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable)의 [데이터 종속성 - 속성 참조](https://sagemaker.readthedocs.io/en/stable/amazon_sagemaker_model_building_pipeline.html#data-dependency-property-reference)를 참조하세요.**

## 단계 간 사용자 지정 종속성
<a name="build-and-manage-custom-dependency"></a>

데이터 종속성을 지정하면 Pipelines은 단계 간의 데이터 연결을 제공합니다. 또는 Pipelines을 직접 사용하지 않고도 한 단계에서 이전 단계의 데이터에 접근할 수 있습니다. 이 경우 다른 단계 실행이 완료될 때까지 단계를 시작하지 않도록 Pipelines에 알리는 사용자 지정 종속성을 만들 수 있습니다. 단계의 `DependsOn`속성을 지정하여 사용자 지정 종속성을 생성합니다.

예를 들어, 다음은 `A`단계와 `B`단계가 모두 실행된 후에만 시작되는 `C`단계를 정의합니다.

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

## 단계의 사용자 지정 이미지
<a name="build-and-manage-images"></a>

 파이프라인에서 단계를 생성할 때 사용 가능한 SageMaker AI [딥 러닝 컨테이너 이미지](https://github.com/aws/deep-learning-containers/blob/master/available_images.md)를 모두 사용할 수 있습니다.

파이프라인 단계가 있는 자체 컨테이너를 사용할 수도 있습니다. Studio Classic 내에서 이미지를 만들 수 없으므로 Pipelines에서 이미지를 사용하기 전에 다른 방법을 사용하여 이미지를 만들어야 합니다.

파이프라인 단계를 생성할 때 자체 컨테이너를 사용하려면 예측기 정의에 이미지 URI를 포함합니다. SageMaker AI에서 자체 컨테이너를 사용하는 방법에 대한 자세한 내용은 [Using Docker Containers with SageMaker AI](https://docs.aws.amazon.com/sagemaker/latest/dg/docker-containers.html)를 참조하세요.