本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將 SageMaker 智慧篩分套用至 Hugging Face Transformer 指令碼
有兩種方法可以實作 SageMaker 智慧篩選至轉換器Trainer
類別。
注意
如果您使用其中一個 DLCs PyTorch 搭配已安裝 SageMaker 智慧型篩選套件的 ,請注意您需要安裝程式transformers
庫。您可以在 SageMaker Python 中為 PyTorch (sagemaker.pytorch.PyTorch
requirements.txt
訓練任務啟動器類別,以安裝其他套件SDK。
簡單設定
將 SageMaker 智慧篩分實作至轉換器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
訓練引數 num_train_epochs
。如果您的原始資料載入器也可以迭代,或您的訓練使用 max_steps
和單一 epoch,則 會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_train_epochs 引數提供的 epochs 數目來啟用 epochsmax_steps
設定為最大系統整數,讓訓練能夠持續進行,直到指定的 epoch 完成為止。
自訂設定
若要自訂整合 SageMaker 智慧篩選資料載入器,您可以使用自訂 Hugging Face Trainer
類別。在任何 子類別內Trainer
,get_train_dataloader()
函數都可以覆寫,以改為傳回SiftingDataloader
類別的物件。對於具有現有自訂訓練台的案例,此方法可能較不具侵入性,但需要變更程式碼,而非簡單的設定選項。以下是 SageMaker 智慧篩選成自訂 Hugging Face Trainer
類別的範例實作。
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 classSiftingImplementedLoss
(): # 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]) classSiftingImplementedTrainer
(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()