

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

# Amazon SageMaker Experiments를 사용하여 파라미터 및 지표 로깅하기
<a name="train-remote-decorator-experiments"></a>

이 가이드에서는 Amazon SageMaker Experiments를 사용하여 파라미터 및 지표를 로깅하는 방법을 알아봅니다. SageMaker AI 실험은 실행으로 구성되며 각 실행은 모델 훈련 단일 상호 작용에 대한 모든 입력, 파라미터, 구성, 결과로 구성됩니다.

@remote 데코레이터 또는 `RemoteExecutor` API를 사용하여 원격 함수의 파라미터 및 지표를 로깅할 수 있습니다.

원격 함수에서 파라미터 및 지표를 기록하려면 다음 방법 중 하나를 선택합니다.
+ SageMaker AI Experiments 라이브러리의 `Run`을 사용하여 원격 함수 내에서 실행되는 SageMaker AI 실험을 인스턴스화합니다. 자세한 내용은 [Amazon SageMaker AI 실험 생성](https://docs.aws.amazon.com/sagemaker/latest/dg/experiments-create.html)을 참조하세요.
+ SageMaker AI Experiments 라이브러리의 원격 함수 내에서 `load_run` 함수를 사용합니다. 그러면 원격 함수 외부에서 선언된 `Run` 인스턴스가 로드됩니다.

다음 섹션에서는 이전에 나열한 메서드를 사용하여 SageMaker AI 실험 실행으로 계보를 생성하고 추적하는 방법을 보여줍니다. 이 섹션에서는 SageMaker 훈련에서 지원하지 않는 사례도 설명합니다.

## @remote 데코레이터를 사용하여 SageMaker Experiments와 통합하기
<a name="train-remote-decorator-experiments-remote"></a>

SageMaker AI에서 실험을 인스턴스화하거나 원격 함수 내에서 현재 SageMaker AI 실험을 로드할 수 있습니다. 다음 섹션에서는 두 가지 메서드를 사용하는 방법을 보여줍니다.

### SageMaker Experiments로 실험 생성
<a name="train-remote-decorator-experiments-remote-create"></a>

SageMaker AI 실험에서 실행되는 실험을 생성할 수 있습니다. 이렇게 하려면 실험 이름, 실행 이름 및 기타 파라미터를 원격 함수에 전달해야 합니다.

다음 코드 예제에서는 실험 이름, 실행 이름, 각 실행 중에 로깅할 파라미터를 가져옵니다. 파라미터 `param_1` 및 `param_2`는 시간이 지남에 따라 훈련 루프 내에 로깅됩니다. 일반적인 파라미터에는 배치 크기 또는 에포크가 포함될 수 있습니다. 이 예제에서 어떤 실행의 지표 `metric_a` 및 `metric_b`가 시간이 지남에 따라 훈련 루프 내에 로깅됩니다. 다른 일반적인 지표는 `accuracy` 또는 `loss`가 포함될 수 있습니다.

```
from sagemaker.remote_function import remote
from sagemaker.experiments.run import Run

# Define your remote function
@remote
def train(value_1, value_2, exp_name, run_name):
    ...
    ...
    #Creates the experiment
    with Run(
        experiment_name=exp_name,
        run_name=run_name,
    ) as run:
        ...
        #Define values for the parameters to log
        run.log_parameter("param_1", value_1)
        run.log_parameter("param_2", value_2) 
        ...
        #Define metrics to log
        run.log_metric("metric_a", 0.5)
        run.log_metric("metric_b", 0.1)


# Invoke your remote function        
train(1.0, 2.0, "my-exp-name", "my-run-name")
```

### @remote 데코레이터가 시작한 작업으로 현재 SageMaker Experiments 로드하기
<a name="train-remote-decorator-experiments-remote-current"></a>

SageMaker Experiments 라이브러리의 `load_run()` 함수를 사용하여 실행 컨텍스트에서 현재 실행 객체를 로드합니다. 원격 함수 내에서 `load_run()` 함수를 사용할 수도 있습니다. 다음 코드 예제와 같이 실행 객체에서 `with` 문을 통해 로컬에서 시작된 실행 객체를 로드합니다.

```
from sagemaker.experiments.run import Run, load_run

# Define your remote function
@remote
def train(value_1, value_2):
    ...
    ...
    with load_run() as run:
        run.log_metric("metric_a", value_1)
        run.log_metric("metric_b", value_2)


# Invoke your remote function
with Run(
    experiment_name="my-exp-name",
    run_name="my-run-name",
) as run:
    train(0.5, 1.0)
```

## `RemoteExecutor` API로 시작된 작업 내에서 현재 실행 중인 실험을 로드합니다.
<a name="train-remote-decorator-experiments-api"></a>

`RemoteExecutor` API로 작업을 시작한 경우 현재 SageMaker AI 실험 실행을 로드할 수도 있습니다. 다음 코드 예제는 SageMaker Experiments `load_run` 함수로 `RemoteExecutor` API를 사용하는 방법을 보여줍니다. 이렇게 하면 현재 SageMaker AI 실험 실행을 로드하고 `RemoteExecutor`에서 제출한 작업의 지표를 캡처할 수 있습니다.

```
from sagemaker.experiments.run import Run, load_run

def square(x):
    with load_run() as run:
        result = x * x
        run.log_metric("result", result)
    return result


with RemoteExecutor(
    max_parallel_job=2,
    instance_type="ml.m5.large"
) as e:
    with Run(
        experiment_name="my-exp-name",
        run_name="my-run-name",
    ):
        future_1 = e.submit(square, 2)
```

## @remote 데코레이터로 코드에 주석을 다는 동안 SageMaker Experiments가 지원되지 않는 사용
<a name="train-remote-decorator-experiments-unsupported"></a>

SageMaker AI는 @remote 함수에 `Run` 유형 객체를 전달하는 것 또는 글로벌 `Run` 객체를 사용하는 것을 지원하지 않습니다. 다음 예제는 `SerializationError`를 발생시키는 코드를 보여줍니다.

다음 코드 예제에서는 @remote 데코레이터에 `Run` 형식 객체를 전달하려고 할 때 오류가 발생합니다.

```
@remote
def func(run: Run):
    run.log_metrics("metric_a", 1.0)
    
with Run(...) as run:
    func(run) ---> SerializationError caused by NotImplementedError
```

다음 코드 예제에서는 원격 함수 외부에서 인스턴스화된 글로벌 `run` 객체를 사용하려고 합니다. 코드 예제에서 `train()` 함수는 `with Run` 컨텍스트 내부에서 정의하며 이는 글로벌 실행 객체를 참조합니다. `train()`을 호출하면 오류가 발생합니다.

```
with Run(...) as run:
    @remote
    def train(metric_1, value_1, metric_2, value_2):
        run.log_parameter(metric_1, value_1)
        run.log_parameter(metric_2, value_2)
    
    train("p1", 1.0, "p2", 0.5) ---> SerializationError caused by NotImplementedError
```