「Amazon SageMakerスマートシフティングを使用して、ディープラーニングモデルのトレーニングを最大35%高速化」
「Amazon SageMakerスマートシフティングでディープラーニングモデルのトレーニングを最大35%高速化!」
人工知能の急速な進化の中で、深層学習モデルは革新の最前線に位置しており、コンピュータビジョン(CV)、自然言語処理(NLP)、および推薦システムを含むさまざまなアプリケーションで使用されています。しかし、これらのモデルのトレーニングと微調整にかかるコストの増加は、企業にとって課題となっています。このコストは、深層学習モデルのトレーニングに使用されるデータの量の増加に主に起因しています。現在、大規模なモデルはしばしばテラバイト単位のデータでトレーニングされ、強力なGPUまたはAWS Trainiumベースのハードウェアでも数週間かかることがあります。通常、顧客は、最適化されたカーネルやレイヤー、混合精度トレーニングなど、モデルのトレーニングループの効率を改善するための技術や最適化に頼ることがあります。また、Amazon SageMakerの分散トレーニングライブラリのような機能も利用されます。しかし、現在の注目はトレーニングデータそのものの効率には向けられていません。モデルのトレーニング中に、すべてのデータが同じくらい貢献するわけではありません。計算リソースの多くが、モデルの全体的な精度にほとんど貢献しない単純な例の処理に費やされることもあります。
顧客は従来、アップサンプリングやダウンサンプリング、重複排除などの前処理技術を使用してデータの品質を高めることに頼ってきました。これらの技術は役立つことがありますが、時間がかかることや専門的なデータサイエンスの知識が必要なこと、そして科学よりも芸術の要素が強いことがあります。顧客は、モデルのパフォーマンスを向上させるために、RefinedWebのようなキュレートされたデータセットも使用しますが、これらのデータセットは完全にオープンソースではなく、一般的な用途に特化しており、特定のユースケースに関連するものではありません。
モデルのトレーニング中に低情報なデータサンプルに関連する効率の低さをどのように克服できるでしょうか?
私たちは、モデルのトレーニングコストを最大35%削減できるSageMakerのスマートサイフティングのパブリックプレビューを発表できることをうれしく思います。スマートサイフティングは、トレーニング中にデータサンプルを分析し、モデルにとって情報価値の低いサンプルをフィルタリングする新しいデータ効率化技術です。モデルの収束に最も貢献するサンプルのみを含むより小さなデータサブセットでトレーニングすることにより、総合的なトレーニング時間とコストを最小限に抑えることができます。また、この機能はモデルのトレーニング中にオンラインで動作するため、アップストリームデータやダウンストリームトレーニングパイプラインの変更は必要ありません。
- 「GPT-4V(ビジョン)のコンセプトを理解する:新しい人工知能のトレンド」
- 聴覚処理の解読:深層学習モデルが脳内の音声認識とどのように類似しているか
- 新しいツールと機能の発表:責任あるAIイノベーションを可能にする
本ポストでは、以下のトピックについて説明します。
- 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_value
とloss_history_length
が含まれます。これらはそれぞれ、保持するサンプルの比例と相対損失を評価するときに含めるサンプルの範囲を定義します。スマートシフティングは、サンプルの重要性の定義にモデルを使用するため、完全にランダムな重みを持つモデルを使用する場合には負の影響がある可能性があります。その代わりに、loss_based_sift_config
とsift_delay
を使用して、モデルのパラメータの重みがランダムな値を超えて更新されるまで、シフトプロセスを遅延させることができます。 (詳細については、トレーニングスクリプトにスマートシフティングを適用するを参照してください)。以下のコードでは、sift_config
を定義し、beta_value
とloss_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!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Amazon SageMakerノートブックのジョブをスケジュールし、APIを使用してマルチステップノートブックのワークフローを管理します
- AWS ジェネラティブ AI イノベーションセンターのアンソロポジック・クロード向けのカスタムモデルプログラムをご紹介します
- GPUマシンの構築 vs GPUクラウドの利用
- 「OpenAIモデルに対するオープンソースの代替手段の探索」
- 「Bingチャットは、最新のリアルタイムな知識を提供する点でChatGPTを上回るのか? 検索補完強化ジェネレーション(RAG)によるご紹介」
- インフレクション-2はGoogleのPaLM-2を超える:AI言語モデルのブレークスルー
- 「AIシステムのリスク評価方法を学びましょう」