

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

# SageMaker 훈련 컴파일러 모범 사례 및 고려 사항
<a name="training-compiler-tips-pitfalls"></a>

**중요**  
Amazon Web Services(AWS)는 SageMaker 훈련 컴파일러의 새 릴리스 또는 버전이 없을 것이라고 발표했습니다. SageMaker 훈련을 위한 기존 AWS 딥 러닝 컨테이너(DLC)를 통해 SageMaker 훈련 컴파일러를 계속 활용할 수 있습니다. 기존 DLCs는 계속 액세스할 수 있지만 [AWS 딥 러닝 컨테이너 프레임워크 지원 정책에](https://docs.aws.amazon.com/deep-learning-containers/latest/devguide/support-policy.html) AWS따라 더 이상 패치 또는 업데이트를 받지 않습니다.

SageMaker 훈련 컴파일러를 사용할 때의 모범 사례와 고려 사항을 검토하세요.

## 모범 사례
<a name="training-compiler-tips-pitfalls-best-practices"></a>

SageMaker 훈련 컴파일러로 훈련 작업을 실행할 때 다음 지침을 사용하여 최상의 결과를 얻으세요.

**일반 모범 사례**
+ 반드시 [지원되는 인스턴스 유형](training-compiler-support.md#training-compiler-supported-instance-types) 및 [테스트 완료 모델](training-compiler-support.md#training-compiler-tested-models) 중 하나를 사용해야 합니다.
+ 훈련 스크립트에서 Hugging Face 변환기 라이브러리를 사용하여 NLP 모델용 토크나이저를 만들 때는 반드시 `padding='max_length'`을(를) 지정하여 정적 입력 텐서 셰이프를 사용해야 합니다. 배치에서 가장 긴 시퀀스에 패딩하면 각 훈련 배치의 텐서 셰이프가 변경될 수 있으므로 `padding='longest'`은(는) 사용하지 마세요. 동적 입력 셰이프는 모델의 리컴파일을 시작하고 총 훈련 시간을 늘릴 수 있습니다. 변환기 토크나이저의 패딩 옵션에 대한 자세한 내용은 [Hugging Face Transformer 설명서](https://huggingface.co/docs/transformers/pad_truncation)의 *패딩 및 잘라내기*를 참조하세요.
+ GPU 메모리 사용률을 측정하여 GPU 메모리에 들어갈 수 있는 최대 배치 크기를 사용하는지 확인하세요. Amazon SageMaker Training Compiler는 훈련 중에 모델의 메모리 사용량을 줄여 주므로 일반적으로 GPU 메모리에 더 큰 `batch_size`을(를) 넣을 수 있습니다. 더 큰 `batch_size`을(를) 사용하면 GPU 사용률이 향상되고 총 훈련 시간이 줄어듭니다.

  배치 크기를 조정할 때는 `learning_rate`도 적절하게 조정해야 합니다. 예를 들어, 배치 크기를 `k`의 배수로 늘린 경우 `learning_rate` 선형(`k`으로 곱한 단순 곱셈) 으로 조정하거나 `k`의 제곱근을 곱해야 합니다. 이는 단축된 훈련 시간 내에 동일하거나 유사한 수렴 동작을 구현하기 위한 것입니다. `batch_size` 테스트를 거친 인기 모델에 대한 참조는 [테스트 완료 모델](training-compiler-support.md#training-compiler-tested-models)을(를) 참조하세요.
+ 컴파일러 가속 훈련 작업을 디버깅하려면 `compiler_config` 파라미터에서 `debug` 플래그를 활성화하세요. 이를 통해 SageMaker AI는 디버깅 로그를 SageMaker 훈련 작업 로그에 넣을 수 있습니다.

  ```
  huggingface_estimator=HuggingFace(
      ...
      compiler_config=TrainingCompilerConfig(debug=True)
  )
  ```

  컴파일러 훈련 작업의 전체 디버깅을 활성화하면 오버헤드가 추가될 수 있다는 점에 유의하세요.

**PyTorch 모범 사례**
+ PyTorch 모델을 가져와서 체크포인트하려는 경우 PyTorch/XLA의 모델 저장 기능을 사용하여 모델을 올바르게 체크포인트해야 합니다. 이 기능에 대한 자세한 내용은 *XLA 디바이스의 PyTorch 설명서*의 [https://pytorch.org/xla/release/1.9/index.html#torch_xla.core.xla_model.save](https://pytorch.org/xla/release/1.9/index.html#torch_xla.core.xla_model.save)을(를) 참조하세요.

  PyTorch 스크립트에 수정 내용을 추가하는 방법을 배우려면 [PyTorch를 직접 사용하는 대형 언어 모델(Hugging Face Transformers Trainer API 없음)](training-compiler-pytorch-models.md#training-compiler-pytorch-models-non-trainer)을(를) 참조하세요.

  모델 저장 기능을 사용하는 실제 적용에 대한 자세한 내용은 *PyTorch/XLA TPU의 Hugging Face: 더 빠르고 저렴한 훈련 블로그*에서 [체크포인트 작성 및 로드](https://huggingface.co/blog/pytorch-xla#checkpoint-writing-and-loading)를 참조하세요.
+ 분산 훈련을 위한 최적의 훈련 시간을 확보하려면 다음 사항을 고려해 보세요.
  + 단일 GPU 인스턴스를 사용하는 대신 다중 GPU가 있는 인스턴스를 사용하세요. 예를 들어 단일 `ml.p3dn.24xlarge` 인스턴스는 8x `ml.p3.2xlarge` 인스턴스보다 훈련 시간이 더 빠릅니다.
  + `ml.p3dn.24xlarge` 및 `ml.p4d.24xlarge`와(과) 같이 EFA를 지원하는 인스턴스를 사용하세요. 이러한 인스턴스 유형은 네트워킹 속도를 높이고 훈련 시간을 단축합니다.
  + 느린 사전 처리로 인해 모델 훈련이 지연되지 않도록 데이터세트의 `preprocessing_num_workers` 파라미터를 조정하세요.

## 고려 사항
<a name="training-compiler-tips-pitfalls-considerations"></a>

SageMaker 훈련 컴파일러를 사용할 때는 다음 사항을 고려해야 합니다.

### 로깅, 체크포인팅 및 프로파일링으로 인한 성능 저하
<a name="training-compiler-considerations-performance-degradation"></a>
+ 명시적인 평가로 이어지는 로깅, 체크포인팅, 프로파일링 모델 텐서를 피하세요. 명시적 평가가 무엇인지 이해하려면 다음 코드 컴파일 예제를 고려해 보세요.

  ```
  a = b+c
  e = a+d
  ```

  컴파일러는 코드를 다음과 같이 해석하여 변수 `a`의 메모리 사용량을 줄입니다.

  ```
  e = b+c+d
  ```

  이제 변수 `a`에 인쇄 함수를 추가하기 위해 코드를 변경하는 다음과 같은 경우를 생각해 보세요.

  ```
  a = b+c
  e = a+d
  print(a)
  ```

  컴파일러는 다음과 같이 변수 `a`을(를) 명시적으로 평가합니다.

  ```
  e = b+c+d
  a = b+c    # Explicit evaluation
  print(a)
  ```

  예를 들어, PyTorch에서는 명시적인 평가를 도입할 수 있는 [torch.tensor.items()](https://pytorch.org/docs/stable/generated/torch.Tensor.item.html)를 사용하지 마세요. 딥 러닝에서 이러한 명시적 평가는 모델의 컴파일 그래프에서 융합 연산을 중단시키고 텐서를 다시 계산하게 되므로 오버헤드가 발생할 수 있습니다.

  SageMaker 훈련 컴파일러를 사용하는 동안 훈련 중에 모델을 주기적으로 평가하려는 경우, 명시적 평가로 인한 오버헤드를 줄이기 위해 더 낮은 빈도로 로깅 및 체크포인트를 지정하는 것이 좋습니다. 예를 들어 모든 에포크 대신 10 에포크마다 로깅하세요.
+ 그래프 컴파일은 훈련의 처음 몇 단계에서 실행됩니다. 따라서 처음 몇 단계는 매우 느릴 것으로 예상됩니다. 그러나 이는 한 번의 컴파일 비용이며 컴파일을 통해 향후 단계가 훨씬 빨라지므로 더 오랜 기간 동안 훈련하면 상각될 수 있습니다. 초기 컴파일 오버헤드는 모델 크기, 입력 텐서 크기, 입력 텐서 셰이프 분포에 따라 달라집니다.

### PyTorch를 직접 사용할 때 부정확한 PyTorch/XLA API의 사용
<a name="training-compiler-considerations-incorrect-api-use"></a>

PyTorch/XLA는 기존 PyTorch 훈련 API 중 일부를 대체하는 API 세트를 정의합니다. 제대로 사용하지 않으면 PyTorch 훈련이 실패합니다.
+ PyTorch 모델을 컴파일할 때 발생하는 가장 일반적인 오류 중 하나는 연산자와 텐서의 디바이스 유형이 잘못되었기 때문에 나타납니다. PyTorch 모델을 제대로 컴파일하려면 CUDA를 사용하거나 CUDA 디바이스와 XLA 디바이스를 함께 사용하는 대신 XLA 디바이스([https://pytorch.org/xla/release/1.9/index.html](https://pytorch.org/xla/release/1.9/index.html))를 사용해야 합니다.
+ `mark_step()`은(는) XLA만의 장벽입니다. 올바르게 설정하지 않으면 훈련 작업이 지연됩니다.
+ PyTorch/XLA는 추가적인 분산 훈련 API를 제공합니다. API를 제대로 프로그래밍하지 못하면 그라데이션이 잘못 수집되어 훈련 수렴 실패가 발생합니다.

PyTorch 스크립트를 올바르게 설정하고 앞서 언급한 잘못된 API 사용을 방지하려면 [PyTorch를 직접 사용하는 대형 언어 모델(Hugging Face Transformers Trainer API 없음)](training-compiler-pytorch-models.md#training-compiler-pytorch-models-non-trainer)을(를) 참조하세요.