モデル並列のトラブルシューティング - Amazon SageMaker

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

モデル並列のトラブルシューティング

エラーが発生した場合は、次のリストを使用してトレーニングジョブのトラブルシュートを試みることができます。問題が解決しない場合は、AWS サポートまでお問い合わせください。

SageMaker モデル並列処理ライブラリでデバッガーを使用する際 SageMakerの考慮事項

SageMaker デバッガーは SageMaker モデル並列処理ライブラリでは使用できません。デバッガーは、すべての SageMaker TensorFlow および PyTorch トレーニングジョブでデフォルトで有効になっており、次のようなエラーが表示されることがあります。

FileNotFoundError: [Errno 2] No such file or directory: '/opt/ml/checkpoints/metadata.json.sagemaker-uploading

この問題を解決するには、次の例に示すように、フレームワーク estimator を作成するときに debugger_hook_config=False を渡すことで、デバッガーを無効にします。

bucket=sagemaker.Session().default_bucket() base_job_name="sagemaker-checkpoint-test" checkpoint_in_bucket="checkpoints" # The S3 URI to store the checkpoints checkpoint_s3_bucket="s3://{}/{}/{}".format(bucket, base_job_name, checkpoint_in_bucket) estimator = TensorFlow( ... distribution={"smdistributed": {"modelparallel": { "enabled": True }}}, checkpoint_s3_uri=checkpoint_s3_bucket, checkpoint_local_path="/opt/ml/checkpoints", debugger_hook_config=False )

チェックポイントを保存する

で大規模モデルのチェックポイントを保存するときに、次のエラーが発生することがあります SageMaker。

InternalServerError: We encountered an internal error. Please try again

これは、トレーニング中にローカルチェックポイントを Amazon S3 にアップロードする際の SageMaker 制限が原因である可能性があります。でチェックポイントを無効にするには SageMaker、次の例を使用してチェックポイントを明示的にアップロードします。

前述のエラーが発生した場合は、 呼び出しcheckpoint_s3_uri SageMaker estimatorで を使用しないでください。大規模モデルのチェックポイントを保存するときは、カスタムディレクトリにチェックポイントを保存し、同じものをヘルパー関数に (local_path 引数として) 渡すことをお勧めします。

import os def aws_s3_sync(source, destination): """aws s3 sync in quiet mode and time profile""" import time, subprocess cmd = ["aws", "s3", "sync", "--quiet", source, destination] print(f"Syncing files from {source} to {destination}") start_time = time.time() p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) p.wait() end_time = time.time() print("Time Taken to Sync: ", (end_time-start_time)) return def sync_local_checkpoints_to_s3(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from local path to s3 """ import boto3 #check if local path exists if not os.path.exists(local_path): raise RuntimeError("Provided local path {local_path} does not exist. Please check") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(local_path, s3_uri) return def sync_s3_checkpoints_to_local(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from s3 to local path """ import boto3 #try to create local path if it does not exist if not os.path.exists(local_path): print(f"Provided local path {local_path} does not exist. Creating...") try: os.makedirs(local_path) except Exception as e: raise RuntimeError(f"Failed to create {local_path}") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(s3_uri, local_path) return

ヘルパー関数の使い方:

#base_s3_uri - user input s3 uri or save to model directory (default) #curr_host - to save checkpoints of current host #iteration - current step/epoch during which checkpoint is saved # save checkpoints on every node using local_rank if smp.local_rank() == 0: base_s3_uri = os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', ''))) curr_host = os.environ['SM_CURRENT_HOST'] full_s3_uri = f'{base_s3_uri}/checkpoints/{curr_host}/{iteration}' sync_local_checkpoints_to_s3(local_path=checkpoint_dir, s3_uri=full_s3_uri)

モデル並列と を使用した収束 TensorFlow

TensorFlow とモデル並列処理ライブラリで SageMaker マルチノードトレーニングを使用すると、トレーニング入力ファイルの順序がノードごとに異なる可能性があるため、損失が予想どおりに収束しない可能性があります。これにより、同じモデル並列グループ内の異なるランクが異なる入力ファイルを処理することになり、不整合を生む可能性があります。これを防ぐには、入力ファイルが TensorFlow データセットに変換される前に、すべてのランクで同じ順序になっていることを確認してください。これを実現する 1 つの方法は、トレーニングスクリプトで入力ファイル名を並べ替えることです。

分散トレーニングジョブの停止またはクラッシュ

トレーニングジョブに停止、クラッシュ、または応答しないなどの問題がある場合は、以下のトラブルシューティング項目を読んで、問題の原因を特定してください。さらにサポートが必要な場合は、 AWS サポートを通じて SageMaker 分散トレーニングチームに連絡してください。

  • NCCL の初期化ステップで分散トレーニングジョブが停止する場合は、次の点を考慮してください。

    • カスタム VPC とそのサブネットで EFA 対応インスタンス (ml.p4d または ml.p3dn インスタンス) のいずれかを使用している場合は、使用するセキュリティグループに、同じ SG との間のすべてのポートに対するインバウンドおよびアウトバウンド接続があることを確認してください。また、通常は (インターネットアクセスのための) 別のルールとして、任意の IP へのアウトバウンド接続が必要です。EFA 通信のインバウンドルールとアウトバウンドルールを追加する方法については、「SageMaker 初期化中の分散トレーニングジョブの停止」を参照してください。

  • モデル全体をチェックポイントしているときに分散トレーニングジョブが停止する場合は、モデルまたはオプティマイザの state_dict() 呼び出しが rdp_rank()==0 (テンソル並列処理を使用している場合) または dp_rank()==0 (パイプライン並列処理のみを使用している場合) のすべてのランクで実行されなかったことが原因である可能性があります。これらのランクは、保存するチェックポイントを構築するために通信する必要があります。shard_optimizer_state が有効になっている場合、部分オプティマイザをチェックポイントする時にも同様の停止が発生する可能性があります。

    モデル並列処理によるモデルのチェックポイント設定の詳細については、「General Instruction for Saving and Loading」および「分散 PyTorch モデルのチェックポイント (v1.6.0 から v1.9.0 までの SageMaker モデル並列処理ライブラリ用)」を参照してください。

  • CUDA メモリ不足エラーでトレーニングジョブがクラッシュした場合、GPU クラスター上のモデルに合うように分散トレーニング設定を調整する必要があるということです。詳細およびベストプラクティスについては、「特定のモデルに適切な設定をする」を参照してください。

  • トレーニングジョブが修正不可能な ECC エラーでクラッシュした場合、クラスター内の GPU の 1 つに障害が発生していることを意味します。テクニカルサポートが必要な場合は、ジョブ ARN を AWS チームと共有し、可能であればチェックポイントからトレーニングジョブを再開してください。

  • まれに、以前に機能していたジョブ設定が GPU メモリの制限に近いと、後で CUDA メモリ不足エラーのために別のクラスターを発生して失敗することがあります。これは、ECC エラーのため、一部の GPU の利用可能なメモリが通常よりも少なくなっていることが原因と考えられます。

  • ノード内のすべての GPU を使用しないマルチノードジョブを実行すると、ネットワークタイムアウトクラッシュが発生することがあります。これを回避するには、processes_per_host パラメータが各インスタンスの GPU の数に設定されていることを確認して、ノード上のすべての GPU を使用してください。例えば、ml.p3.16xlargeml.p3dn.24xlarge および ml.p4d.24xlarge インスタンス用の processes_per_host=8 です。

  • データのダウンロード段階でトレーニングジョブに長い時間がかかる場合は、 クラスcheckpoint_s3_uriに SageMaker Estimator指定した Amazon S3 パスが現在のトレーニングジョブに対して一意であることを確認してください。同時に実行する複数のトレーニングジョブでこのパスを再利用すると、すべてのチェックポイントが同じ Amazon S3 パスにアップロードおよびダウンロードされるため、チェックポイントのロード時間が大幅に長くなる可能性があります。

  • 大規模なデータやモデルを扱う場合は、FSx for Lustre を使用してください。

    • データセットが大きく、取得に時間がかかる場合は、データセットを FSx for Lustre に保存することをお勧めします。

    • トレーニングモデルのパラメータが 100 億を超える場合は、チェックポイントに FSx for Lustre を使用することをお勧めします。

    • ファイルシステムを作成したら、ステータスが使用可能になるのを待ってから、そのファイルシステムを使用してトレーニングジョブを開始してください。

PyTorch トレーニングジョブの NCCL エラーの受信

次のエラーが発生した場合は、プロセスの GPU メモリ不足が原因である可能性があります。

NCCL error in: ../torch/lib/c10d/ProcessGroupNCCL.cpp:825, unhandled system error, NCCL version 2.7.8 ncclSystemError: System call (socket, malloc, munmap, etc) failed.

この問題は、バッチサイズを小さくするか active_microbatches で解決できます。自動パーティショニングによってバランスの取れたパーティショニングが得られない場合は、手動パーティショニングを検討する必要があるかもしれません。詳細については、「ノード間でのパイプラインの並列処理」を参照してください。

PyTorch トレーニングジョブRecursionErrorの受信

ライブラリは、モジュールの転送呼び出し内での super.forward() の呼び出しをサポートしていません。super.forward() を使用する場合、次のエラーメッセージが表示されることがあります。

RecursionError: maximum recursion depth exceeded

このエラーを修正するには、super.forward() を呼び出す代わりに super()._orig_forward() を呼び出す必要があります。