

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

# モデル並列のトラブルシューティング
<a name="distributed-troubleshooting-model-parallel"></a>

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

**Topics**
+ [SageMaker モデル並列ライブラリでの SageMaker デバッガーの使用に関する考慮事項](#distributed-ts-model-parallel-debugger)
+ [チェックポイントを保存する](#distributed-ts-model-parallel-checkpoints)
+ [モデル並列と TensorFlow を使った収束](#distributed-ts-model-parallel-tf-convergence)
+ [分散トレーニングジョブの停止またはクラッシュ](#distributed-ts-model-parallel-training-issues)
+ [PyTorch トレーニングジョブの NCCL エラーの受信](#distributed-ts-model-parallel-nccl-error)
+ [PyTorch トレーニングジョブで `RecursionError` が発生する](#distributed-ts-model-parallel-super-forward-not-supported)

## SageMaker モデル並列ライブラリでの SageMaker デバッガーの使用に関する考慮事項
<a name="distributed-ts-model-parallel-debugger"></a>

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
)
```

## チェックポイントを保存する
<a name="distributed-ts-model-parallel-checkpoints"></a>

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

```
InternalServerError: We encountered an internal error. Please try again
```

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

上記のエラーが発生した場合は、SageMaker `estimator` 呼び出しと一緒に `checkpoint_s3_uri` を使わないでください。大規模モデルのチェックポイントを保存するときは、カスタムディレクトリにチェックポイントを保存し、同じものをヘルパー関数に (`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 を使った収束
<a name="distributed-ts-model-parallel-tf-convergence"></a>

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

## 分散トレーニングジョブの停止またはクラッシュ
<a name="distributed-ts-model-parallel-training-issues"></a>

トレーニングジョブに停止、クラッシュ、または応答しないなどの問題がある場合は、以下のトラブルシューティング項目を読んで、問題の原因を特定してください。さらにサポートが必要な場合は、[AWS サポート](https://aws.amazon.com/premiumsupport) を通して、SageMaker の分散トレーニングチームに連絡してください。
+  **NCCL の初期化ステップで分散トレーニングジョブが停止する**場合は、次の点を考慮してください。
  + カスタム VPC とそのサブネットで EFA 対応インスタンス (`ml.p4d` または `ml.p3dn` インスタンス) のいずれかを使用している場合は、使用するセキュリティグループに、同じ SG との間のすべてのポートに対するインバウンドおよびアウトバウンド接続があることを確認してください。また、通常は (インターネットアクセスのための) 別のルールとして、任意の IP へのアウトバウンド接続が必要です。EFA 通信のインバウンドルールとアウトバウンドルールを追加する方法については、「[SageMaker AI 分散トレーニングジョブが初期化中に停止する](distributed-troubleshooting-data-parallel.md#distributed-ts-data-parallel-efa-sg)」を参照してください。
+ モデル全体を**チェックポイントしているときに分散トレーニングジョブが停止する**場合は、モデルまたはオプティマイザの `state_dict()` 呼び出しが `rdp_rank()==0` (テンソル並列処理を使用している場合) または `dp_rank()==0` (パイプライン並列処理のみを使用している場合) のすべてのランクで実行されなかったことが原因である可能性があります。これらのランクは、保存するチェックポイントを構築するために通信する必要があります。`shard_optimizer_state` が有効になっている場合、部分オプティマイザをチェックポイントする時にも同様の停止が発生する可能性があります。

  モデル並列処理によるモデルのチェックポイント設定の詳細については、「[General Instruction for Saving and Loading](https://sagemaker.readthedocs.io/en/v2.199.0/api/training/smp_versions/latest/smd_model_parallel_pytorch.html#general-instruction-for-saving-and-loading)」および「[分散 PyTorch モデルのチェックポイント機能 (v1.6.0 から v1.9.0 の SageMaker モデル並列処理ライブラリ用)](distributed-model-parallel-checkpointing-and-finetuning.md#model-parallel-extended-features-pytorch-saving-loading-checkpoints)」を参照してください。
+ **CUDA メモリ不足エラー**でトレーニングジョブがクラッシュした場合、GPU クラスター上のモデルに合うように分散トレーニング設定を調整する必要があるということです。詳細およびベストプラクティスについては、「[特定のモデルに適切な設定をする](model-parallel-best-practices.md#model-parallel-best-practices-configuration)」を参照してください。
+ トレーニングジョブが**修正不可能な [ECC エラー](https://docs.nvidia.com/deploy/a100-gpu-mem-error-mgmt/index.html)**でクラッシュした場合、クラスター内の GPU の 1 つに障害が発生していることを意味します。テクニカルサポートが必要な場合は、ジョブ ARN を AWS チームと共有し、可能であればチェックポイントからトレーニングジョブを再開してください。
+ まれに、以前に機能していたジョブ設定が GPU メモリの制限に近いと、後で **CUDA メモリ不足エラー**のために別のクラスターを発生して失敗することがあります。これは、ECC エラーのため、一部の GPU の利用可能なメモリが通常よりも少なくなっていることが原因と考えられます。
+ ノード内のすべての GPU を使用しないマルチノードジョブを実行すると、**ネットワークタイムアウトクラッシュ**が発生することがあります。これを回避するには、`processes_per_host` パラメータが各インスタンスの GPU の数に設定されていることを確認して、ノード上のすべての GPU を使用してください。例えば、`ml.p3.16xlarge`、`ml.p3dn.24xlarge` および `ml.p4d.24xlarge` インスタンス用の `processes_per_host=8` です。
+ データのダウンロード段階でトレーニングジョブに時間がかかる場合は、SageMaker `Estimator` クラスの `checkpoint_s3_uri` に指定した Amazon S3 パスが現在のトレーニングジョブと一意であることを確認してください。同時に実行する複数のトレーニングジョブでこのパスを再利用すると、すべてのチェックポイントが同じ Amazon S3 パスにアップロードおよびダウンロードされるため、チェックポイントのロード時間が大幅に長くなる可能性があります。
+ 大規模なデータやモデルを扱う場合は、FSx for Lustre を使用してください。
  + データセットが大きく、取得に時間がかかる場合は、データセットを [FSx for Lustre](https://aws.amazon.com/fsx/lustre/) に保存することをお勧めします。
  + トレーニングモデルのパラメータが 100 億を超える場合は、チェックポイントに FSx for Lustre を使用することをお勧めします。
  + ファイルシステムを作成したら、ステータスが**使用可能**になるのを待ってから、そのファイルシステムを使用してトレーニングジョブを開始してください。

## PyTorch トレーニングジョブの NCCL エラーの受信
<a name="distributed-ts-model-parallel-nccl-error"></a>

次のエラーが発生した場合は、プロセスの 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` で解決できます。自動パーティショニングによってバランスの取れたパーティショニングが得られない場合は、手動パーティショニングを検討する必要があるかもしれません。詳細については、「[ノード間でのパイプラインの並列処理](model-parallel-best-practices.md#model-parallel-best-practices-configuration-pipeline-across-nodes)」を参照してください。

## PyTorch トレーニングジョブで `RecursionError` が発生する
<a name="distributed-ts-model-parallel-super-forward-not-supported"></a>

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

```
RecursionError: maximum recursion depth exceeded
```

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