

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

# パイプライン並列処理とテンソル並列処理を組み合わせて使用する場合のランキングメカニズム
<a name="model-parallel-extended-features-pytorch-ranking-mechanism"></a>

このセクションでは、モデル並列処理のランキングメカニズムがテンソル並列処理とどのように作用するかについて説明します。これは、[SageMaker モデル並列処理ライブラリの主要機能](model-parallel-core-features.md) の[ランキングの基本](https://sagemaker.readthedocs.io/en/v2.199.0/api/training/smd_model_parallel_general.html#ranking-basics)の延長です。テンソル並列処理では、ライブラリは 3 種類のランキングとプロセスグループ API: テンソル並列ランクの `smp.tp_rank()`、パイプライン並列ランクの `smp.pp_rank()`、および縮小データランクの `smp.rdp_rank()` を導入します。対応する通信プロセスグループは、テンソル並列グループ (`TP_GROUP`)、パイプライン並列グループ (`PP_GROUP`)、および縮小データ並列グループ(`RDP_GROUP`) です。これらのグループは以下のように定義されます。
+ テンソル並列グループ (`TP_GROUP`) は、データ並列グループの均等に割り切れるサブセットであり、それに対してモジュールのテンソル並列分散が行われます。パイプラインの並列度が 1 の場合、`TP_GROUP` は*モデル並列グループ* (`MP_GROUP`) と同じです。
+ *パイプライン並列グループ* (`PP_GROUP`) は、パイプライン並列処理が行われるプロセスのグループです。テンソル並列度が 1 のとき、`PP_GROUP` は `MP_GROUP` と同じです。
+ *縮小データ並列グループ* (`RDP_GROUP`) は、同じパイプライン並列パーティションと、同じテンソル並列パーティションの両方を保持し、それらの間でデータ並列処理を実行する一連のプロセスです。これは、データ並列グループ、`DP_GROUP` 全体のサブセットであるため、削減データ並列グループと呼ばれます。`TP_GROUP` 内部に分布するモデルパラメータについては、勾配 `allreduce` オペレーションは縮小データ並列グループに対してのみ実行され、分布していないパラメータでは、勾配 `allreduce` は `DP_GROUP` 全体にわたって行われます。
+ モデル並列グループ (`MP_GROUP`) とは、モデル全体をまとめて格納するプロセスのグループを指します。これは、現在のプロセスの `TP_GROUP` にあるすべてのランクの `PP_GROUP` の統合で構成されています。テンソル並列度が 1 であるとき、`MP_GROUP` は `PP_GROUP` と等しくなります。また、前の `smdistributed` リリースから、`MP_GROUP` の既存の定義と一致しています。なお、現在の `TP_GROUP` は現在の `DP_GROUP` と現在の `MP_GROUP` の両方のサブセットです。

SageMaker モデル並列処理ライブラリの通信プロセス API の詳細については、SageMaker Python SDK ドキュメントの「[共通API](https://sagemaker.readthedocs.io/en/v2.199.0/api/training/smp_versions/latest/smd_model_parallel_common_api.html#)」および「[PyTorch 固有 API](https://sagemaker.readthedocs.io/en/v2.199.0/api/training/smp_versions/latest/smd_model_parallel_pytorch.html)」を参照してください。**

![テンソル並列処理のランキングメカニズム、パラメータ分散、関連する AllReduce 演算。](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/distributed/model-parallel/tensor-parallel-ranking-mechanism.png)


例えば、8 GPU を持つ単一ノードのプロセスグループについて考慮してみましょう。テンソル並列度 2、パイプライン並列度は 2、データ並列度の度合いは 4 とします。前の図の中央上部には、4 レイヤーモデルの例が示されています。図の左下と右下部分には、4 つの GPU に分散された 4 レイヤーモデルが描かれており、パイプライン並列処理とテンソル並列処理の両方が使用され、テンソル並列処理が中間の 2 レイヤーに使用されています。これらの 2 つの図は、異なるグループ境界線を示す単純なコピーです。パーティション化されたモデルは、GPU 0-3 および 4-7 のデータ並列処理のためにレプリケートされます。左下の図は、`MP_GROUP`、`PP_GROUP`、および `TP_GROUP` の定義を示しています。右下の図は、同じ GPU のセット上にある `RDP_GROUP`、`DP_GROUP`、および `WORLD` をしめしています。同じ色を持つレイヤーとレイヤースライスの勾配は、データ並列処理に対して一緒に `allreduce` されます。例えば、最初のレイヤー (水色) では、`DP_GROUP` 全体にわたって `allreduce` オペレーションが実行されます。一方、2 つ目のレイヤーの濃いオレンジのスライスでは、そのプロセスの `RDP_GROUP` 内でのみ `allreduce` オペレーションが行われます。太字の濃い赤色の矢印は、`TP_GROUP` 全体のバッチのあるテンソルを表しています。

```
GPU0: pp_rank 0, tp_rank 0, rdp_rank 0, dp_rank 0, mp_rank 0
GPU1: pp_rank 1, tp_rank 0, rdp_rank 0, dp_rank 0, mp_rank 1
GPU2: pp_rank 0, tp_rank 1, rdp_rank 0, dp_rank 1, mp_rank 2
GPU3: pp_rank 1, tp_rank 1, rdp_rank 0, dp_rank 1, mp_rank 3
GPU4: pp_rank 0, tp_rank 0, rdp_rank 1, dp_rank 2, mp_rank 0
GPU5: pp_rank 1, tp_rank 0, rdp_rank 1, dp_rank 2, mp_rank 1
GPU6: pp_rank 0, tp_rank 1, rdp_rank 1, dp_rank 3, mp_rank 2
GPU7: pp_rank 1, tp_rank 1, rdp_rank 1, dp_rank 3, mp_rank 3
```

この例では、パイプライン並列処理は GPU ペア (0,1)、(2,3)、(4,5) および (6,7) で行われます。さらに、データ並列処理 (`allreduce`) は、GPU 0、2、4、6 全体で実行され、GPU 1、3、5、7 では個別に実行されます。テンソル並列処理は、GPU ペア (0,2)、(1,3)、(4,6)、(5,7) に全体で `DP_GROUP` のサブセットに対して行われます。

  このようなハイブリッドパイプラインとテンソル並列処理では、`data_parallel_degree` の計算は `data_parallel_degree = number_of_GPUs / pipeline_parallel_degree` のままです。ライブラリはさらに、次の関係 `reduced_data_parallel_degree * tensor_parallel_degree = data_parallel_degree` から縮小データ並列度を計算します。  