

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

# Amazon SageMaker 스마트 시프팅을 사용한 훈련 중 데이터 정제
<a name="train-smart-sifting"></a>

SageMaker 스마트 시프팅은 훈련 데이터세트의 효율성을 개선하고 총 훈련 시간과 비용을 줄이는 데 도움이 되는 SageMaker 훈련의 기능입니다.

대규모 언어 모델(LLM) 또는 비전 트랜스포머 모델과 같은 최신 딥 러닝 모델은 허용 가능한 정확도를 달성하기 위해 대규모 데이터세트가 필요한 경우가 많습니다. 예를 들어 LLM 수렴하기 위해 수조 개의 토큰 또는 페타바이트의 데이터를 필요로 하는 경우가 많습니다. 최신 모델의 크기와 함께 훈련 데이터세트의 크기가 커지면 모델 훈련의 컴퓨팅 시간과 비용이 늘어날 수 있습니다.

항상 데이터세트의 샘플은 모델 훈련 중에 학습 프로세스에 동일하게 기여하지 않습니다. 훈련 중에 프로비저닝된 컴퓨팅 리소스의 상당 부분이 모델의 전반적인 정확도에 크게 기여하지 않는 쉬운 샘플을 처리하는 데 사용될 수 있습니다. 이상적으로는 훈련 데이터세트에는 실제로 모델 융합을 개선하는 샘플만 포함됩니다. 덜 유용한 데이터를 필터링하면 훈련 시간과 컴퓨팅 비용을 줄일 수 있습니다. 그러나 덜 유용한 데이터를 식별하는 것은 어렵고 위험할 수 있습니다. 훈련 전에 정보가 부족한 샘플을 식별하는 것은 사실상 어렵고 잘못된 샘플이나 너무 많은 샘플을 제외하면 모델 정확도에 영향을 미칠 수 있습니다.

Amazon SageMaker AI를 사용하여 데이터를 스마트하게 시프팅하면 데이터 효율성을 개선하여 훈련 시간과 비용을 줄일 수 있습니다. SageMaker 스마트 시프팅 알고리즘은 훈련 작업의 데이터 로드 단계에서 각 데이터의 손실 값을 평가하고 모델에 덜 유용한 샘플을 제외합니다. 훈련에 고급 데이터를 사용하면 개선되지 않은 데이터에 대한 불필요한 순방향 및 역방향 패스를 제거하여 모델 훈련의 총 시간과 비용을 줄일 수 있습니다. 따라서 모델의 정확도에 미치는 영향은 미미하거나 없습니다.

SageMaker 스마트 시프팅은 SageMaker 훈련 딥 러닝 컨테이너(DLC)를 통해 사용할 수 있으며 PyTorch `DataLoader`를 통한 PyTorch 워크로드를 지원합니다. SageMaker 스마트 시프팅을 구현하려면 몇 줄의 코드 변경만 있으면 되며 기존 훈련 또는 데이터 처리 워크플로를 변경할 필요가 없습니다.

**Topics**
+ [

# SageMaker 스마트 시프팅 작동 방식
](train-smart-sifting-how-it-works.md)
+ [

# 지원되는 프레임워크 및 AWS 리전
](train-smart-sifting-what-is-supported.md)
+ [

# 훈련 스크립트 내의 SageMaker 스마트 시프팅
](train-smart-sifting-apply-to-script.md)
+ [

# 문제 해결
](train-smart-sifting-best-prac-considerations-troubleshoot.md)
+ [

# SageMaker 스마트 시프팅의 보안
](train-smart-sifting-security.md)
+ [

# SageMaker 스마트 시프팅 Python SDK 참조
](train-smart-sifting-pysdk-reference.md)
+ [

# SageMaker 스마트 시프팅 릴리스 정보
](train-smart-sifting-release-notes.md)

# SageMaker 스마트 시프팅 작동 방식
<a name="train-smart-sifting-how-it-works"></a>

SageMaker 스마트 시프팅의 목표는 훈련 프로세스 중에 훈련 데이터를 체이프레이션하고 모델에 더 많은 정보를 제공하는 샘플만 제공하는 것입니다. PyTorch를 사용한 일반적인 훈련 중에 데이터는 [PyTorch `DataLoader`](https://pytorch.org/docs/stable/data.html)에 의해 훈련 루프 및 액셀러레이터 디바이스(예: GPU 또는 Trainium 칩)에 배치로 반복적으로 전송됩니다. SageMaker 스마트 시프팅은 이 데이터 로드 단계에서 구현되므로 훈련 파이프라인의 업스트림 데이터 사전 처리와는 무관합니다. SageMaker 스마트 시프팅은 모델과 사용자 지정 손실 함수를 사용하여 로드될 때 각 데이터 샘플의 평가 포워드 패스를 수행합니다. *저손실* 값을 반환하는 샘플은 모델의 학습에 미치는 영향이 적기 때문에 모델이 이미 확신을 가지고 올바른 예측을 하기 *쉬우므로* 훈련에서 제외됩니다. 한편, 이러한 비교적 손실이 높은 샘플은 모델이 여전히 학습해야 하는 것이므로 훈련을 위해 보관됩니다. SageMaker 스마트 시프팅에 설정할 수 있는 키 입력은 제외할 데이터의 비율입니다. 예를 들어 비율을 25%로 설정하면 손실 분포의 가장 낮은 사분위수에 분포된 샘플(사용자 지정 이전 샘플 수에서 확보)은 훈련에서 제외됩니다. 고손실 샘플은 정제된 데이터 배치에 누적됩니다. 수정된 데이터 배치는 훈련 루프(순방향 및 역방향 패스)로 전송되고 모델은 수정된 데이터 배치를 학습하고 훈련합니다.

다음 다이어그램은 SageMaker 스마트 시프팅 알고리즘이 어떻게 설계되는지에 대한 개요를 보여줍니다.

![\[데이터가 로드될 때 훈련 중에 SageMaker 스마트 시프팅이 작동하는 방식에 대한 아키텍처 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/images/smartsifting-arch.png)


간단히 말해 SageMaker 스마트 시프팅은 데이터가 로드될 때 훈련 중에 작동합니다. SageMaker 스마트 시프팅 알고리즘은 배치에 대한 손실 계산을 실행하고 각 반복의 전후 통과 전에 개선되지 않은 데이터를 시프팅합니다. 그런 다음 개선된 데이터 배치가 순방향 및 역방향 패스에 사용됩니다.

**참고**  
SageMaker AI에서 데이터의 스마트 시프팅은 추가 전달 패스를 사용하여 훈련 데이터를 분석하고 필터링합니다. 따라서 영향력이 적은 데이터가 훈련 작업에서 제외되므로 역방향 패스가 줄어듭니다. 이로 인해 길거나 비용이 많이 드는 역방향 패스가 있는 모델은 스마트 시프팅을 사용할 때 가장 큰 효율성 향상을 볼 수 있습니다. 한편 모델의 순방향 패스가 역방향 패스보다 오래 걸리는 경우 오버헤드로 인해 총 훈련 시간이 늘어날 수 있습니다. 각 패스에 소요된 시간을 측정하기 위해 파일럿 훈련 작업을 실행하고 프로세스 시간을 기록하는 로그를 수집할 수 있습니다. 또한 프로파일링 도구와 UI 애플리케이션을 제공하는 SageMaker Profiler를 사용하는 것도 고려해 보세요. 자세한 내용은 [Amazon SageMaker Profiler](train-use-sagemaker-profiler.md)을 참조하세요.

SageMaker 스마트 시프팅은 클래식 분산 데이터 병렬 처리가 있는 PyTorch 기반 훈련 작업에서 작동하므로 각 GPU 작업자에 모델 복제본을 만들고 `AllReduce`를 수행합니다. PyTorch DDP 및 SageMaker AI 분산 데이터 병렬 라이브러리에서 작동합니다.

# 지원되는 프레임워크 및 AWS 리전
<a name="train-smart-sifting-what-is-supported"></a>

SageMaker 스마트 시프팅 데이터 로더를 사용하기 전에 선택한 프레임워크가 지원되는지, AWS 계정에서 인스턴스 유형을 사용할 수 있는지, AWS 계정이 지원되는 AWS 리전 중 하나에 있는지 확인합니다.

**참고**  
SageMaker 스마트 시프팅은 기존 데이터 병렬 처리 및 분산 데이터 병렬 처리를 통한 PyTorch 모델 훈련을 지원하므로 모든 GPU 작업자에서 모델 복제본을 만들고 `AllReduce` 작업을 사용합니다. 샤딩된 데이터 병렬 처리를 포함한 모델 병렬 처리 기법에서는 작동하지 않습니다. SageMaker 스마트 시프팅은 데이터 병렬 처리 작업에서 작동하므로 훈련하는 모델이 각 GPU 메모리에 맞는지 확인하세요.

## 지원되는 프레임워크
<a name="train-smart-sifting-supported-frameworks"></a>

SageMaker 스마트 시프팅은 다음과 같은 딥 러닝 프레임워크를 지원하며 AWS 딥 러닝 컨테이너를 통해 사용할 수 있습니다.

**Topics**
+ [

### PyTorch
](#train-smart-sifting-supported-frameworks-pytorch)

### PyTorch
<a name="train-smart-sifting-supported-frameworks-pytorch"></a>


| 프레임워크 | 프레임워크 버전 | 딥 러닝 컨테이너 URI | 
| --- | --- | --- | 
| PyTorch | 2.1.0 |  *763104351884*.dkr.ecr.*region*.amazonaws.com/pytorch-training:2.1.0-gpu-py310-cu121-ubuntu20.04-sagemaker  | 

사전 구축된 컨테이너에 대한 자세한 내용은 *AWS 딥 러닝컨테이너 GitHub 리포지토리*의 [SageMaker AI 프레임워크 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md)를 참조하세요.

## AWS 리전
<a name="train-smart-sifting-supported-regions"></a>

[SageMaker 스마트 시프팅 라이브러리와 함께 패키징된 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-training-compiler-containers)는 [AWS Deep Learning Containers](https://github.com/aws/deep-learning-containers/blob/master/available_images.md)가 사용 중인 AWS 리전 에서 사용할 수 있습니다.

## 인스턴스 유형
<a name="train-smart-sifting-instance-types"></a>

모든 인스턴스 유형의 모든 PyTorch 훈련 작업에 SageMaker 스마트 시프팅을 사용할 수 있습니다. P4d, P4de 또는 P5 인스턴스를 사용하는 것이 좋습니다.

# 훈련 스크립트 내의 SageMaker 스마트 시프팅
<a name="train-smart-sifting-apply-to-script"></a>

SageMaker 스마트 시프팅 라이브러리는 [SageMaker AI 프레임워크 DLC](train-smart-sifting-what-is-supported.md#train-smart-sifting-supported-frameworks)로 패키징됩니다. 모델 훈련에 비교적 영향을 미치는 훈련 샘플에 대한 필터링 로직을 제공하며, 전체 데이터 샘플이 포함된 모델 훈련과 비교할 때 모델이 원하는 모델 정확도에 더 적은 훈련 샘플로 도달할 수 있습니다.

스마트 시프팅 도구를 훈련 스크립트에 구현하는 방법을 알아보려면 사용하는 프레임워크에 따라 다음 중 하나를 선택합니다.

**Topics**
+ [

# PyTorch 스크립트에 SageMaker 스마트 시프팅 적용
](train-smart-sifting-apply-to-pytorch-script.md)
+ [

# Hugging Face Transformers 스크립트에 SageMaker 스마트 시프팅 적용
](train-smart-sifting-apply-to-hugging-face-transformers-script.md)

# PyTorch 스크립트에 SageMaker 스마트 시프팅 적용
<a name="train-smart-sifting-apply-to-pytorch-script"></a>

이 지침은 훈련 스크립트를 사용하여 SageMaker 스마트 시프팅을 활성화하는 방법을 보여줍니다.

1. SageMaker 스마트 시프팅 인터페이스를 구성합니다.

   SageMaker 스마트 시프팅 라이브러리는 손실 값 감소에 미치는 영향이 적은 샘플을 필터링하는 데 도움이 되는 상대 임계값 손실 기반 샘플링 기술을 구현합니다. SageMaker 스마트 시프팅 알고리즘은 순방향 패스를 사용하여 모든 입력 데이터 샘플의 손실 값을 계산하고 이전 데이터의 손실 값에 대한 상대 백분위수를 계산합니다.

   다음 두 파라미터는 시프팅 구성 객체를 생성하기 위해 `RelativeProbabilisticSiftConfig` 클래스에 지정해야 하는 파라미터입니다.
   + `beta_value` 파라미터에 대한 훈련에 사용해야 하는 데이터의 비율을 지정합니다.
   + `loss_history_length` 파라미터와의 비교에 사용되는 샘플 수를 지정합니다.

   다음 코드 예제에서는 `RelativeProbabilisticSiftConfig` 클래스의 객체를 설정하는 방법을 보여줍니다.

   ```
   from smart_sifting.sift_config.sift_configs import (
       RelativeProbabilisticSiftConfig
       LossConfig
       SiftingBaseConfig
   )
   
   sift_config=RelativeProbabilisticSiftConfig(
       beta_value=0.5,
       loss_history_length=500,
       loss_based_sift_config=LossConfig(
            sift_config=SiftingBaseConfig(sift_delay=0)
       )
   )
   ```

   `loss_based_sift_config` 파라미터 및 관련 클래스에 대한 자세한 내용은 SageMaker 스마트 시프팅 Python SDK 참조 섹션의 [SageMaker 스마트 시프팅 구성 모듈](train-smart-sifting-pysdk-reference.md#train-smart-sifting-pysdk-base-config-modules) 섹션을 참조하세요.

   위 코드 예제의 `sift_config` 객체는 `SiftingDataloader` 클래스를 설정하는 데 4단계에서 사용됩니다.

1. (선택 사항) SageMaker 스마트 시프팅 배치 변환 클래스를 구성합니다.

   다양한 훈련 사용 사례에는 다양한 훈련 데이터 형식이 필요합니다. 다양한 데이터 형식을 고려할 때 SageMaker 스마트 시프팅 알고리즘은 특정 배치에서 시프팅을 수행하는 방법을 식별해야 합니다. 이를 해결하기 위해 SageMaker 스마트 시프팅은 배치를 효율적으로 시프팅할 수 있는 표준화된 형식으로 변환하는 데 도움이 되는 배치 변환 모듈을 제공합니다.

   1. SageMaker 스마트 시프팅은 Python 목록, 사전, 튜플 및 텐서 형식으로 훈련 데이터의 배치 변환을 처리합니다. 이러한 데이터 형식의 경우 SageMaker 스마트 시프팅은 배치 데이터 형식 변환을 자동으로 처리하며 이 단계의 나머지 부분을 건너뛸 수 있습니다. 이 단계를 건너뛰면 `SiftingDataloader` 구성에 대한 4단계에서 `SiftingDataloader`의 `batch_transforms` 파라미터를 기본값인 `None`로 둡니다.

   1. 데이터세트가 이러한 형식이 아닌 경우 이 단계의 나머지 부분으로 이동하여 `SiftingBatchTransform`를 사용하여 사용자 지정 배치 변환을 생성해야 합니다.

      데이터세트가 SageMaker 스마트 시프팅에서 지원하는 형식 중 하나에 속하지 않는 경우 오류가 발생할 수 있습니다. 이러한 데이터 형식 오류는 4단계에서 설정한 `SiftingDataloader` 클래스에 `batch_format_index` 또는 `batch_transforms` 파라미터를 추가하여 해결할 수 있습니다. 다음은 호환되지 않는 데이터 형식 및 해상도로 인한 오류의 예입니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/train-smart-sifting-apply-to-pytorch-script.html)

      앞서 언급한 문제를 해결하려면 `SiftingBatchTransform` 모듈을 사용하여 사용자 지정 배치 변환 클래스를 생성해야 합니다. 배치 변환 클래스는 한 쌍의 변환 및 역변환 함수로 구성되어야 합니다. 함수 페어는 데이터 형식을 SageMaker 스마트 시프팅 알고리즘이 처리할 수 있는 형식으로 변환합니다. 배치 변환 클래스를 생성한 후 클래스는 4단계에서 `SiftingDataloader` 클래스에 전달할 `SiftingBatch` 객체를 반환합니다.

      다음은 `SiftingBatchTransform` 모듈의 사용자 지정 배치 변환 클래스의 예입니다.
      + 데이터 로더 청크에 입력, 마스크 및 레이블이 있는 경우 SageMaker 스마트 시프팅을 사용한 사용자 지정 목록 배치 변환 구현의 예입니다.

        ```
        from typing import Any
        
        import torch
        
        from smart_sifting.data_model.data_model_interface import SiftingBatchTransform
        from smart_sifting.data_model.list_batch import ListBatch
        
        class ListBatchTransform(SiftingBatchTransform):
            def transform(self, batch: Any):
                inputs = batch[0].tolist()
                labels = batch[-1].tolist()  # assume the last one is the list of labels
                return ListBatch(inputs, labels)
        
            def reverse_transform(self, list_batch: ListBatch):
                a_batch = [torch.tensor(list_batch.inputs), torch.tensor(list_batch.labels)]
                return a_batch
        ```
      + 역변환에 레이블이 필요하지 않은 경우 SageMaker 스마트 시프팅을 사용한 사용자 지정 목록 배치 변환 구현의 예입니다.

        ```
        class ListBatchTransformNoLabels(SiftingBatchTransform):
            def transform(self, batch: Any):
                return ListBatch(batch[0].tolist())
        
            def reverse_transform(self, list_batch: ListBatch):
                a_batch = [torch.tensor(list_batch.inputs)]
                return a_batch
        ```
      + 데이터 로더 청크에 입력, 마스크 및 레이블이 있는 경우 SageMaker 스마트 체이스팅을 사용한 사용자 지정 텐서 배치 구현의 예입니다.

        ```
        from typing import Any
        
        from smart_sifting.data_model.data_model_interface import SiftingBatchTransform
        from smart_sifting.data_model.tensor_batch import TensorBatch
        
        class TensorBatchTransform(SiftingBatchTransform):
            def transform(self, batch: Any):
                a_tensor_batch = TensorBatch(
                    batch[0], batch[-1]
                )  # assume the last one is the list of labels
                return a_tensor_batch
        
            def reverse_transform(self, tensor_batch: TensorBatch):
                a_batch = [tensor_batch.inputs, tensor_batch.labels]
                return a_batch
        ```

      `SiftingBatchTransform` 구현 배치 변환 클래스를 생성한 후 4단계에서 이 클래스를 사용하여 `SiftingDataloader` 클래스를 설정합니다. 이 가이드의 나머지 부분에서는 `ListBatchTransform` 클래스가 생성되었다고 가정합니다. 4단계에서는 이 클래스가 `batch_transforms`로 전달됩니다.

1. SageMaker 스마트 시프팅 `Loss` 인터페이스를 구현하기 위한 클래스를 생성합니다. 이 자습서에서는 클래스의 이름이 `SiftingImplementedLoss`라고 가정합니다. 이 클래스를 설정할 때는 모델 훈련 루프에서 동일한 손실 함수를 사용하는 것이 좋습니다. SageMaker 스마트 시프팅 `Loss` 구현 클래스를 생성하기 위한 다음 하위 단계를 살펴봅니다.

   1. SageMaker 스마트 시프팅은 배치에 대한 단일 손실 값을 계산하는 대신 각 훈련 데이터 샘플에 대한 손실 값을 계산합니다. SageMaker 스마트 시프팅이 동일한 손실 계산 로직을 사용하도록 하려면 손실 함수를 사용하고 훈련 샘플당 손실을 계산하는 SageMaker 스마트 시프팅 `Loss` 모듈을 사용하여 스마트 시프팅 구현 손실 함수를 생성합니다.
**작은 정보**  
SageMaker 스마트 시프팅 알고리즘은 전체 배치가 아닌 모든 데이터 샘플에서 실행되므로 축소 전략 없이 PyTorch 손실 함수를 설정하려면 초기화 함수를 추가해야 합니다.  

      ```
      class SiftingImplementedLoss(Loss):  
          def __init__(self):
              self.loss = torch.nn.CrossEntropyLoss(reduction='none')
      ```
이는 다음 코드 예제에서도 볼 수 있습니다.

   1. `original_batch`(또는 2단계에서 배치 변환을 설정한 경우 `transformed_batch`) 및 PyTorch 모델을 수락하는 손실 함수를 정의합니다. SageMaker 스마트 시프팅은 지정된 손실 함수를 감소 없이 사용하여 각 데이터 샘플에 대한 순방향 패스를 실행하여 손실 값을 평가합니다.

   다음 코드는 `SiftingImplementedLoss`라는 스마트 시프팅 구현 `Loss` 인터페이스의 예입니다.

   ```
   from typing import Any
   
   import torch
   import torch.nn as nn
   from torch import Tensor
   
   from smart_sifting.data_model.data_model_interface import SiftingBatch
   from smart_sifting.loss.abstract_sift_loss_module import Loss
   
   model=... # a PyTorch model based on torch.nn.Module
   
   class SiftingImplementedLoss(Loss):   
       # You should add the following initializaztion function 
       # to calculate loss per sample, not per batch.
       def __init__(self):
           self.loss_no_reduction = torch.nn.CrossEntropyLoss(reduction='none')
   
       def loss(
           self,
           model: torch.nn.Module,
           transformed_batch: SiftingBatch,
           original_batch: Any = None,
       ) -> torch.Tensor:
           device = next(model.parameters()).device
           batch = [t.to(device) for t in original_batch] # use this if you use original batch and skipped step 2
           # batch = [t.to(device) for t in transformed_batch] # use this if you transformed batches in step 2
   
           # compute loss
           outputs = model(batch)
           return self.loss_no_reduction(outputs.logits, batch[2])
   ```

   훈련 루프가 실제 순방향 패스에 도달하기 전에 이 시프팅 손실 계산은 각 반복에서 배치를 가져오는 데이터 로드 단계에서 수행됩니다. 그런 다음 개별 손실 값을 이전 손실 값과 비교하고 상대 백분위수는 1단계에서 설정한 `RelativeProbabilisticSiftConfig` 객체당 추정됩니다.

1. SageMaker AI `SiftingDataloader` 클래스로 PyTroch 데이터 로더를 래핑합니다.

   마지막으로 이전 단계에서 구성한 모든 SageMaker 스마트 시프팅 구현 클래스를 SageMaker AI `SiftingDataloder` 구성 클래스에 사용합니다. 이 클래스는 PyTorch [https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader)의 래퍼입니다. PyTorch `DataLoader`를 래핑하면 SageMaker 스마트 시프팅이 PyTorch 훈련 작업의 각 반복에서 데이터 로드의 일부로 실행되도록 등록됩니다. 다음 코드 예시는 PyTorch `DataLoader`에 SageMaker AI 데이터 시프팅을 구현하는 방법을 보여줍니다.

   ```
   from smart_sifting.dataloader.sift_dataloader import SiftingDataloader
   from torch.utils.data import DataLoader
   
   train_dataloader = DataLoader(...) # PyTorch data loader
   
   # Wrap the PyTorch data loader by SiftingDataloder
   train_dataloader = SiftingDataloader(
       sift_config=sift_config, # config object of RelativeProbabilisticSiftConfig
       orig_dataloader=train_dataloader,
       batch_transforms=ListBatchTransform(), # Optional, this is the custom class from step 2
       loss_impl=SiftingImplementedLoss(), # PyTorch loss function wrapped by the Sifting Loss interface
       model=model,
       log_batch_data=False
   )
   ```

# Hugging Face Transformers 스크립트에 SageMaker 스마트 시프팅 적용
<a name="train-smart-sifting-apply-to-hugging-face-transformers-script"></a>

SageMaker 스마트 시프팅을 Transformers `Trainer` 클래스에 구현하는 방법은 두 가지가 있습니다.

**참고**  
SageMaker 스마트 시프팅 패키지가 설치된 상태에서 PyTorch용 DLC 중 하나를 사용하는 경우 `transformers` 라이브러리를 설치해야 합니다. SageMaker AI Python SDK에서 [DLC를 확장](prebuilt-containers-extend.md)하거나 PyTorch([https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html))에 대한 훈련 작업 시작 관리자 클래스로 `requirements.txt`를 전달하여 추가 패키지를 설치할 수 있습니다.

## 간단한 설정
<a name="train-smart-sifting-apply-to-hugging-face-transformers-script-simple"></a>

SageMaker 스마트 시프팅을 Transformers `Trainer` 클래스에 구현하는 가장 간단한 방법은 `enable_sifting` 함수를 사용하는 것입니다. 이 함수는 기존 `Trainer` 객체를 수락하고 기존 `DataLoader` 객체를 `SiftingDataloader`로 래핑합니다. 동일한 훈련 객체를 계속 사용할 수 있습니다. 다음 예제 사용을 참조하세요.

```
from smart_sifting.integrations.trainer import enable_sifting
from smart_sifting.loss.abstract_sift_loss_module import Loss
from smart_sifting.sift_config.sift_configs import (
    RelativeProbabilisticSiftConfig
    LossConfig
    SiftingBaseConfig
)

class SiftingImplementedLoss(Loss):
   def loss(self, model, transformed_batch, original_batch):
        loss_fct = MSELoss(reduction="none") # make sure to set reduction to "none"
        logits = model.bert(**original_batch)
        return loss_fct(logits, original_batch.get("labels"))

sift_config = RelativeProbabilisticSiftConfig(
    beta_value=0.5,
    loss_history_length=500,
    loss_based_sift_config=LossConfig(
         sift_config=SiftingBaseConfig(sift_delay=0)
    )
)

trainer = Trainer(...)
enable_sifting(trainer, sift_config, loss=SiftingImplementedLoss()) # updates the trainer with Sifting Loss and config
trainer.train()
```

`SiftingDataloader` 클래스는 반복 가능한 데이터 로더입니다. 시프팅 중 무작위 샘플링으로 인해 결과 데이터세트의 정확한 크기를 미리 알 수 없습니다. 따라서 Hugging Face `Trainer`는 [`max_steps` 훈련 인수](https://huggingface.co/docs/transformers/main_classes/trainer#transformers.TrainingArguments.max_steps)를 예상합니다. 이 인수는 에폭 구성 파라미터 `num_train_epochs`를 재정의합니다. 원본 데이터 로더도 반복 가능했거나 훈련에서 `max_steps` 및 단일 에포크를 사용하는 경우 `SiftingDataloader`는 기존 데이터 로더와 동일하게 수행합니다. 원래 데이터 로더를 반복할 수 없거나 `max_steps`가 제공되지 않은 경우 Hugging Face Trainer는 다음과 유사한 오류 메시지를 생성할 수 있습니다.

```
args.max_steps must be set to a positive value if dataloader does not have a length,
was -1
```

이를 해결하기 위해 `enable_sifting` 함수는 선택적 `set_epochs` 파라미터를 제공합니다. 이렇게 하면 `Trainer` 클래스의 [num\$1train\$1epochs 인수](https://huggingface.co/docs/transformers/main_classes/trainer#transformers.TrainingArguments.num_train_epochs(float,)에서 제공하는 에폭 수를 사용하여 에폭으로 훈련하고 `max_steps`를 최대 시스템 정수로 설정하여 지정된 에폭이 완료될 때까지 훈련이 진행될 수 있습니다.

## 사용자 지정 설정
<a name="train-smart-sifting-apply-to-hugging-face-transformers-script-custom-trainer"></a>

SageMaker 스마트 시프팅 데이터로더의 사용자 지정 통합을 위해 사용자 지정 Hugging Face `Trainer` 클래스를 활용할 수 있습니다. `Trainer`의 하위 클래스 내에서 `get_train_dataloader()` 함수를 재정의하여 `SiftingDataloader` 클래스의 객체를 반환할 수 있습니다. 기존 사용자 지정 트레이너가 있는 사례의 경우 이 접근 방식은 침입성이 낮을 수 있지만 간단한 설정 옵션보다 코드를 변경해야 합니다. 다음은 사용자 지정 Hugging Face `Trainer` 클래스로 SageMaker 스마트 시프팅을 구현하는 예제입니다.

```
from smart_sifting.sift_config.sift_configs import (
    RelativeProbabilisticSiftConfig
    LossConfig
    SiftingBaseConfig
)
from smart_sifting.dataloader.sift_dataloader import SiftingDataloader
from smart_sifting.loss.abstract_sift_loss_module import Loss
from smart_sifting.data_model.data_model_interface import SiftingBatch, SiftingBatchTransform
from smart_sifting.data_model.list_batch import ListBatch

class SiftingListBatchTransform(SiftingBatchTransform):
    def transform(self, batch: Any):
        inputs = batch[0].tolist()
        labels = batch[-1].tolist()  # assume the last one is the list of labels
        return ListBatch(inputs, labels)

    def reverse_transform(self, list_batch: ListBatch):
        a_batch = [torch.tensor(list_batch.inputs), torch.tensor(list_batch.labels)]
        return a_batch

class SiftingImplementedLoss():
    # You should add the following initializaztion function 
    # to calculate loss per sample, not per batch.
    def __init__(self):
        self.celoss = torch.nn.CrossEntropyLoss(reduction='none')

    def loss(
        self,
        model: torch.nn.Module,
        transformed_batch: SiftingBatch,
        original_batch: Any = None,
    ) -> torch.Tensor:
        device = next(model.parameters()).device
        batch = [t.to(device) for t in original_batch]

        # compute loss
        outputs = model(batch)
        return self.celoss(outputs.logits, batch[2])

class SiftingImplementedTrainer(Trainer):
    def get_train_dataloader(self):
        dl = super().get_train_dataloader()

        sift_config = RelativeProbabilisticSiftConfig(
            beta_value=0.5,
            loss_history_length=500,
            loss_based_sift_config=LossConfig(
                sift_config=SiftingBaseConfig(sift_delay=0)
            )
        )

        return SiftingDataloader(
                sift_config=sift_config,
                orig_dataloader=dl,
                batch_transforms=SiftingListBatchTransform(),
                loss_impl=SiftingImplementedLoss(),
                model=self.model
        )
```

래핑된 `Trainer` 클래스를 사용하여 다음과 같이 객체를 생성합니다.

```
trainer = SiftingImplementedTrainer(
    model=model,
    args=training_args,
    train_dataset=small_train_dataset,
    eval_dataset=small_eval_dataset
)

trainer.train()
```

# 문제 해결
<a name="train-smart-sifting-best-prac-considerations-troubleshoot"></a>

오류가 발생하는 경우 다음 목록을 사용하여 문제를 해결할 수 있습니다. 추가 지원이 필요한 경우 sm-smart-sifting-feedback@amazon.com으로 SageMaker AI 팀에 문의하세요.

**SageMaker 스마트 시프팅 라이브러리의 예외**

SageMaker 스마트 시프팅 라이브러리에서 발생한 예외에 대한 다음 참조를 사용하여 오류를 해결하고 원인을 식별합니다.


| 예외 이름 | 설명 | 
| --- | --- | 
| SiftConfigValidationException | Config 키가 누락되거나 Sift 키에 지원되지 않는 값 유형이 있는 경우 SageMaker 스마트 시프팅 라이브러리에서 생성 | 
| UnsupportedDataFormatException | 지원되지 않는 DataFormat for Sifting 로직이 있는 경우 SageMaker 스마트 시프팅 라이브러리에서 생성 | 
| LossImplementationNotProvidedException | 손실 인터페이스가 없거나 구현되지 않은 경우 교체 | 

# SageMaker 스마트 시프팅의 보안
<a name="train-smart-sifting-security"></a>

SageMaker 스마트 시프팅 라이브러리는 가치가 낮은 훈련 샘플을 제거하는 프로세스를 실행하기 때문에 데이터 로더가 생성하는 훈련 데이터세트에 대한 전체 액세스 권한이 필요합니다. 이 액세스는 일반 훈련 시나리오에서 PyTorch에 이미 제공된 액세스와 다르지 않습니다.

SageMaker 스마트 시프팅에는 보안에 영향을 미치는 로깅이 내장되어 있습니다. 기본적으로 SageMaker 스마트 시프팅 로그는 지표, 지연 시간 및 사용자 오류 또는 경고가 포함된 애플리케이션 수준 로그입니다. 그러나 사용자는 전체 배치 데이터를 로그하여 지정된 배치에서 제거된 샘플을 표시하는 세부 로그를 활성화하도록 선택할 수 있습니다. 이러한 로그는 Python 로거를 사용하여 전송되며 라이브러리에서 업로드하거나 저장하지 않습니다. CloudWatch 또는 유사한 서비스에 자동 로그를 업로드하는 경우 세부 로그를 사용하면 민감한 훈련 데이터가 훈련 인스턴스에서 업로드될 수 있습니다.

앞서 언급한 로깅 외에도 SageMaker 스마트 시프팅에는 네트워크 기능이 없으며 로컬 파일 시스템과 상호 작용하지도 않습니다. 사용자 데이터는 라이브러리에서 사용하는 전체 시간 동안 메모리 내 객체로 저장됩니다.

# SageMaker 스마트 시프팅 Python SDK 참조
<a name="train-smart-sifting-pysdk-reference"></a>

이 페이지에서는 훈련 스크립트에 SageMaker 스마트 시프팅을 적용하는 데 필요한 Python 모듈에 대한 참조를 제공합니다.

## SageMaker 스마트 시프팅 구성 모듈
<a name="train-smart-sifting-pysdk-base-config-modules"></a>

**`class smart_sifting.sift_config.sift_configs.RelativeProbabilisticSiftConfig()`**

SageMaker 스마트 시프팅 구성 클래스입니다.

**파라미터**
+ `beta_value` (부동 소수점) - 베타(일정) 값입니다. 손실 값 기록의 손실 백분위수를 기반으로 훈련할 샘플을 선택할 확률을 계산하는 데 사용됩니다. 베타 값을 낮추면 시프팅된 데이터의 비율이 낮아지고 이를 높이면 시프팅된 데이터의 비율이 높아집니다. 베타 값에는 양수 값이어야 한다는 점을 제외하고 최소값 또는 최대값이 없습니다. 다음 참조 표는 `beta_value`와 관련된 시프팅 속도에 대한 정보를 제공합니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/train-smart-sifting-pysdk-reference.html)
+ `loss_history_length`(int) - 상대 임계값 손실 기반 샘플링에 대해 저장할 이전 훈련 손실 수입니다.
+ `loss_based_sift_config`(dict 또는 `LossConfig` 객체) - SageMaker 스마트 시프팅 손실 인터페이스 구성을 반환하는 `LossConfig` 객체를 지정합니다.

**`class smart_sifting.sift_config.sift_configs.LossConfig()`**

`RelativeProbabilisticSiftConfig` 클래스의 `loss_based_sift_config` 파라미터에 대한 구성 클래스입니다.

**파라미터**
+ `sift_config`(dict 또는 `SiftingBaseConfig` 객체) - 시프팅 기본 구성 사전을 반환하는 `SiftingBaseConfig` 객체를 지정합니다.

**`class smart_sifting.sift_config.sift_configs.SiftingBaseConfig()`**

`LossConfig`의 파라미터의 구성 클래스입니다.

**파라미터**
+ `sift_delay`(int) - 시프팅을 시작하기 전에 기다려야 하는 훈련 단계의 수입니다. 모델의 모든 계층이 훈련 데이터를 충분히 본 후 시프팅을 시작하는 것이 좋습니다. 기본값은 `1000`입니다.
+ `repeat_delay_per_epoch`(bool) - 모든 에폭의 시프팅을 지연할지 여부를 지정합니다. 기본값은 `False`입니다.

## SageMaker 스마트 시프팅 데이터 배치 변환 모듈
<a name="train-smart-sifting-pysdk-batch-transform-modules"></a>

`class smart_sifting.data_model.data_model_interface.SiftingBatchTransform`

배치 변환을 수행하는 방법을 정의하기 위한 SageMaker 스마트 시프팅 Python 모듈입니다. 이를 사용하여 훈련 데이터의 데이터 형식을 `SiftingBatch` 형식으로 변환하는 배치 변환 클래스를 설정할 수 있습니다. SageMaker 스마트 시프팅은 이 형식의 데이터를 시프팅된 배치로 시프팅하고 누적할 수 있습니다.

`class smart_sifting.data_model.data_model_interface.SiftingBatch`

시프팅하고 누적할 수 있는 배치 데이터 유형을 정의하는 인터페이스입니다.

`class smart_sifting.data_model.list_batch.ListBatch`

시프팅을 위한 목록 배치를 추적하기 위한 모듈입니다.

`class smart_sifting.data_model.tensor_batch.TensorBatch`

시프팅을 위한 텐서 배치를 추적하기 위한 모듈입니다.

## SageMaker 스마트 시프팅 손실 구현 모듈
<a name="train-smart-sifting-pysdk-loss-interface-moddule"></a>

`class smart_sifting.loss.abstract_sift_loss_module.Loss`

PyTorch 기반 모델의 손실 함수에 SageMaker 스마트 시프팅 인터페이스를 등록하기 위한 래퍼 모듈입니다.

## SageMaker 스마트 시프팅 데이터 로더 래퍼 모듈
<a name="train-smart-sifting-pysdk-dataloader-wrapper-module"></a>

`class smart_sifting.dataloader.sift_dataloader.SiftingDataloader`

PyTorch 기반 모델의 데이터 로더에 SageMaker 스마트 시프팅 인터페이스를 등록하기 위한 래퍼 모듈입니다.

Main Sifting Dataloader 반복자는 sift 구성을 기반으로 데이터 로더에서 훈련 샘플을 시프팅합니다.

**파라미터**
+ `sift_config`(dict 또는 `RelativeProbabilisticSiftConfig` 객체) - `RelativeProbabilisticSiftConfig` 객체입니다.
+ `orig_dataloader`(PyTorch DataLoader 객체) - 래핑할 PyTorch Dataloader 객체를 지정합니다.
+ `batch_transforms`(`SiftingBatchTransform`객체) – (선택 사항) SageMaker 스마트 시프팅 라이브러리의 기본 변환에서 데이터 형식을 지원하지 않는 경우 `SiftingBatchTransform` 모듈을 사용하여 배치 변환 클래스를 생성해야 합니다. 이 파라미터는 배치 변환 클래스를 전달하는 데 사용됩니다. 이 클래스는 SageMaker 스마트 시프팅 알고리즘이 수락할 수 있는 형식으로 데이터를 변환하기 위해 `SiftingDataloader`에 사용됩니다.
+ `model`(PyTorch 모델 객체) - 원래 PyTorch 모델
+ `loss_impl`(`smart_sifting.loss.abstract_sift_loss_module.Loss`의 시프팅 손실 함수) - `Loss` 모듈로 구성되고 PyTorch 손실 함수를 래핑하는 시프팅 손실 함수입니다.
+ `log_batch_data`(bool) - 배치 데이터를 로깅할지 여부를 지정합니다. `True`로 설정하면 SageMaker 스마트 시프팅은 유지되거나 시프팅된 배치의 세부 정보를 기록합니다. 파일럿 훈련 작업에만 활성화하는 것이 좋습니다. 로깅이 켜져 있으면 샘플이 GPU에 로드되고 CPU로 전송되어 오버헤드가 발생합니다. 기본값은 `False`입니다.

# SageMaker 스마트 시프팅 릴리스 정보
<a name="train-smart-sifting-release-notes"></a>

SageMaker 스마트 시프팅 기능에 대한 최신 업데이트를 추적하려면 다음 릴리스 정보를 참조하세요.

## SageMaker 스마트 시프팅 릴리스 정보: 2023년 11월 29일
<a name="train-smart-sifting-release-notes-20231129"></a>

**새로운 기능**
+  AWS re:Invent 2023에서 Amazon SageMaker 스마트 시프팅 라이브러리를 시작했습니다.

**AWS 딥 러닝 컨테이너로 마이그레이션**
+ SageMaker 스마트 시프팅 라이브러리는 통합 테스트를 통과했으며 AWS 딥 러닝 컨테이너에서 사용할 수 있습니다. SageMaker 스마트 시프팅 라이브러리를 사용하여 사전 구축된 컨테이너의 전체 목록을 찾으려면 [지원되는 프레임워크 및 AWS 리전](train-smart-sifting-what-is-supported.md) 섹션을 참조하세요.