

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

# ハイブリッドシャーディングデータ並列処理
<a name="model-parallel-core-features-v2-sharded-data-parallelism"></a>

*シャーディングデータ並列処理*は、メモリを節約する分散トレーニング手法であり、モデルの状態 (モデルパラメータ、勾配、オプティマイザの状態) を複数のデバイス間で分割します。解放された GPU メモリを使用して、より大きなモデルを適合させたり、バッチサイズを増やしたりすることができます。SMP ライブラリを使用すれば、PyTorch Fully Sharded Data Parallel (FSDP) と併せてシャーディングデータ並列処理を実行できます。PyTorch FSDP はデフォルトで、使用されているすべての GPU セット全体にわたってシャーディング (データ分割) を行います。SMP v2 では、このシャーディングデータ並列処理を PyTorch FSDP に基づいて提供しており、具体的には、[PyTorch FSDP が提供しているシャーディング戦略](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.ShardingStrategy) (`FULL_SHARD`、`SHARD_GRAD_OP`、`HYBRID_SHARD`、`_HYBRID_SHARD_ZERO2`) の 1 つである PyTorch ハイブリッドシャーディング (`HYBRID_SHARD`) を拡張しています。このようにハイブリッドシャーディングを拡張することで、ブログ「[Near-linear scaling of gigantic-model training on AWS](https://www.amazon.science/blog/near-linear-scaling-of-gigantic-model-training-on-aws)」で説明されているスケールに応じたシャーディング (scale-aware-sharding) を PyTorch FSDP で実装できます。

SMP ライブラリを使用すれば、設定可能な任意の数の GPU にわたって簡単に `HYBRID_SHARD` および `_HYBRID_SHARD_ZERO2` を利用でき、単一のノード内 (`HYBRID_SHARD`) またはすべての GPU 間 (`FULL_SHARD`) でのシャーディングをサポートするネイティブ PyTorch FSDP を拡張できます。PyTorch FSDP の呼び出しは現状のまま使うことができ、SMP 設定に `hybrid_shard_degree` 引数を追加するだけで済みます。次のコード例を参照してください。PyTorch モデルを囲む PyTorch FSDP ラッパーの `sharding_strategy` 引数の値を変更する必要はありません。その値として `ShardingStrategy.HYBRID_SHARD` を渡すことができます。または、`hybrid_shard_degree` パラメータに 2 以上の値を指定した場合、SMP ライブラリがスクリプト内の戦略を上書きし、`ShardingStrategy.HYBRID_SHARD` に設定します。

次のコードスニペットでは、「[SageMaker モデル並列処理ライブラリ v2 を使用する](model-parallel-use-api-v2.md)」で紹介した 2 ステップのプロセスに従って、SMP 初期化モジュール `torch.sagemaker.init()` をトレーニングスクリプトに追加し、トレーニングジョブランチャーの SMP 設定ディクショナリを JSON 形式で設定する方法を示しています。PyTorch モデルや [PyTorch FSDP](https://pytorch.org/docs/stable/fsdp.html#module-torch.distributed.fsdp) 設定については、一切変更する必要はありません。`hybrid_shard_degree` パラメータの詳細については、「[SMP v2 の主要機能の設定パラメータ](distributed-model-parallel-v2-reference.md#distributed-model-parallel-v2-reference-init-config)」をご参照ください。

**SMP 設定ディクショナリ**

```
{ "hybrid_shard_degree": 16 }
```

**トレーニングスクリプト内**

```
import torch.sagemaker as tsm
tsm.init()

# Set up a PyTorch model
model = ...

# Wrap the PyTorch model using the PyTorch FSDP module
model = FSDP(
    model,
    ...
)

# Optimizer needs to be created after FSDP wrapper
optimizer = ...
```