

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

# 파이프라인 실행
<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. [Launch Amazon SageMaker Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-launch.html)의 지침에 따라 SageMaker Studio를 엽니다.

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

1. (선택 사항) 파이프라인 목록을 이름으로 필터링하려면 검색 필드에 파이프라인 이름의 전체 또는 일부를 입력합니다.

1. 파이프라인 이름을 선택하면 파이프라인 세부 정보 뷰가 열립니다.

1. 오른쪽 상단에서 **시각적 편집기**를 선택합니다.

1. 최신 버전에서 실행을 시작하려면 **실행**을 선택합니다.

1. 특정 버전에서 실행을 시작하려면 다음 단계를 따릅니다.
   + 하단 도구 모음에서 버전 아이콘을 선택하여 버전 패널을 엽니다.
   + 실행할 파이프라인 버전을 선택합니다.
   + 버전 항목 위로 마우스를 가져가서 점 3개 메뉴가 표시되면 **실행**을 선택합니다.
   + (선택 사항) 파이프라인의 이전 버전을 보려면 버전 패널의 점 3개 메뉴에서 **미리 보기**를 선택합니다. 알림 표시줄에서 **편집**을 선택하여 버전을 편집할 수도 있습니다.

**참고**  
파이프라인이 실패하면 상태 배너에 **실패** 상태가 표시됩니다. 실패한 단계의 문제를 해결한 후 상태 배너에서 **재시도**를 선택하여 해당 단계부터 파이프라인 실행을 재개합니다.

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

1. Amazon SageMaker Studio Classic에 로그인합니다. 자세한 내용은 [Launch 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/ko_kr/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`단계에서 생성된 모델 패키지 버전은 SageMaker 프로젝트와 같은 CI/CD 파이프라인을 통해 자동으로 배포할 준비가 됩니다. 자세한 내용은 [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()
   ```