As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Aplique a peneiração SageMaker inteligente ao seu script PyTorch
Essas instruções demonstram como habilitar a peneiração SageMaker inteligente com seu script de treinamento.
-
Configure a interface de peneiramento SageMaker inteligente.
A biblioteca de peneiramento SageMaker inteligente implementa uma técnica de amostragem baseada em perda de limite relativo que ajuda a filtrar amostras com menor impacto na redução do valor da perda. O algoritmo de peneiramento SageMaker inteligente calcula o valor de perda de cada amostra de dados de entrada usando uma passagem direta e calcula seu percentil relativo em relação aos valores de perda dos dados anteriores.
Os dois parâmetros a seguir são o que você precisa especificar para a classe
RelativeProbabilisticSiftConfigpara criar um objeto de configuração de filtragem.-
Especifique a proporção de dados que devem ser usados para treinamento em relação ao parâmetro
beta_value. -
Especifique o número de amostras usadas na comparação com o parâmetro
loss_history_length.
O exemplo de código a seguir demonstra a configuração de um objeto da classe
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) ) )Para obter mais informações sobre o
loss_based_sift_configparâmetro e as classes relacionadas, consulte a seção SageMaker módulos de configuração de peneiramento inteligente de referência do SageMaker SDK Python do smart sifting.O objeto
sift_configno exemplo de código anterior é usado na etapa 4 para configurar a classeSiftingDataloader. -
-
(Opcional) Configure uma classe de transformação em lote de peneiramento SageMaker inteligente.
Casos de uso de treinamento diferentes exigem formatos de dados de treinamento diferentes. Dada a variedade de formatos de dados, o algoritmo de peneiramento SageMaker inteligente precisa identificar como realizar a peneiração em um determinado lote. Para resolver isso, a peneiração SageMaker inteligente fornece um módulo de transformação em lote que ajuda a converter lotes em formatos padronizados que podem ser filtrados com eficiência.
-
SageMaker A peneiração inteligente manipula a transformação em lote de dados de treinamento nos seguintes formatos: listas, dicionários, tuplas e tensores do Python. Para esses formatos de dados, a peneiração SageMaker inteligente processa automaticamente a conversão do formato de dados em lote, e você pode pular o restante desta etapa. Se você pular essa etapa, na etapa 4 de configuração do
SiftingDataloader, deixe o parâmetrobatch_transformsdeSiftingDataloadercom seu valor padrão, que éNone. -
Se seu conjunto de dados não estiver nesses formatos, você deverá prosseguir com o restante desta etapa para criar uma transformação em lote personalizada usando
SiftingBatchTransform.Nos casos em que seu conjunto de dados não está em um dos formatos compatíveis com a peneiração SageMaker inteligente, você pode se deparar com erros. Esses erros de formato de dados podem ser resolvidos adicionando o parâmetro
batch_format_indexoubatch_transformsà classeSiftingDataloader, que você configurou na etapa 4. A seguir, são mostrados exemplos de erros devido a um formato de dados e resoluções incompatíveis para eles.Mensagem de erro Resolução Por padrão, não
{type(batch)}há suporte para lotes desse tipo.Esse erro indica que o formato de lote não é compatível por padrão. Você deve implementar uma classe de transformação em lote personalizada e usá-la especificando-a no parâmetro batch_transformsda classeSiftingDataloader.Não é possível indexar o lote do tipo
{type(batch)}Esse erro indica que o objeto em lote não pode ser indexado normalmente. O usuário deve implementar uma transformação em lote personalizada e transmiti-la usando o parâmetro batch_transforms.{batch_size}O tamanho do lote não corresponde aos tamanhos da dimensão 0 ou da dimensão 1Esse erro ocorre quando o tamanho do lote fornecido não corresponde à 0ª ou 1ª dimensão do lote. O usuário deve implementar uma transformação em lote personalizada e transmiti-la usando o parâmetro batch_transforms.Tanto a dimensão 0 quanto a dimensão 1 correspondem ao tamanho do lote
Esse erro indica que, como várias dimensões correspondem ao tamanho do lote fornecido, são necessárias mais informações para filtrar o lote. O usuário pode fornecer o parâmetro batch_format_indexpara indicar se o lote é indexável por amostra ou atributo. Os usuários também podem implementar uma transformação em lote personalizada, mas isso é mais trabalhoso do que o necessário.Para resolver os problemas mencionados acima, você precisa criar uma classe de transformação em lote personalizada usando o módulo
SiftingBatchTransform. Uma classe de transformação em lote deve consistir em um par de funções de transformação e transformação reversa. O par de funções converte seu formato de dados em um formato que o algoritmo de peneiramento SageMaker inteligente possa processar. Depois de criar uma classe de transformação em lote, a classe retorna um objetoSiftingBatchque você passará para a classeSiftingDataloaderna etapa 4.Veja a seguir exemplos de classes personalizadas de transformação em lote do módulo
SiftingBatchTransform.-
Um exemplo de implementação personalizada de transformação em lote de listas com peneiramento SageMaker inteligente para casos em que o bloco do carregador de dados tem entradas, máscaras e rótulos.
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 classListBatchTransform(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 -
Um exemplo de implementação personalizada de transformação em lote de listas com peneiramento SageMaker inteligente para casos em que não são necessários rótulos para a transformação reversa.
classListBatchTransformNoLabels(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 -
Um exemplo de implementação personalizada em lote de tensores com peneiramento SageMaker inteligente para casos em que o fragmento do carregador de dados tem entradas, máscaras e rótulos.
from typing import Any from smart_sifting.data_model.data_model_interface import SiftingBatchTransform from smart_sifting.data_model.tensor_batch import TensorBatch classTensorBatchTransform(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
Depois de criar uma classe de transformação em lote implementada com
SiftingBatchTransform, use essa classe na etapa 4 para configurar a classeSiftingDataloader. O restante deste guia pressupõe que uma classeListBatchTransformfoi criada. Na etapa 4, essa classe é passada para obatch_transforms. -
-
-
Crie uma classe para implementar a interface de peneiramento SageMaker
Lossinteligente. Este tutorial pressupõe que a classe tenha um nomeSiftingImplementedLoss. Ao configurar essa classe, recomendamos que você use a mesma função de perda no loop de treinamento de modelo. Siga as subetapas a seguir para criar uma classe implementada de peneiramento SageMakerLossinteligente.-
SageMaker a peneiração inteligente calcula um valor de perda para cada amostra de dados de treinamento, em vez de calcular um único valor de perda para um lote. Para garantir que a peneiração SageMaker inteligente use a mesma lógica de cálculo de perda, crie uma função de smart-sifting-implemented perda usando o
Lossmódulo de peneiração SageMaker inteligente que usa sua função de perda e calcula a perda por amostra de treinamento.dica
SageMaker o algoritmo de peneiramento inteligente é executado em todas as amostras de dados, não no lote inteiro, portanto, você deve adicionar uma função de inicialização para definir a função de PyTorch perda sem nenhuma estratégia de redução.
classSiftingImplementedLoss(Loss): def __init__(self): self.loss =torch.nn.CrossEntropyLoss(reduction='none')Isso também é mostrado no exemplo de código a seguir.
-
Defina uma função de perda que aceite
original_batch(outransformed_batchse você tiver configurado uma transformação em lote na etapa 2) e o PyTorch modelo. Usando a função de perda especificada sem redução, a peneiração SageMaker inteligente executa uma passagem direta para cada amostra de dados para avaliar seu valor de perda.
O código a seguir é um exemplo de uma smart-sifting-implemented
Lossinterface chamadaSiftingImplementedLoss.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 classSiftingImplementedLoss(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])Antes que o ciclo de treinamento o avanço direto real, esse cálculo de perda por seleção é feito durante a fase de carregamento de dados de busca de um lote em cada iteração. O valor da perda individual é então comparado aos valores de perda anteriores e seu percentil relativo é estimado de acordo com o objeto
RelativeProbabilisticSiftConfigque você configurou na etapa 1. -
-
Envolva o carregador de PyTroch dados de acordo com a
SiftingDataloaderclasse de SageMaker IA.Por fim, use todas as classes implementadas de peneiramento SageMaker inteligente que você configurou nas etapas anteriores da classe de
SiftingDataloderconfiguração de SageMaker IA. Esta classe é um invólucro para PyTorchDataLoader. Ao empacotar PyTorch DataLoader, a peneiração SageMaker inteligente é registrada para ser executada como parte do carregamento de dados em cada iteração de um trabalho de treinamento. PyTorch O exemplo de código a seguir demonstra a implementação da filtragem de dados de SageMaker IA em um. PyTorchDataLoaderfrom 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)