「Amazon SageMakerスマートシフティングを使用して、ディープラーニングモデルのトレーニングを最大35%高速化」

「Amazon SageMakerスマートシフティングでディープラーニングモデルのトレーニングを最大35%高速化!」

人工知能の急速な進化の中で、深層学習モデルは革新の最前線に位置しており、コンピュータビジョン(CV)、自然言語処理(NLP)、および推薦システムを含むさまざまなアプリケーションで使用されています。しかし、これらのモデルのトレーニングと微調整にかかるコストの増加は、企業にとって課題となっています。このコストは、深層学習モデルのトレーニングに使用されるデータの量の増加に主に起因しています。現在、大規模なモデルはしばしばテラバイト単位のデータでトレーニングされ、強力なGPUまたはAWS Trainiumベースのハードウェアでも数週間かかることがあります。通常、顧客は、最適化されたカーネルやレイヤー、混合精度トレーニングなど、モデルのトレーニングループの効率を改善するための技術や最適化に頼ることがあります。また、Amazon SageMakerの分散トレーニングライブラリのような機能も利用されます。しかし、現在の注目はトレーニングデータそのものの効率には向けられていません。モデルのトレーニング中に、すべてのデータが同じくらい貢献するわけではありません。計算リソースの多くが、モデルの全体的な精度にほとんど貢献しない単純な例の処理に費やされることもあります。

顧客は従来、アップサンプリングやダウンサンプリング、重複排除などの前処理技術を使用してデータの品質を高めることに頼ってきました。これらの技術は役立つことがありますが、時間がかかることや専門的なデータサイエンスの知識が必要なこと、そして科学よりも芸術の要素が強いことがあります。顧客は、モデルのパフォーマンスを向上させるために、RefinedWebのようなキュレートされたデータセットも使用しますが、これらのデータセットは完全にオープンソースではなく、一般的な用途に特化しており、特定のユースケースに関連するものではありません。

モデルのトレーニング中に低情報なデータサンプルに関連する効率の低さをどのように克服できるでしょうか?

私たちは、モデルのトレーニングコストを最大35%削減できるSageMakerのスマートサイフティングのパブリックプレビューを発表できることをうれしく思います。スマートサイフティングは、トレーニング中にデータサンプルを分析し、モデルにとって情報価値の低いサンプルをフィルタリングする新しいデータ効率化技術です。モデルの収束に最も貢献するサンプルのみを含むより小さなデータサブセットでトレーニングすることにより、総合的なトレーニング時間とコストを最小限に抑えることができます。また、この機能はモデルのトレーニング中にオンラインで動作するため、アップストリームデータやダウンストリームトレーニングパイプラインの変更は必要ありません。

本ポストでは、以下のトピックについて説明します。

  • SageMakerの新しいスマートサイフティング機能とその動作方法
  • PyTorchトレーニングワークロードでのスマートサイフティングの使用方法

さらに、スマートサイフティングの始め方に関する詳細なリソースについては、ドキュメントサンプルノートブックもご覧ください。

SageMakerのスマートサイフティングの動作方法

本ポストでは、SageMakerでモデルのトレーニングを高速化するスマートサイフティング機能の概要から始めます。

スマートサイフティングのタスクは、トレーニングデータをトレーニングプロセス中に選別し、モデルに情報価値の高いサンプルのみを供給することです。通常、PyTorchのトレーニングでは、データはバッチごとにトレーニングループとアクセラレータデバイス(例:GPUまたはTrainiumチップ)にイテレーションごとに送信されます。スマートサイフティングは、このデータロード段階で実装されるため、トレーニングパイプラインのアップストリームのデータ前処理には依存しません。

スマートサイフティングは、モデルとユーザー指定の損失関数を使用して、データサンプルごとに評価的なフォワードパスを実行します。損失が大きいサンプルはモデルのトレーニングに実質的な影響を与えるため、トレーニングに使用されます。比較的損失の低いデータサンプルは一時的に除外され、トレーニングには使用されません。

スマートサイフティングの重要な入力は、除外するデータの割合です。たとえば、割合を33%(beta_value=0.5)に設定すると、各バッチの損失の下位三分の一程度のサンプルがトレーニングから除外されます。十分な損失の大きいサンプルが特定され、バッチが完了すると、データは完全なトレーニングループを通じて送信され、モデルが通常どおり学習とトレーニングを行います。スマートサイフティングが有効になっている場合、トレーニングループを変更する必要はありません。

次の図は、このワークフローを示しています。

スマートシフティングを使用することで、トレーニングモデルの学習に必要な時間と計算量を削減することができます。私たちのテストでは、総合的なトレーニング時間とコストを約40%削減することができました。データのスマートシフティングにより、除外されたサンプルがモデルにとって比較的低損失であるため、モデルの精度には最小限またはほとんど影響がない場合があります。以下の表では、SageMakerスマートシフティングを使用したパフォーマンスの改善が可能であることを示す一連の実験結果を示しています。

表の「%受入列」は、トレーニングループに含まれるデータの割合を示しています。このチューニング可能なパラメータを増やすと、コストが減少しますが、精度にも影響を与える可能性があります。「%受入」の適切な設定は、データセットとモデルの関数です。このパラメータを調整して、コストを減らし、精度への影響を最小限に抑えるための最適なバランスを見つけるために実験してください。

ソリューションの概要

次のセクションでは、SageMaker上でPyTorchトレーニングジョブでスマートシフティングを有効にする具体的な例を説明します。すぐに始めたい場合は、PyTorchまたはPyTorch Lightningの例に移動することができます。

前提条件

PyTorchまたはPyTorch Lightningを使用したモデルのトレーニング方法、SageMaker Python SDKとEstimatorクラスを使用したトレーニングの方法について既に理解していることを前提としています。そうでない場合は、続行する前にSageMaker Python SDKの使用を参照してください。

SageMakerスマートシフティングの始め方

通常のPyTorchトレーニングジョブでは、PyTorchトレーニングDataLoaderをデータセットやその他の必要なパラメータと共に初期化し、トレーニングの進行に応じて入力バッチを提供します。トレーニングデータのスマートシフティングを有効にするには、新しいDataLoaderクラスであるsmart_sifting.dataloader.sift_dataloader.SiftingDataloaderを使用します。このクラスは、既存のPyTorchのDataLoaderの上にラッパーとして使用され、トレーニングプロセスでは代わりにSiftingDataloaderを使用して入力バッチを取得します。SiftingDataLoaderは、元のPyTorchのDataLoaderから入力バッチを取得し、バッチ内のサンプルの重要性を評価し、ハイロスのサンプルを含む振り分けられたバッチを作成し、それをトレーニングステップに渡します。ラッパーは以下のコードのようになります:

from smart_sifting.dataloader.sift_dataloader import SiftingDataloadertrain_dataloader =  SiftingDataloader(    sift_config = sift_config,    orig_dataloader=DataLoader(self.train, self.batch_size, shuffle=True),    loss_impl=BertLoss(),    model=self.model)

SiftingDataloaderには、トレーニングデータを分析するためのいくつかの追加のパラメータが必要です。これらのパラメータはsift_configパラメータを介して指定できます。まず、smart_sifting.sift_config.sift_configs.RelativeProbabilisticSiftConfigオブジェクトを作成します。このオブジェクトには、設定可能なbeta_valueloss_history_lengthが含まれます。これらはそれぞれ、保持するサンプルの比例と相対損失を評価するときに含めるサンプルの範囲を定義します。スマートシフティングは、サンプルの重要性の定義にモデルを使用するため、完全にランダムな重みを持つモデルを使用する場合には負の影響がある可能性があります。その代わりに、loss_based_sift_configsift_delayを使用して、モデルのパラメータの重みがランダムな値を超えて更新されるまで、シフトプロセスを遅延させることができます。 (詳細については、トレーニングスクリプトにスマートシフティングを適用するを参照してください)。以下のコードでは、sift_configを定義し、beta_valueloss_history_lengthを指定し、またloss_based_sift_configを使用してシフトの開始を遅延させています:

from smart_sifting.sift_config.sift_configs import RelativeProbabilisticSiftConfig, LossConfig, SiftingBaseConfigsift_config = RelativeProbabilisticSiftConfig(    beta_value=3,    loss_history_length=500,    loss_based_sift_config=LossConfig(         sift_config=SiftingBaseConfig(sift_delay=10)    ))

次に、SiftingDataloaderオブジェクトにloss_implパラメータを追加する必要があります。スマートシフティングは個々のサンプルレベルで機能し、サンプルの重要性を判断するために損失計算方法にアクセスすることが重要です。通常、トレーニング中にmodelで使用する損失関数と同じ損失計算方法を指定します。最後に、トレーニングに含まれる前にサンプルを評価するためにSiftingDataloaderオブジェクトにモデルへのポインタを含めます。以下のコードを参照してください。

from smart_sifting.sift_config.sift_configs import RelativeProbabilisticSiftConfig, LossConfig, SiftingBaseConfig## Sift損失の定義class SiftBertLoss(Loss):    # サンプルごとの損失ではなくバッチごとの損失を計算するための以下の初期化関数を追加してください。    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]        # 損失を計算        outputs = model(batch)        return self.celoss(outputs.logits, batch[2])........train_dataloader =  SiftingDataloader(    sift_config = sift_config,    orig_dataloader=DataLoader(self.train, self.batch_size, shuffle=True),    loss_impl=SiftBertLoss(),    model=self.model)

以下のコードは既存のBERTトレーニングジョブでスマートシフティングを有効にする完全な例を示しています。

from smart_sifting.dataloader.sift_dataloader import SiftingDataloaderfrom smart_sifting.loss.abstract_sift_loss_module import Lossfrom smart_sifting.sift_config.sift_configs import RelativeProbabilisticSiftConfig, LossConfig, SiftingBaseConfig.........## Sift損失の定義class SiftBertLoss(Loss):    # サンプルごとの損失ではなくバッチごとの損失を計算するための以下の初期化関数を追加してください。    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]        # 損失を計算        outputs = model(batch)        return self.celoss(outputs.logits, batch[2])              .... .... ....  sift_config = RelativeProbabilisticSiftConfig(    beta_value=3,    loss_history_length=500,    loss_based_sift_config=LossConfig(        sift_config=SiftingBaseConfig(sift_delay=10)    ))train_dataloader =  SiftingDataloader(    sift_config = sift_config,    orig_dataloader=DataLoader(self.train, self.batch_size, shuffle=True),    loss_impl=SiftBertLoss(),    model=self.model)......# train_dataloaderを以降のトレーニングロジックで使用します。

結論

この記事では、SageMakerの公開プレビューであるスマートシフティングについてご紹介しました。スマートシフティングは、ディープラーニングモデルのトレーニングコストを最大35%削減することができる新機能です。この機能により、トレーニング中にデータ効率を改善し、情報量の少ないデータサンプルをフィルタリングします。モデルの収束に最も影響力のあるデータのみを含めることで、トレーニング時間と費用を大幅に削減することができます。さらに、既存のデータやトレーニングパイプラインを変更することなく、既存のプロセスにシームレスに統合できます。

SageMakerのスマートシフティングについてさらに詳しく学び、PyTorchのトレーニングワークロードで実装する方法については、ドキュメントサンプルノートブックを参照して、この新機能で始めてみてください。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

『トランスフォーマーの位置符号化の解説』

元のトランスフォーマーアーキテクチャでは、位置エンコーディングが入力と出力の埋め込みに追加されました位置エンコーディ...

機械学習

「ChatGPTは私たちを出し抜いているのか? チューリングテストの視点からの探求」

「機械は思考することができるのか?この記事は、チャットGPTの性能をチューリングテストが設定した厳しい基準に基づいて調査...

機械学習

「ウッドペッカーは、言語モデルにおけるAIの精度を革新している方法とは?」

中国の腾讯YouTu Labと中国科学技術大学(USTC)のAI研究者グループが、Multimodal Large Language Models(MLLM)の幻想問題...

データサイエンス

「ニューラルネットワークとディープラーニングの基礎の理解」

この記事は、ニューラルネットワークとディープラーニングの基礎について詳細な概要を提供することを目的としています

データサイエンス

コンテンツモデレーションからゼロショット分類へ

もし、追加情報や文脈がない小さなテキストを分析し、自分自身のデータを定義するために最も妥当なラベルを取得したい場合、...

人工知能

AIがDevSecOpsを再構築する3つの方法

開発者は、これらの3つのAI駆動のDevSecOpsトレンドを使用して、組織のセキュリティポスチャを評価することができます