

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

# 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) 섹션으로 넘어갑니다.