

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

# 훈련 스크립트를 조정하여 후크 등록
<a name="debugger-modify-script"></a>

Amazon SageMaker Debugger에는 [`sagemaker-debugger` Python SDK](https://sagemaker-debugger.readthedocs.io/en/website)라는 클라이언트 라이브러리가 함께 제공됩니다. `sagemaker-debugger` Python SDK는 훈련 전에 훈련 스크립트를 조정하는 도구와 훈련 후에 분석 도구를 제공합니다. 이 페이지에서는 클라이언트 라이브러리를 사용하여 훈련 스크립트를 조정하는 방법을 알아봅니다.

`sagemaker-debugger` Python SDK는 훈련 스크립트를 변경하지 않고도 모델 텐서를 추출하기 위한 후크를 등록하는 데 도움이 되는 래퍼 함수를 제공합니다. 모델 출력 텐서 컬렉션을 시작하고 이를 디버깅하여 훈련 문제를 찾으려면 훈련 스크립트를 다음과 같이 수정하세요.

**작은 정보**  
이 페이지를 팔로우하는 동안 API 참조용 [`sagemaker-debugger` 오픈소스 SDK 설명서](https://sagemaker-debugger.readthedocs.io/en/website/index.html)를 사용하세요.

**Topics**
+ [PyTorch 훈련 스크립트 조정](debugger-modify-script-pytorch.md)
+ [TensorFlow 훈련 스크립트 조정](debugger-modify-script-tensorflow.md)

# PyTorch 훈련 스크립트 조정
<a name="debugger-modify-script-pytorch"></a>

모델 출력 텐서 컬렉션을 시작하고 훈련 문제를 디버깅하려면 PyTorch 훈련 스크립트를 다음과 같이 수정하세요.

**참고**  
SageMaker Debugger는 [https://pytorch.org/docs/stable/nn.functional.html](https://pytorch.org/docs/stable/nn.functional.html) API 작업에서 모델 출력 텐서를 수집할 수 없습니다. PyTorch 훈련 스크립트를 작성할 때는 [https://pytorch.org/docs/stable/generated/torch.nn.NLLLoss.html](https://pytorch.org/docs/stable/generated/torch.nn.NLLLoss.html) 모듈을 대신 사용하는 것이 좋습니다.

## PyTorch 1.12.0의 경우
<a name="debugger-modify-script-pytorch-1-12-0"></a>

PyTorch 훈련 스크립트를 가져오면 사용자는 훈련 스크립트에서 몇 개의 추가 코드 라인을 사용하여 훈련 작업을 실행하고 모델 출력 텐서를 추출할 수 있습니다. `sagemaker-debugger` 클라이언트 라이브러리의 [후크 API](https://sagemaker-debugger.readthedocs.io/en/website/hook-api.html)를 사용해야 합니다. 코드 예제를 사용하여 단계를 세분화하는 다음 지침을 살펴보세요.

1. 후크를 생성합니다.

   **(권장) SageMaker AI 내 훈련 작업용**

   ```
   import smdebug.pytorch as smd
   hook=smd.get_hook(create_if_not_exists=True)
   ```

   예측기에서 DebuggerHookConfig, TensorBoardConfig 또는 규칙을 사용하여 [SageMaker Python SDK를 사용하여 Debugger로 훈련 작업 시작](debugger-configuration-for-debugging.md)의 훈련 작업을 시작하면 SageMaker AI는 `get_hook` 함수가 선택한 훈련 인스턴스에 JSON 구성 파일을 추가합니다. 참고로, 예측기에 구성 API를 포함하지 않으면 후크가 찾을 수 있는 구성 파일이 없어지고 함수가 `None`를 반환한다는 점에 유의하세요.

   **(선택 사항) SageMaker AI 이외의 훈련 작업용**

   SageMaker Notebook 인스턴스, Amazon EC2 인스턴스 또는 자체 로컬 디바이스에서 직접 로컬 모드에서 훈련 작업을 실행하는 경우 `smd.Hook` 클래스를 사용하여 후크를 생성하세요. 그러나 이 접근 방식은 텐서 컬렉션만 저장할 수 있으며 TensorBoard 시각화에 사용할 수 있습니다. SageMaker Debugger에 내장된 규칙은 로컬 모드에서 작동하지 않습니다. 규칙을 사용하려면 SageMaker AI ML 훈련 인스턴스와 S3가 원격 인스턴스의 출력을 실시간으로 저장해야 하기 때문입니다. 이 경우 `smd.get_hook` API가 `None`를 반환합니다.

   로컬 모드에서 텐서를 저장하는 수동 후크를 만들려면 로직과 함께 다음 코드 스니펫을 사용하여 `smd.get_hook` API가 `None`을 반환하는지 확인하고 `smd.Hook` 클래스를 사용하여 수동 후크를 생성하세요. 참고로 사용자는 로컬 머신의 모든 출력 디렉터리를 지정할 수 있습니다.

   ```
   import smdebug.pytorch as smd
   hook=smd.get_hook(create_if_not_exists=True)
   
   if hook is None:
       hook=smd.Hook(
           out_dir='/path/to/your/local/output/',
           export_tensorboard=True
       )
   ```

1. 후크의 클래스 메서드로 모델을 래핑하세요.

   이 `hook.register_module()` 메서드는 모델을 가져와 각 레이어를 반복하면서 [SageMaker Python SDK를 사용하여 Debugger로 훈련 작업 시작](debugger-configuration-for-debugging.md)에서 구성을 통해 제공할 정규 표현식과 일치하는 텐서를 찾습니다. 이 후크 메서드를 통해 컬렉션 가능한 텐서는 가중치, 편향, 활성화, 그라데이션, 입력 및 출력입니다.

   ```
   hook.register_module(model)
   ```
**작은 정보**  
대규모 딥러닝 모델에서 전체 출력 텐서를 컬렉션하면 해당 컬렉션의 전체 크기가 기하급수적으로 증가하여 병목 현상이 발생할 수 있습니다. 특정 텐서를 저장하려는 경우 `hook.save_tensor()` 메서드를 사용할 수도 있습니다. 이 메서드를 사용하면 특정 텐서의 변수를 선택하고 원하는 이름의 사용자 지정 컬렉션에 저장할 수 있습니다. 이 단계에 대한 자세한 내용은 [7단계](#debugger-modify-script-pytorch-save-custom-tensor)를 참조하세요.

1. 후크의 클래스 메서드를 사용하여 손실 함수를 왜곡하세요.

   `hook.register_loss` 메서드는 손실 함수를 래핑하는 것입니다. [SageMaker Python SDK를 사용하여 Debugger로 훈련 작업 시작](debugger-configuration-for-debugging.md)에서 구성 중에 설정하는 `save_interval`마다 손실 값을 추출하여 `"losses"` 컬렉션에 저장합니다.

   ```
   hook.register_loss(loss_function)
   ```

1. 훈련 블록에 `hook.set_mode(ModeKeys.TRAIN)`을 추가합니다. 이는 텐서 컬렉션이 훈련 단계에서 추출되었음을 나타냅니다.

   ```
   def train():
       ...
       hook.set_mode(ModeKeys.TRAIN)
   ```

1. 검증 블록에 `hook.set_mode(ModeKeys.EVAL)`를 추가합니다. 이는 텐서 컬렉션이 검증 단계에서 추출되었음을 나타냅니다.

   ```
   def validation():
       ...
       hook.set_mode(ModeKeys.EVAL)
   ```

1. 사용자 지정 스칼라를 저장하는 데 [https://sagemaker-debugger.readthedocs.io/en/website/hook-constructor.html#smdebug.core.hook.BaseHook.save_scalar](https://sagemaker-debugger.readthedocs.io/en/website/hook-constructor.html#smdebug.core.hook.BaseHook.save_scalar)를 사용합니다. 사용자는 모델에 없는 스칼라 값을 저장할 수 있습니다. 예를 들어, 평가 중에 계산된 정확도 값을 기록하려면 정확도를 계산하는 줄 아래에 다음 코드 줄을 추가하세요.

   ```
   hook.save_scalar("accuracy", accuracy)
   ```

   참고로 사용자 지정 스칼라 컬렉션의 이름을 지정하려면 문자열을 첫 번째 인수로 제공해야 합니다. TensorBoard에서 스칼라 값을 시각화하는 데 사용되는 이름이며 원하는 문자열일 수 있습니다.

1. <a name="debugger-modify-script-pytorch-save-custom-tensor"></a>사용자 지정 텐서를 저장하는 데 [https://sagemaker-debugger.readthedocs.io/en/website/hook-constructor.html#smdebug.core.hook.BaseHook.save_tensor](https://sagemaker-debugger.readthedocs.io/en/website/hook-constructor.html#smdebug.core.hook.BaseHook.save_tensor)를 사용합니다. [https://sagemaker-debugger.readthedocs.io/en/website/hook-constructor.html#smdebug.core.hook.BaseHook.save_scalar](https://sagemaker-debugger.readthedocs.io/en/website/hook-constructor.html#smdebug.core.hook.BaseHook.save_scalar)와 마찬가지로 사용자는 텐서를 추가로 저장하여 고유한 텐서 컬렉션을 정의할 수 있습니다. 예를 들어, 사용자는 모델에 전달된 입력 이미지 데이터를 추출하고 다음 코드 라인을 추가하여 사용자 지정 텐서로 저장할 수 있습니다. 여기서 `"images"`는 사용자 지정 텐서의 예제 이름이고, `image_inputs`는 입력 이미지 데이터의 예제 변수입니다.

   ```
   hook.save_tensor("images", image_inputs)
   ```

   참고로 사용자 지정 텐서의 이름을 지정하려면 첫 번째 인수에 문자열을 제공해야 합니다. `hook.save_tensor()`는 사용자 지정 텐서를 저장할 텐서 컬렉션을 지정하는 세 번째 인수 `collections_to_write`가 있습니다. 기본값은 `collections_to_write="default"`입니다. 세 번째 인수를 명시적으로 지정하지 않으면 사용자 지정 텐서가 `"default"` 텐서 컬렉션에 저장됩니다.

훈련 스크립트 조정을 완료한 후 [SageMaker Python SDK를 사용하여 Debugger로 훈련 작업 시작](debugger-configuration-for-debugging.md) 섹션으로 넘어갑니다.

# TensorFlow 훈련 스크립트 조정
<a name="debugger-modify-script-tensorflow"></a>

모델 출력 텐서 컬렉션을 시작하고 훈련 문제를 디버깅하려면 TensorFlow 훈련 스크립트를 다음과 같이 수정하세요.

**SageMaker AI 내에서 훈련 작업용 후크 만들기**

```
import smdebug.tensorflow as smd

hook=smd.get_hook(hook_type="keras", create_if_not_exists=True)
```

이렇게 하면 SageMaker 훈련 작업을 시작할 때 후크가 생성됩니다. 예측기에서 `DebuggerHookConfig`, `TensorBoardConfig` 또는 `Rules`와 함께 [SageMaker Python SDK를 사용하여 Debugger로 훈련 작업 시작](debugger-configuration-for-debugging.md)을 사용하여 훈련 작업을 시작하면 SageMaker AI는 `smd.get_hook` 메서드에서 선택한 훈련 인스턴스에 JSON 구성 파일을 추가합니다. 참고로, 예측기에 구성 API를 포함하지 않으면 후크가 찾을 수 있는 구성 파일이 없어지고 함수가 `None`를 반환한다는 점에 유의하세요.

**(선택 사항) SageMaker AI 이외의 훈련 작업용 후크 만들기**

SageMaker Notebook 인스턴스, Amazon EC2 인스턴스 또는 자체 로컬 디바이스에서 직접 로컬 모드에서 훈련 작업을 실행하는 경우 `smd.Hook` 클래스를 사용하여 후크를 생성하세요. 그러나 이 접근 방식은 텐서 컬렉션만 저장할 수 있으며 TensorBoard 시각화에 사용할 수 있습니다. SageMaker Debugger의 내장형 규칙은 로컬 모드에서 작동하지 않습니다. 이 경우에도 `smd.get_hook` 메서드에서 `None`을 반환합니다.

수동 후크를 만들려면 로직과 함께 다음 코드 스니펫을 사용하여 후크가 `None`을 반환하는지 확인하고 `smd.Hook` 클래스를 사용하여 수동 후크를 생성하세요.

```
import smdebug.tensorflow as smd

hook=smd.get_hook(hook_type="keras", create_if_not_exists=True) 

if hook is None:
    hook=smd.KerasHook(
        out_dir='/path/to/your/local/output/',
        export_tensorboard=True
    )
```

후크 생성 코드를 추가한 후 TensorFlow Keras에 대한 다음 주제로 넘어가세요.

**참고**  
SageMaker Debugger는 현재 TensorFlow Keras만 지원합니다.

## TensorFlow Keras의 훈련 스크립트에 후크를 등록하세요.
<a name="debugger-modify-script-tensorflow-keras"></a>

다음 절차는 후크와 해당 메서드를 사용하여 모델 및 옵티마이저에서 출력 스칼라와 텐서를 컬렉션하는 방법을 안내합니다.

1. Keras 모델과 옵티마이저를 후크의 클래스 메서드로 래핑하세요.

   이 `hook.register_model()` 메서드는 모델을 가져와 각 레이어를 반복하면서 [SageMaker Python SDK를 사용하여 Debugger로 훈련 작업 시작](debugger-configuration-for-debugging.md)에서 구성을 통해 제공할 정규 표현식과 일치하는 텐서를 찾습니다. 이 후크 메서드를 통해 컬렉션 가능한 텐서는 가중치, 편향, 활성화입니다.

   ```
   model=tf.keras.Model(...)
   hook.register_model(model)
   ```

1. 옵티마이저를 `hook.wrap_optimizer()` 메서드로 래핑하세요.

   ```
   optimizer=tf.keras.optimizers.Adam(...)
   optimizer=hook.wrap_optimizer(optimizer)
   ```

1. TensorFlow의 Eager 모드에서 모델을 컴파일합니다.

   모델에서 각 레이어의 입력 및 출력 텐서와 같은 텐서를 컬렉션하려면 먼저 Eager 모드에서 훈련을 실행해야 합니다. 그렇지 않으면 SageMaker AI Debugger가 텐서를 수집할 수 없습니다. 하지만 모델 가중치, 편향, 손실과 같은 다른 텐서는 Eager 모드에서 명시적으로 실행하지 않고도 컬렉션할 수 있습니다.

   ```
   model.compile(
       loss="categorical_crossentropy", 
       optimizer=optimizer, 
       metrics=["accuracy"],
       # Required for collecting tensors of each layer
       run_eagerly=True
   )
   ```

1. 후크를 [https://www.tensorflow.org/api_docs/python/tf/keras/Model#fit](https://www.tensorflow.org/api_docs/python/tf/keras/Model#fit) 메서드에 등록합니다.

   등록한 후크에서 텐서를 컬렉션하려면 Keras `model.fit()` 클래스 메서드에 `callbacks=[hook]`를 추가하세요. 그러면 `sagemaker-debugger` 후크가 Keras 콜백으로 전달됩니다.

   ```
   model.fit(
       X_train, Y_train,
       batch_size=batch_size,
       epochs=epoch,
       validation_data=(X_valid, Y_valid),
       shuffle=True, 
       callbacks=[hook]
   )
   ```

1. TensorFlow 2.x는 값에 대한 액세스를 제공하지 않는 기호 그라데이션 변수만 제공합니다. 그라데이션를 컬렉션하려면 [https://sagemaker-debugger.readthedocs.io/en/website/hook-methods.html#tensorflow-specific-hook-api](https://sagemaker-debugger.readthedocs.io/en/website/hook-methods.html#tensorflow-specific-hook-api) 메서드로 `tf.GradientTape`을 래핑하세요. 그라데이션를 컬렉션하려면 다음과 같이 훈련 단계를 직접 작성해야 합니다.

   ```
   def training_step(model, dataset):
       with hook.wrap_tape(tf.GradientTape()) as tape:
           pred=model(data)
           loss_value=loss_fn(labels, pred)
       grads=tape.gradient(loss_value, model.trainable_variables)
       optimizer.apply_gradients(zip(grads, model.trainable_variables))
   ```

   테이프를 감싸면 `sagemaker-debugger` 후크가 그라데이션, 파라미터, 손실과 같은 출력 텐서를 식별할 수 있습니다. 테이프를 래핑하면 `push_tape()`, `pop_tape()`, `gradient()`와 같은 테이프 객체의 함수를 중심으로 하는 `hook.wrap_tape()` 메서드를 통해 SageMaker Debugger 작성기를 설정하고 `gradient()`(훈련 가능한 변수 및 손실)에 대한 입력과 `gradient()`(그라데이션)의 출력으로 제공되는 텐서를 저장할 수 있습니다.
**참고**  
사용자 지정 훈련 루프를 사용하여 컬렉션하려면 반드시 Eager 모드를 사용해야 합니다. 그렇지 않으면 SageMaker Debugger가 텐서를 컬렉션할 수 없습니다.

`sagemaker-debugger` 후크 API가 후크를 생성하고 텐서를 저장하기 위해 제공하는 작업의 전체 목록은 `sagemaker-debugger` Python SDK 설명서의 [후크 메서드](https://sagemaker-debugger.readthedocs.io/en/website/hook-methods.html)를 참조하세요.**

훈련 스크립트 조정을 완료한 후 [SageMaker Python SDK를 사용하여 Debugger로 훈련 작업 시작](debugger-configuration-for-debugging.md) 섹션으로 넘어갑니다.