기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
PyTorch 스크립트에 SageMaker 스마트 시프팅 적용
이 지침은 훈련 스크립트를 사용하여 SageMaker 스마트 시프팅을 활성화하는 방법을 보여줍니다.
-
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 스마트 시프팅 구성 모듈 섹션을 참조하세요.위 코드 예제의
sift_config
객체는SiftingDataloader
클래스를 설정하는 데 4단계에서 사용됩니다. -
-
(선택 사항) SageMaker 스마트 시프팅 배치 변환 클래스를 구성합니다.
다양한 훈련 사용 사례에는 다양한 훈련 데이터 형식이 필요합니다. 다양한 데이터 형식을 고려할 때 SageMaker 스마트 시프팅 알고리즘은 특정 배치에서 시프팅을 수행하는 방법을 식별해야 합니다. 이를 해결하기 위해 SageMaker 스마트 시프팅은 배치를 효율적으로 시프팅할 수 있는 표준화된 형식으로 변환하는 데 도움이 되는 배치 변환 모듈을 제공합니다.
-
SageMaker 스마트 시프팅은 Python 목록, 사전, 튜플 및 텐서 형식으로 훈련 데이터의 배치 변환을 처리합니다. 이러한 데이터 형식의 경우 SageMaker 스마트 시프팅은 배치 데이터 형식 변환을 자동으로 처리하며 이 단계의 나머지 부분을 건너뛸 수 있습니다. 이 단계를 건너뛰면
SiftingDataloader
구성에 대한 4단계에서SiftingDataloader
의batch_transforms
파라미터를 기본값인None
로 둡니다. -
데이터세트가 이러한 형식이 아닌 경우 이 단계의 나머지 부분으로 이동하여
SiftingBatchTransform
를 사용하여 사용자 지정 배치 변환을 생성해야 합니다.데이터세트가 SageMaker 스마트 시프팅에서 지원하는 형식 중 하나에 속하지 않는 경우 오류가 발생할 수 있습니다. 이러한 데이터 형식 오류는 4단계에서 설정한
SiftingDataloader
클래스에batch_format_index
또는batch_transforms
파라미터를 추가하여 해결할 수 있습니다. 다음은 호환되지 않는 데이터 형식 및 해상도로 인한 오류의 예입니다.오류 메시지 해결 방법 {type(batch)}
유형의 배치는 기본적으로 지원되지 않습니다.이 오류는 배치 형식이 기본적으로 지원되지 않음을 나타냅니다. 사용자 지정 배치 변환 클래스를 구현하고 SiftingDataloader
클래스의batch_transforms
파라미터에 지정하여 이를 사용해야 합니다.{type(batch)}
유형의 배치를 인덱싱할 수 없음이 오류는 배치 객체를 정상적으로 인덱싱할 수 없음을 나타냅니다. 사용자는 사용자 지정 배치 변환을 구현하고 batch_transforms
파라미터를 사용하여 이를 전달해야 합니다.배치 크기
{batch_size}
가 차원 0 또는 차원 1 크기와 일치하지 않습니다.이 오류는 제공된 배치 크기가 배치의 0번째 또는 1번째 차원과 일치하지 않을 때 발생합니다. 사용자는 사용자 지정 배치 변환을 구현하고 batch_transforms
파라미터를 사용하여 이를 전달해야 합니다.차원 0과 차원 1 모두 배치 크기와 일치
이 오류는 여러 차원이 제공된 배치 크기와 일치하므로 배치를 시프팅하려면 추가 정보가 필요함을 나타냅니다. 사용자는 batch_format_index
파라미터를 제공하여 배치가 샘플 또는 기능으로 인덱싱 가능한지 여부를 나타낼 수 있습니다. 사용자는 사용자 지정 배치 변환을 구현할 수도 있지만 이는 필요한 것보다 더 많은 작업입니다.앞서 언급한 문제를 해결하려면
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
로 전달됩니다. -
-
-
SageMaker 스마트 시프팅
Loss
인터페이스를 구현하기 위한 클래스를 생성합니다. 이 자습서에서는 클래스의 이름이SiftingImplementedLoss
라고 가정합니다. 이 클래스를 설정할 때는 모델 훈련 루프에서 동일한 손실 함수를 사용하는 것이 좋습니다. SageMaker 스마트 시프팅Loss
구현 클래스를 생성하기 위한 다음 하위 단계를 살펴봅니다.-
SageMaker 스마트 시프팅은 배치에 대한 단일 손실 값을 계산하는 대신 각 훈련 데이터 샘플에 대한 손실 값을 계산합니다. SageMaker 스마트 시프팅이 동일한 손실 계산 로직을 사용하도록 하려면 손실 함수를 사용하고 훈련 샘플당 손실을 계산하는 SageMaker 스마트 시프팅
Loss
모듈을 사용하여 스마트 시프팅 구현 손실 함수를 생성합니다.작은 정보
SageMaker 스마트 시프팅 알고리즘은 전체 배치가 아닌 모든 데이터 샘플에서 실행되므로 축소 전략 없이 PyTorch 손실 함수를 설정하려면 초기화 함수를 추가해야 합니다.
class
SiftingImplementedLoss
(Loss): def __init__(self): self.loss =torch.nn.CrossEntropyLoss
(reduction='none')이는 다음 코드 예제에서도 볼 수 있습니다.
-
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
객체당 추정됩니다. -
-
SageMaker AI
SiftingDataloader
클래스로 PyTroch 데이터 로더를 래핑합니다.마지막으로 이전 단계에서 구성한 모든 SageMaker 스마트 시프팅 구현 클래스를 SageMaker AI
SiftingDataloder
구성 클래스에 사용합니다. 이 클래스는 PyTorchDataLoader
의 래퍼입니다. PyTorch DataLoader
를 래핑하면 SageMaker 스마트 시프팅이 PyTorch 훈련 작업의 각 반복에서 데이터 로드의 일부로 실행되도록 등록됩니다. 다음 코드 예제는 PyTorch에 SageMaker AI 데이터 시프팅을 구현하는 방법을 보여줍니다DataLoader
.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
)