Hugging Face Transformers スクリプトに SageMaker スマートふるいを適用する - Amazon SageMaker

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Hugging Face Transformers スクリプトに SageMaker スマートふるいを適用する

SageMaker スマートふるいを Transformers Trainer クラスに実装するには、2 つの方法があります。

注記

SageMaker スマートふるい分けパッケージがインストールされている のいずれか PyTorch の DLCs for を使用する場合は、transformersライブラリをインストールする必要があることに注意してください。 SageMaker Python の PyTorch (sagemaker.pytorch.PyTorch) のトレーニングジョブランチャークラスrequirements.txtを拡張DLCsまたは渡すことで、追加のパッケージをインストールできますSDK。

シンプルなセットアップ

Transformers Trainer クラスに SageMaker スマートふるいを実装する最も簡単な方法は、 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 はmax_stepsトレーニング引数 Trainer期待します。この引数はエポック設定パラメータ をオーバーライドすることに注意してくださいnum_train_epochs。元のデータローダーもイテラブルであった場合、またはトレーニングで max_steps と 1 つのエポックが使用されていた場合、 は既存のデータローダーと同じこと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 引数によって提供されるエポックの数を使用してエポックでのトレーニングが可能になり、 は最大システム整数max_stepsに設定され、指定されたエポックが完了するまでトレーニングが進行できるようになります。

カスタムセットアップ

SageMaker スマートふるい分けデータローダーのカスタム統合には、カスタム Hugging Face Trainer クラスを使用できます。の任意のサブクラス内でTrainerget_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()