

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

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