

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

# @step 데코레이터를 사용한 Python 코드 리프트 앤 시프트
<a name="pipelines-step-decorator"></a>

`@step` 데코레이터는 로컬 기계 학습(ML) 코드를 하나 이상의 파이프라인 단계로 변환하는 기능입니다. 다른 ML 프로젝트와 마찬가지로 ML 함수를 작성할 수 있습니다. 로컬에서 테스트하거나 `@remote` 데코레이터를 사용하여 훈련 작업으로 테스트한 후에는 `@step` 데코레이터를 추가하여 함수를 SageMaker AI 파이프라인 단계로 변환할 수 있습니다. 그런 다음, `@step`으로 데코레이션된 함수 직접 호출의 출력을 파이프라인에 단계로 전달하여 파이프라인을 만들고 실행합니다. `@step` 데코레이터와 일련의 함수를 연결하여 다단계 방향성 비순환 그래프(DAG) 파이프라인을 만들 수도 있습니다.

`@step` 데코레이터를 사용하는 설정은 `@remote` 데코레이터를 사용하는 설정과 동일합니다. [환경을 설정](https://docs.aws.amazon.com/sagemaker/latest/dg/train-remote-decorator.html#train-remote-decorator-env)하고 [구성 파일을 사용](https://docs.aws.amazon.com/sagemaker/latest/dg/train-remote-decorator-config.html)하여 기본값을 설정하는 방법에 대한 자세한 내용은 원격 함수 설명서를 참조하세요. `@step` 데코레이터에 대한 자세한 내용은 [sagemaker.workflow.function\$1step.step](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.function_step.step)을 참조하세요.

`@step` 데코레이터 사용을 보여주는 샘플 노트북을 보려면 [@step decorator sample notebooks](https://github.com/aws/amazon-sagemaker-examples/tree/main/sagemaker-pipelines/step-decorator)을 참조하세요.

다음 섹션에서는 `@step` 데코레이터로 로컬 ML 코드에 주석을 달아 단계를 만들고, 단계를 사용하여 파이프라인을 만들고 실행하고, 사용 사례에 맞게 환경을 사용자 지정하는 방법을 설명합니다.

**Topics**
+ [`@step`으로 데코레이션된 함수를 사용하여 파이프라인 만들기](pipelines-step-decorator-create-pipeline.md)
+ [파이프라인 실행](pipelines-step-decorator-run-pipeline.md)
+ [파이프라인 구성](pipelines-step-decorator-cfg-pipeline.md)
+ [모범 사례](pipelines-step-decorator-best.md)
+ [제한 사항](pipelines-step-decorator-limit.md)

# `@step`으로 데코레이션된 함수를 사용하여 파이프라인 만들기
<a name="pipelines-step-decorator-create-pipeline"></a>

`@step` 데코레이터를 사용하여 Python 함수를 파이프라인 단계로 변환하고, 이러한 함수 간에 종속성을 만들어 파이프라인 그래프(또는 방향성 비순환 그래프(DAG))를 만들고, 해당 그래프의 리프 노드를 파이프라인에 단계 목록으로 전달하여 파이프라인을 만들 수 있습니다. 다음 섹션에서는 예시와 함께 이 절차에 대해 자세히 설명합니다.

**Topics**
+ [함수를 단계로 변환](#pipelines-step-decorator-run-pipeline-convert)
+ [단계 간 종속성 만들기](#pipelines-step-decorator-run-pipeline-link)
+ [`@step`으로 데코레이션된 단계와 함께 `ConditionStep` 사용](#pipelines-step-decorator-condition)
+ [단계의 `DelayedReturn` 출력을 사용하여 파이프라인 정의](#pipelines-step-define-delayed)
+ [파이프라인 생성](#pipelines-step-decorator-pipeline-create)

## 함수를 단계로 변환
<a name="pipelines-step-decorator-run-pipeline-convert"></a>

`@step` 데코레이터를 사용하여 단계를 만들려면 함수에 `@step`을 주석으로 지정합니다. 다음 예시에서는 데이터를 사전 처리하는 `@step`으로 데코레이션된 함수를 보여줍니다.

```
from sagemaker.workflow.function_step import step

@step
def preprocess(raw_data):
    df = pandas.read_csv(raw_data)
    ...
    return procesed_dataframe
    
step_process_result = preprocess(raw_data)
```

`@step`으로 데코레이션된 함수를 간접 호출하면 SageMaker AI는 함수를 실행하는 대신 `DelayedReturn` 인스턴스를 반환합니다. `DelayedReturn` 인스턴스는 해당 함수의 실제 반환에 대한 프록시입니다. `DelayedReturn` 인스턴스는 인수로 다른 함수에 전달하거나 파이프라인 인스턴스에 단계로 직접 전달할 수 있습니다. `DelayedReturn` 클래스에 대한 자세한 내용은 [sagemaker.workflow.function\$1step.DelayedReturn](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.function_step.DelayedReturn)을 참조하세요.

## 단계 간 종속성 만들기
<a name="pipelines-step-decorator-run-pipeline-link"></a>

두 단계 간에 종속성을 만들 때 파이프라인 그래프의 단계 간에 연결을 만듭니다. 다음 섹션에서는 파이프라인 단계 간에 종속성을 만들 수 있는 여러 방법을 소개합니다.

### 입력 인수를 통한 데이터 종속성
<a name="pipelines-step-decorator-run-pipeline-link-interstep"></a>

한 함수의 `DelayedReturn` 출력을 다른 함수에 대한 입력으로 전달하면 파이프라인 DAG에 데이터 종속성이 자동으로 만들어집니다. 다음 예시에서는 `preprocess` 함수의 `DelayedReturn` 출력을 `train` 함수에 전달하면 `preprocess`와 `train` 사이에 종속성이 만들어집니다.

```
from sagemaker.workflow.function_step import step

@step
def preprocess(raw_data):
    df = pandas.read_csv(raw_data)
    ...
    return procesed_dataframe

@step
def train(training_data):
    ...
    return trained_model

step_process_result = preprocess(raw_data)    
step_train_result = train(step_process_result)
```

이전 예시에서는 `@step`으로 데코레이션된 훈련 함수를 정의합니다. 이 함수가 간접 호출되면 사전 처리 파이프라인 단계의 `DelayedReturn` 출력을 입력으로 수신합니다. 훈련 함수를 간접 호출하면 다른 `DelayedReturn` 인스턴스가 반환됩니다. 이 인스턴스는 파이프라인 DAG를 형성하는 해당 함수에 정의된 모든 이전 단계(예: 이 예시의 `preprocess` 단계)에 대한 정보를 보유합니다.

이전 예시에서 `preprocess` 함수는 단일 값을 반환합니다. 목록 또는 튜플과 같은 더 복잡한 반환 유형은 [제한 사항](pipelines-step-decorator-limit.md) 섹션을 참조하세요.

### 사용자 지정 종속성 정의
<a name="pipelines-step-decorator-run-pipeline-link-custom"></a>

이전 예시에서 `train` 함수는 `preprocess`의 `DelayedReturn` 출력을 수신하고 종속성을 만들었습니다. 이전 단계 출력을 전달하지 않고 종속성을 명시적으로 정의하려면 단계와 함께 `add_depends_on` 함수를 사용합니다. `get_step()` 함수를 사용하여 `DelayedReturn` 인스턴스에서 기본 단계를 검색한 다음, 종속성을 입력으로 사용하여 `add_depends_on`\$1on을 직접 호출할 수 있습니다. `get_step()` 함수 정의를 보려면 [sagemaker.workflow.step\$1outputs.get\$1step](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.step_outputs.get_step)을 참조하세요. 다음 예시에서는 `get_step()` 및 `add_depends_on()`을 사용하여 `preprocess` 및 `train` 간의 종속성을 만드는 방법을 보여줍니다.

```
from sagemaker.workflow.step_outputs import get_step

@step
def preprocess(raw_data):
    df = pandas.read_csv(raw_data)
    ...
    processed_data = ..
    return s3.upload(processed_data)

@step
def train():
    training_data = s3.download(....)
    ...
    return trained_model

step_process_result = preprocess(raw_data)    
step_train_result = train()

get_step(step_train_result).add_depends_on([step_process_result])
```

### `@step`으로 데코레이션된 함수에서 기존 파이프라인 단계로 데이터를 주고 받습니다.
<a name="pipelines-step-decorator-run-pipeline-link-pass"></a>

`@step`으로 데코레이션된 단계와 기존 파이프라인 단계가 포함된 파이프라인을 만들고 이들 간에 데이터를 전달할 수 있습니다. 예를 들어 `ProcessingStep`을 사용하여 데이터를 처리하고 결과를 `@step`으로 데코레이션된 훈련 함수에 전달할 수 있습니다. 다음 예시에서는 `@step`으로 데코레이션된 훈련 단계가 처리 단계의 출력을 참조합니다.

```
# Define processing step

from sagemaker.sklearn.processing import SKLearnProcessor
from sagemaker.processing import ProcessingInput, ProcessingOutput
from sagemaker.workflow.steps import ProcessingStep

sklearn_processor = SKLearnProcessor(
    framework_version='1.2-1',
    role='arn:aws:iam::123456789012:role/SagemakerExecutionRole',
    instance_type='ml.m5.large',
    instance_count='1',
)

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")
]

process_step = ProcessingStep(
    name="MyProcessStep",
    step_args=sklearn_processor.run(inputs=inputs, outputs=outputs,code='preprocessing.py'),
)
```

```
# Define a @step-decorated train step which references the 
# output of a processing step

@step
def train(train_data_path, test_data_path):
    ...
    return trained_model
    
step_train_result = train(
   process_step.properties.ProcessingOutputConfig.Outputs["train"].S3Output.S3Uri,
   process_step.properties.ProcessingOutputConfig.Outputs["test"].S3Output.S3Uri,
)
```

## `@step`으로 데코레이션된 단계와 함께 `ConditionStep` 사용
<a name="pipelines-step-decorator-condition"></a>

Pipelines은 파이프라인에서 수행할 작업을 결정하기 위해 이전 단계의 결과를 평가하는 `ConditionStep` 클래스를 지원합니다. `@step`으로 데코레이션된 단계와 함께 `ConditionStep`을 사용할 수도 있습니다. `ConditionStep`으로 데코레이션된 단계와 함께 `@step`을 사용하려면 해당 단계의 출력을 `ConditionStep`에 대한 인수로 입력합니다. 다음 예시에서는 조건 단계가 `@step`으로 데코레이션된 모델 평가 단계의 출력을 수신합니다.

```
# Define steps

@step(name="evaluate")
def evaluate_model():
    # code to evaluate the model
    return {
        "rmse":rmse_value
    }
    
@step(name="register")
def register_model():
    # code to register the model
    ...
```

```
# Define ConditionStep

from sagemaker.workflow.condition_step import ConditionStep
from sagemaker.workflow.conditions import ConditionGreaterThanOrEqualTo
from sagemaker.workflow.fail_step import FailStep

conditionally_register = ConditionStep(
    name="conditional_register",
    conditions=[
        ConditionGreaterThanOrEqualTo(
            # Output of the evaluate step must be json serializable
            left=evaluate_model()["rmse"],  # 
            right=5,
        )
    ],
    if_steps=[FailStep(name="Fail", error_message="Model performance is not good enough")],
    else_steps=[register_model()],
)
```

## 단계의 `DelayedReturn` 출력을 사용하여 파이프라인 정의
<a name="pipelines-step-define-delayed"></a>

`@step` 데코레이터 사용 여부와 관계없이 파이프라인을 동일한 방식으로 정의합니다. `DelayedReturn` 인스턴스를 파이프라인에 전달할 때 파이프라인을 빌드하기 위해 전체 단계 목록을 전달할 필요가 없습니다. SDK는 사용자가 정의한 종속성을 기반으로 이전 단계를 자동으로 추론합니다. 파이프라인에 전달한 `Step` 객체 또는 `DelayedReturn` 객체의 이전 단계는 모두 파이프라인 그래프에 포함됩니다. 다음 예시에서는 파이프라인이 `train` 함수에 대한 `DelayedReturn` 객체를 수신합니다. SageMaker AI는 파이프라인 그래프에 `train` 이전 단계로 `preprocess` 단계를 추가합니다.

```
from sagemaker.workflow.pipeline import Pipeline

pipeline = Pipeline(
    name="<pipeline-name>",
    steps=[step_train_result],
    sagemaker_session=<sagemaker-session>,
)
```

단계 간에 데이터 또는 사용자 지정 종속성이 없고 여러 단계를 병렬로 실행하는 경우 파이프라인 그래프에 둘 이상의 리프 노드가 있습니다. 다음 예시와 같이 목록에 있는 이러한 모든 리프 노드를 파이프라인 정의의 `steps` 인수에 전달합니다.

```
@step
def process1():
    ...
    return data
    
@step
def process2():
   ...
   return data
   
step_process1_result = process1()
step_process2_result = process2()

pipeline = Pipeline(
    name="<pipeline-name>",
    steps=[step_process1_result, step_process2_result],
    sagemaker_session=sagemaker-session,
)
```

파이프라인이 실행되면 두 단계가 병렬로 실행됩니다.

리프 노드에는 데이터 또는 사용자 지정 종속성을 통해 정의된 모든 이전 단계에 대한 정보가 포함되어 있으므로 그래프의 리프 노드만 파이프라인에 전달합니다. 파이프라인을 컴파일할 때 SageMaker AI는 파이프라인 그래프를 구성하는 모든 후속 단계를 추론하고 각 단계를 파이프라인에 별도의 단계로 추가합니다.

## 파이프라인 생성
<a name="pipelines-step-decorator-pipeline-create"></a>

다음 코드 조각과 같이 `pipeline.create()`를 직접 호출하여 파이프라인을 만듭니다. `create()`에 대한 자세한 내용은 [sagemaker.workflow.pipeline.Pipeline.create](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.pipeline.Pipeline.create)를 참조하세요.

```
role = "pipeline-role"
pipeline.create(role)
```

`pipeline.create()`를 직접적으로 호출하면 SageMaker AI는 파이프라인 인스턴스의 일부로 정의된 모든 단계를 컴파일합니다. SageMaker AI는 직렬화된 함수, 인수 및 기타 모든 단계 관련 아티팩트를 Amazon S3에 업로드합니다.

데이터는 다음 구조에 따라 S3 버킷에 상주합니다.

```
s3_root_uri/
    pipeline_name/
        sm_rf_user_ws/
            workspace.zip  # archive of the current working directory (workdir)
        step_name/
            timestamp/
                arguments/                # serialized function arguments
                function/                 # serialized function
                pre_train_dependencies/   # any dependencies and pre_execution scripts provided for the step       
        execution_id/
            step_name/
                results     # returned output from the serialized function including the model
```

`s3_root_uri`는 SageMaker AI 구성 파일에 정의되어 있으며 전체 파이프라인에 적용됩니다. 정의되지 않은 경우 기본 SageMaker AI 버킷이 사용됩니다.

**참고**  
SageMaker AI가 파이프라인을 컴파일할 때마다 SageMaker AI는 타임스탬프가 현재 시간인 폴더에 단계의 직렬화된 함수, 인수 및 종속성을 저장합니다. 이는 `pipeline.create()`, `pipeline.update()`, `pipeline.upsert()` 또는 `pipeline.definition()`을 실행할 때마다 발생합니다.

# 파이프라인 실행
<a name="pipelines-step-decorator-run-pipeline"></a>

아래 페이지에서는 SageMaker AI 리소스를 사용하거나 로컬에서 Amazon SageMaker Pipelines으로 파이프라인을 실행하는 방법을 설명합니다.

기존 SageMaker AI 파이프라인 실행과 마찬가지로 `pipeline.start()` 함수로 새 파이프라인 실행을 시작합니다. `start()` 함수에 대한 자세한 내용은 [sagemaker.workflow.pipeline.Pipeline.start](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.pipeline.Pipeline.start)를 참조하세요.

**참고**  
`@step` 데코레이터를 사용하여 정의된 단계는 훈련 작업으로 실행됩니다. 따라서 다음 제한 사항을 고려해야 합니다.  
계정의 인스턴스 한도 및 훈련 작업 한도. 스로틀링 또는 리소스 한도 문제를 방지하려면 적절하게 한도를 업데이트합니다.
파이프라인에서 훈련 단계를 실행할 때마다 발생하는 금전적 비용. 자세한 내용은 [Amazon SageMaker 요금](https://aws.amazon.com/sagemaker/pricing/)을 참조하세요.

## 로컬에서 실행되는 파이프라인에서 결과 검색
<a name="pipelines-step-decorator-run-pipeline-retrieve"></a>

파이프라인 실행 단계의 결과를 보려면 다음 코드 조각과 같이 [execution.result()](https://sagemaker.readthedocs.io/en/stable/workflows/pipelines/sagemaker.workflow.pipelines.html#sagemaker.workflow.pipeline._PipelineExecution.result           )를 사용합니다.

```
execution = pipeline.start()
execution.result(step_name="train")
```

**참고**  
Pipelines은 로컬 모드에서 `execution.result()`를 지원하지 않습니다.

한 번에 한 단계의 결과만 검색할 수 있습니다. 단계 이름이 SageMaker AI에서 생성된 경우 다음과 같이 `list_steps`을 직접적으로 호출하여 단계 이름을 검색할 수 있습니다.

```
execution.list_step()
```

## 로컬에서 파이프라인 실행
<a name="pipelines-step-decorator-run-pipeline-local"></a>

기존 파이프라인 단계와 마찬가지로 로컬에서 `@step`으로 데코레이션된 단계를 사용하여 파이프라인을 실행할 수 있습니다. 로컬 모드 파이프라인 실행에 대한 자세한 내용은 [로컬 모드를 사용하여 파이프라인 실행](pipelines-local-mode.md) 섹션을 참조하세요. 로컬 모드를 사용하려면 다음 예시와 같이 파이프라인 정의에 `SageMakerSession` 대신 `LocalPipelineSession`을 제공합니다.

```
from sagemaker.workflow.function_step import step
from sagemaker.workflow.pipeline import Pipeline
from sagemaker.workflow.pipeline_context import LocalPipelineSession

@step
def train():
    training_data = s3.download(....)
    ...
    return trained_model
    
step_train_result = train()

local_pipeline_session = LocalPipelineSession()

local_pipeline = Pipeline(
    name="<pipeline-name>",
    steps=[step_train_result],
    sagemaker_session=local_pipeline_session # needed for local mode
)

local_pipeline.create(role_arn="role_arn")

# pipeline runs locally
execution = local_pipeline.start()
```

# 파이프라인 구성
<a name="pipelines-step-decorator-cfg-pipeline"></a>

SageMaker AI 구성 파일을 사용하여 파이프라인의 기본값을 설정하는 것이 좋습니다. SageMaker AI 구성 파일에 대한 자세한 내용은 [Configuring and using defaults with the SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable/overview.html#configuring-and-using-defaults-with-the-sagemaker-python-sdk)를 참조하세요. 구성 파일에 추가된 구성은 파이프라인의 모든 단계에 적용됩니다. 단계에 대한 옵션을 재정의하려면 `@step` 데코레이터 인수에 새 값을 입력합니다. 다음 주제에서는 구성 파일을 설정하는 방법을 설명합니다.

구성 파일의 `@step` 데코레이터 구성은 `@remote` 데코레이터 구성과 동일합니다. 구성 파일에서 파이프라인 역할 ARN 및 파이프라인 태그를 설정하려면 다음 코드 조각에 표시된 `Pipeline` 섹션을 사용합니다.

```
SchemaVersion: '1.0'
SageMaker:
  Pipeline:
    RoleArn: 'arn:aws:iam::555555555555:role/IMRole'
    Tags:
    - Key: 'tag_key'
      Value: 'tag_value'
```

구성 파일에서 설정할 수 있는 대부분의 기본값의 경우 새 값을 `@step` 데코레이터에 전달하여 재정의할 수도 있습니다. 예를 들어 다음 예시와 같이 사전 처리 단계의 구성 파일에 설정된 인스턴스 유형을 재정의할 수 있습니다.

```
@step(instance_type="ml.m5.large")
def preprocess(raw_data):
    df = pandas.read_csv(raw_data)
    ...
    return procesed_dataframe
```

일부 인수는 `@step` 데코레이터 파라미터 목록에 포함되지 않습니다. 이러한 인수는 SageMaker AI 구성 파일을 통해서만 전체 파이프라인에 대해 구성할 수 있습니다. 다음과 같이 나열됩니다.
+ `sagemaker_session`(`sagemaker.session.Session`): SageMaker AI가 서비스 직접 호출을 위임하는 기본 SageMaker AI 세션입니다. 지정되지 않은 경우 다음과 같이 기본 구성을 사용하여 세션이 만들어집니다.

  ```
  SageMaker:
    PythonSDK:
      Modules:
        Session:
          DefaultS3Bucket: 'default_s3_bucket'
          DefaultS3ObjectKeyPrefix: 'key_prefix'
  ```
+ `custom_file_filter`(`CustomFileFilter)`: 파이프라인 단계에 포함할 로컬 디렉터리 및 파일을 지정하는 `CustomFileFilter` 객체입니다. 지정되지 않은 경우 이 값은 기본적으로 `None`으로 설정됩니다. `custom_file_filter`를 적용하려면 `IncludeLocalWorkdir`을 `True`로 설정해야 합니다. 다음 예시는 모든 노트북 파일과 `data`라는 파일 및 디렉터리를 무시하는 구성을 보여줍니다.

  ```
  SchemaVersion: '1.0'
  SageMaker:
    PythonSDK:
      Modules:
        RemoteFunction:
          IncludeLocalWorkDir: true
          CustomFileFilter: 
            IgnoreNamePatterns: # files or directories to ignore
            - "*.ipynb" # all notebook files
            - "data" # folder or file named "data"
  ```

  `IncludeLocalWorkdir`과 `CustomFileFilter`를 함께 사용하는 방법에 대한 자세한 내용은 [@remote 데코레이터와 함께 모듈식 코드 사용하기](train-remote-decorator-modular.md) 섹션을 참조하세요.
+ `s3_root_uri (str)`: SageMaker AI가 코드 아카이브 및 데이터를 업로드하는 루트 Amazon S3 폴더입니다. 지정되지 않은 경우 기본 SageMaker AI 버킷이 사용됩니다.
+ `s3_kms_key (str)`: 입력 및 출력 데이터를 암호화하는 데 사용되는 키입니다. SageMaker AI 구성 파일에서만 이 인수를 구성할 수 있으며 인수는 파이프라인에 정의된 모든 단계에 적용됩니다. 지정되지 않은 경우 값은 기본적으로 `None`으로 설정됩니다. 예시 S3 KMS 키 구성은 다음 코드 조각을 참조하세요.

  ```
  SchemaVersion: '1.0'
  SageMaker:
    PythonSDK:
      Modules:
        RemoteFunction:
          S3KmsKeyId: 's3kmskeyid'
          S3RootUri: 's3://amzn-s3-demo-bucket/my-project
  ```

# 모범 사례
<a name="pipelines-step-decorator-best"></a>

다음 섹션에서는 파이프라인 단계에 `@step` 데코레이터를 사용할 때 따라야 할 모범 사례를 제안합니다.

## 웜 풀 사용
<a name="pipelines-step-decorator-best-warmpool"></a>

더 빠른 파이프라인 단계 실행을 위해 훈련 작업에 제공되는 웜 풀 기능을 사용합니다. 다음 코드 조각에 설명된 대로 `@step` 데코레이터에 `keep_alive_period_in_seconds` 인수를 제공하여 웜 풀 기능을 켤 수 있습니다.

```
@step(
   keep_alive_period_in_seconds=900
)
```

웜 풀에 대한 자세한 정보는 [SageMaker AI 관리형 웜 풀](train-warm-pools.md) 부문을 참조하세요.

## 디렉터리 구조 지정
<a name="pipelines-step-decorator-best-dir"></a>

`@step` 데코레이터를 사용하는 동안 코드 모듈을 사용하는 것이 좋습니다. 단계 함수를 간접 호출하고 파이프라인을 정의하는 `pipeline.py` 모듈을 워크스페이스의 루트에 놓습니다. 권장하는 구조는 다음과 같습니다.

```
.
├── config.yaml # the configuration file that define the infra settings
├── requirements.txt # dependencies
├── pipeline.py  # invoke @step-decorated functions and define the pipeline here
├── steps/
| ├── processing.py
| ├── train.py
├── data/
├── test/
```

# 제한 사항
<a name="pipelines-step-decorator-limit"></a>

아래 섹션에서는 파이프라인 단계에 `@step` 데코레이터를 사용할 때 알아야 할 제한 사항을 간략하게 설명합니다.

## 함수 인수 제한 사항
<a name="pipelines-step-decorator-arg"></a>

입력 인수를 `@step`으로 데코레이션된 함수에 전달하면 다음 제한 사항이 적용됩니다.
+ `DelayedReturn`, `Properties`(다른 유형의 단계 중), `Parameter` 및 `ExecutionVariable` 객체를 `@step`으로 데코레이션된 함수에 인수로 전달할 수 있습니다. 하지만 `@step`으로 데코레이션된 함수는 `JsonGet` 및 `Join` 객체를 인수로 지원하지 않습니다.
+ `@step` 함수에서 파이프라인 변수에 직접 액세스할 수 없습니다. 다음 예시는 오류를 유발합니다.

  ```
  param = ParameterInteger(name="<parameter-name>", default_value=10)
  
  @step
  def func():
      print(param)
  
  func() # this raises a SerializationError
  ```
+ 파이프라인 변수를 다른 객체에 중첩하여 `@step` 함수에 전달할 수 없습니다. 다음 예시는 오류를 유발합니다.

  ```
  param = ParameterInteger(name="<parameter-name>", default_value=10)
  
  @step
  def func(arg):
      print(arg)
  
  func(arg=(param,)) # this raises a SerializationError because param is nested in a tuple
  ```
+ 함수의 입력 및 출력은 직렬화되므로 함수의 입력 또는 출력으로 전달할 수 있는 데이터 유형에 제한이 있습니다. 자세한 내용은 [원격 함수 간접 호출](train-remote-decorator-invocation.md)의 *Data serialization and deserialization* 섹션을 참조하세요. `@step`으로 데코레이션된 함수에도 동일한 제한이 적용됩니다.
+ Boto 클라이언트가 있는 객체는 직렬화할 수 없으므로 `@step`으로 데코레이션된 함수에 입력 또는 출력으로 그러한 객체를 전달할 수 없습니다. 예를 들어 `Estimator`, `Predictor`, `Processor`와 같은 SageMaker Python SDK 클라이언트 클래스는 직렬화할 수 없습니다.

## 함수 가져오기
<a name="pipelines-step-decorator-best-import"></a>

함수 외부가 아닌 내부 단계에서 필요한 라이브러리를 가져와야 합니다. 전역 범위에서 가져오는 경우 함수를 직렬화하는 동안 가져오기 충돌이 발생할 위험이 있습니다. 예를 들어 `sklearn.pipeline.Pipeline`은 `sagemaker.workflow.pipeline.Pipeline`으로 재정의될 수 있습니다.

## 함수 반환 값의 하위 멤버 참조
<a name="pipelines-step-decorator-best-child"></a>

`@step`으로 데코레이션된 함수의 반환 값의 하위 멤버를 참조하는 경우 다음 제한 사항이 적용됩니다.
+ 다음 예시와 같이 `DelayedReturn` 객체가 튜플, 목록 또는 딕셔너리를 나타내는 경우 `[]`로 하위 멤버를 참조할 수 있습니다.

  ```
  delayed_return[0]
  delayed_return["a_key"]
  delayed_return[1]["a_key"]
  ```
+ 함수를 간접 호출할 때 기본 튜플 또는 목록의 정확한 길이를 알 수 없으므로 튜플 또는 목록 출력을 압축 해제할 수 없습니다. 다음 예시는 오류를 유발합니다.

  ```
  a, b, c = func() # this raises ValueError
  ```
+ `DelayedReturn` 객체에 대해 반복할 수 없습니다. 다음 예시는 오류를 유발합니다.

  ```
  for item in func(): # this raises a NotImplementedError
  ```
+ '`.`'로 임의의 하위 멤버를 참조할 수 없습니다. 다음 예시는 오류를 유발합니다.

  ```
  delayed_return.a_child # raises AttributeError
  ```

## 지원되지 않는 기존 파이프라인 기능
<a name="pipelines-step-decorator-best-unsupported"></a>

다음 파이프라인 기능과 함께 `@step` 데코레이터를 사용할 수 없습니다.
+ [파이프라인 단계 캐싱](https://docs.aws.amazon.com/sagemaker/latest/dg/pipelines-caching.html)
+ [속성 파일](https://docs.aws.amazon.com/sagemaker/latest/dg/build-and-manage-propertyfile.html#build-and-manage-propertyfile-property)