翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
SageMaker Training Compiler のトラブルシューティング
重要
Amazon Web Services (AWS) は、 SageMaker Training Compiler の新しいリリースやバージョンがないことを発表しました。Training Compiler は、既存の SageMaker AWS トレーニング用 Deep Learning Containers (DLCs) を通じて引き続き利用できます SageMaker 。既存の DLCsは引き続きアクセス可能ですが、 AWS Deep Learning Containers Framework サポートポリシー に従って AWS、 からパッチや更新プログラムを受信しなくなることに注意してください。
エラーが発生した場合は、次のリストを使用してトレーニングジョブのトラブルシュートを試みることができます。さらにサポートが必要な場合は、Amazon の AWS サポート
ネイティブフレームワークのトレーニングジョブと比較するとトレーニングジョブが期待どおりに収束しない
収束の問題は、 SageMaker 「Training Compiler がオンになっているときにモデルが学習しない」から「モデルは学習しているが、ネイティブフレームワークよりも遅い」までさまざまです。このトラブルシューティングガイドでは、 SageMaker Training Compiler (ネイティブフレームワーク内) を使用せずにコンバージェンスに問題がないと仮定し、これをベースラインと見なします。
このような収束の問題に直面した場合、最初のステップは、問題が分散トレーニングに限定されているか、単一GPUトレーニングに起因するかを特定することです。 SageMaker Training Compiler による分散トレーニングは、追加のステップを含む単一GPUトレーニングの拡張機能です。
-
複数のインスタンスまたは を使用してクラスターをセットアップしますGPUs。
-
入力データをすべてのワーカーに分散します。
-
すべてのワーカーからのモデル更新を同期します。
したがって、単一GPUトレーニングにおける収束の問題は、複数のワーカーによる分散トレーニングに反映されます。
単一GPUトレーニングで発生する収束の問題
収束の問題が単一GPUトレーニングに起因する場合は、ハイパーパラメータまたは torch_xla
の設定が不適切であることが原因である可能性がありますAPIs。
ハイパーパラメータのチェック
Training Compiler で SageMaker トレーニングすると、モデルのメモリフットプリントが変わります。コンパイラは再利用と再計算をインテリジェントに処理し、それに応じてメモリ消費量を増減させます。これを活用するには、トレーニングジョブを SageMaker Training Compiler に移行するときに、バッチサイズと関連するハイパーパラメータを再調整することが重要です。ただし、ハイパーパラメータの設定が正しくないと、トレーニング損失が振動し、結果として収束が遅くなることがよくあります。まれに、アグレッシブなハイパーパラメータの場合、モデルが学習しなくなる (トレーニング損失メトリクスが減少しない、または NaN
を返さない) ことがあります。収束の問題がハイパーパラメータによるものかどうかを確認するには、すべてのハイパーパラメータを同じまま、Training Compiler の有無にかかわらず、2 つの SageMaker トレーニングジョブの side-by-side テストを実行します。
が単一GPUトレーニング用に適切に設定torch_xla
APIsされているかどうかを確認します。
ベースラインのハイパーパラメータで収束の問題が解決しない場合は、 torch_xla
の不適切な使用APIs、特にモデルを更新するための不適切な使用がないかどうかを確認する必要があります。基本的に、torch_xla
は、蓄積されたグラフを実行するように明示的に指示されるまで、命令をグラフ形式で蓄積し続けます (実行を延期)。torch_xla.core.xla_model.mark_step()
関数は蓄積されたグラフの実行を容易にします。モデルを更新するたびに、変数を印刷してログ記録する前に、この関数を使用してグラフの実行を同期する必要があります。同期ステップがないと、モデルは反復やモデル更新のたびに同期する必要のある最新の値を使用する代わりに、印刷、ログ、およびその後の前方パスの間、メモリ内の古い値を使用する可能性があります。
SageMaker Training Compiler を勾配スケーリング (おそらく の使用によるAMP) または勾配クリッピング手法で使用すると、より複雑になる可能性があります。を使用した勾配計算の適切な順序AMPは次のとおりです。
-
スケーリングによるグラデーション計算
-
グラデーションのスケーリング解除、勾配クリッピング、そしてスケーリング
-
モデルの更新
-
mark_step()
によるグラフ実行の同期
リストに記載されているオペレーションAPIsに適したものを見つけるには、トレーニングスクリプトを SageMaker Training Compiler に移行するためのガイドを参照してください。
自動モデルチューニングの使用の検討
SageMaker Training Compiler の使用中にバッチサイズおよび学習速度などの関連するハイパーパラメータを再調整するときに収束の問題が発生した場合は、自動モデルチューニングを使用してハイパーパラメータを調整することを検討してください。 SageMaker Training Compiler を使用したハイパーパラメータのチューニングに関するサンプルノートブック
分散トレーニングで発生する収束の問題
分散トレーニングで収束の問題が解決しない場合は、重みの初期化または torch_xla
の設定が不適切である可能性がありますAPIs。
ワーカー全体のウェイトの初期化の確認
複数のワーカーで分散トレーニングジョブを実行しているときに収束の問題が発生する場合、該当する場合は定数のシードを設定して、すべてのワーカーで均一な確定的動作が行われるようにします。重みの初期化など、ランダム化を伴うテクニックには注意します。シードが定数でないと、各ワーカーは異なるモデルをトレーニングすることになる可能性があります。
が分散トレーニング用に適切に設定torch_xla
APIsされているかどうかを確認します。
それでも問題が解決しない場合は、分散トレーニングtorch_xla
APIsに を不適切に使用している可能性があります。Training SageMaker Compiler で分散トレーニング用のクラスターを設定するには、推定器に以下を追加してください。
distribution={'torchxla': {'enabled': True}}
この場合、トレーニングスクリプト内に 1 つのワーカーにつき 1 回呼び出される関数 _mp_fn(index)
を追加する必要があります。mp_fn(index)
関数がないと、モデルの更新を共有することなく、各ワーカーに個別にモデルをトレーニングさせてしまうことになります。
次に、次の例のように、トレーニングスクリプトを SageMaker Training Compiler に移行するためのドキュメントで説明されているように、 を分散データサンプラtorch_xla.distributed.parallel_loader.MpDeviceLoader
APIーと一緒に使用してください。
torch.utils.data.distributed.DistributedSampler()
これにより、入力データがすべてのワーカーに適切に分散されます。
最後に、すべてのワーカーからのモデル更新を同期するには、torch_xla.core.xla_model._fetch_gradients
を使用してすべてのワーカーから勾配を収集し、torch_xla.core.xla_model.all_reduce
を使用して収集したすべての勾配を 1 つの更新にまとめます。
SageMaker Training Compiler を勾配スケーリング (おそらく の使用によるAMP) または勾配クリッピング手法で使用すると、より複雑になる可能性があります。を使用した勾配計算の適切な順序AMPは次のとおりです。
-
スケーリングによるグラデーション計算
-
すべてのワーカー間のグラデーション同期
-
グラデーションのスケーリング解除、勾配クリッピング、そしてグラデーションスケーリング
-
モデルの更新
-
mark_step()
によるグラフ実行の同期
このチェックリストには、単一GPUトレーニングのチェックリストと比較して、すべてのワーカーを同期するための追加項目があることに注意してください。
PyTorch/XLA 設定がないためにトレーニングジョブが失敗する
トレーニングジョブがMissing XLA configuration
エラーメッセージで失敗した場合、使用するインスタンスGPUsごとの 数の設定ミスが原因である可能性があります。
XLA では、トレーニングジョブをコンパイルするために追加の環境変数が必要です。最も一般的な欠落している環境変数は GPU_NUM_DEVICES
です。コンパイラが正しく動作するには、この環境変数をインスタンスGPUsあたりの の数と等しく設定する必要があります。
GPU_NUM_DEVICES
環境変数を設定するには 3 つの方法があります。
-
アプローチ 1 — SageMaker 推定器クラスの
environment
引数を使用します。例えば、4 つの を持つml.p3.8xlarge
インスタンスを使用する場合はGPUs、次の操作を行います。# Using the SageMaker Python SDK's HuggingFace estimator hf_estimator=HuggingFace( ... instance_type="
ml.p3.8xlarge
", hyperparameters={...}, environment={ ... "GPU_NUM_DEVICES": "4
" # corresponds to number of GPUs on the specified instance }, ) -
アプローチ 2 – SageMaker 推定器クラスの
hyperparameters
引数を使用して、トレーニングスクリプトで解析します。-
の数を指定するにはGPUs、
hyperparameters
引数にキーと値のペアを追加します。例えば、4 つの を持つ
ml.p3.8xlarge
インスタンスを使用する場合はGPUs、次の操作を行います。# Using the SageMaker Python SDK's HuggingFace estimator hf_estimator=HuggingFace( ... entry_point = "
train.py
" instance_type= "ml.p3.8xlarge
", hyperparameters = { ... "n_gpus":4
# corresponds to number of GPUs on specified instance } ) hf_estimator.fit() -
トレーニングスクリプトで、
n_gpus
ハイパーパラメータを解析し、GPU_NUM_DEVICES
環境変数の入力として指定します。# train.py import os, argparse if __name__ == "__main__": parser = argparse.ArgumentParser() ... # Data, model, and output directories parser.add_argument("--output_data_dir", type=str, default=os.environ["SM_OUTPUT_DATA_DIR"]) parser.add_argument("--model_dir", type=str, default=os.environ["SM_MODEL_DIR"]) parser.add_argument("--training_dir", type=str, default=os.environ["SM_CHANNEL_TRAIN"]) parser.add_argument("--test_dir", type=str, default=os.environ["SM_CHANNEL_TEST"]) parser.add_argument("--n_gpus", type=str, default=os.environ["SM_NUM_GPUS"]) args, _ = parser.parse_known_args() os.environ["GPU_NUM_DEVICES"] = args.n_gpus
-
-
アプローチ 3 — トレーニングスクリプトに
GPU_NUM_DEVICES
環境変数をハードコードします。例えば、4 つの を持つインスタンスを使用する場合は、スクリプトに以下を追加しますGPUs。# train.py import os os.environ["GPU_NUM_DEVICES"] =
4
ヒント
使用する機械学習インスタンス上のGPUデバイスの数を確認するには、「Amazon EC2 インスタンスタイプ」ページの「高速コンピューティング
SageMaker Training Compiler は合計トレーニング時間を短縮しません
SageMaker Training Compiler で合計トレーニング時間が短縮されない場合は、SageMaker Training Compiler のベストプラクティスと考慮事項ページを参照してトレーニング設定、入力テンソル形状のパディング戦略、ハイパーパラメータを確認することをお勧めします。