

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

# SageMaker モデル並列処理ライブラリ v2 を使用する
<a name="model-parallel-use-api-v2"></a>

このページでは、SageMaker モデル並列処理ライブラリ v2 の API の使い方と、SageMaker トレーニングプラットフォームまたは SageMaker HyperPod クラスターで PyTorch Fully Sharded Data Parallel (FSDP) トレーニングジョブの実行に着手する方法を説明します。

SMP v2 で PyTorch トレーニングジョブを実行する場合、さまざまなシナリオが考えられます。

1. SageMaker トレーニングでは、PyTorch v2.0.1 以降用の構築済みの SageMaker フレームワークコンテナのいずれかを使用します。これらのコンテナは、SMP v2 であらかじめパッケージ化されています。

1. SMP v2 バイナリファイルを使用して、SageMaker HyperPod クラスターで分散トレーニングワークロードを実行するための Conda 環境を設定します。

1. PyTorch v2.0.1 以降用の構築済みの SageMaker フレームワークコンテナを拡張して、ユースケースに合わせた追加の機能要件をインストールします。構築済みのコンテナを拡張する方法については、「[構築済みコンテナを拡張する](prebuilt-containers-extend.md)」を参照してください。

1. 独自の Docker コンテナを持ち込み、[SageMaker トレーニングツールキット](https://github.com/aws/sagemaker-training-toolkit)を使用して SageMaker トレーニング環境をすべて手動で設定し、SMP v2 バイナリファイルをインストールすることもできます。ただし、依存関係が複雑であるため、この選択肢は最も推奨されません。独自の Docker コンテナを実行する方法については、「[独自のトレーニングコンテナの適応](https://docs.aws.amazon.com/sagemaker/latest/dg/adapt-training-container.html)」を参照してください。

この入門ガイドでは、最初の 2 つのシナリオを扱います。

**Topics**
+ [ステップ 1: PyTorch FSDP トレーニングスクリプトを適応させる](#model-parallel-adapt-pytorch-script-v2)
+ [ステップ 2: トレーニングジョブを開始する](#model-parallel-launch-a-training-job-v2)

## ステップ 1: PyTorch FSDP トレーニングスクリプトを適応させる
<a name="model-parallel-adapt-pytorch-script-v2"></a>

SMP v2 ライブラリを有効にして設定するには、まず、スクリプトの冒頭で `torch.sagemaker.init()` モジュールをインポートして追加します。このモジュールは、「[ステップ 2: トレーニングジョブを開始する](#model-parallel-launch-a-training-job-v2)」で準備する [SMP v2 の主要機能の設定パラメータ](distributed-model-parallel-v2-reference.md#distributed-model-parallel-v2-reference-init-config) の SMP 設定ディクショナリを取り込みます。また、SMP v2 のさまざまな主要機能を使用するには、トレーニングスクリプトを適応させるために、他にもいくつか変更が必要になる場合があります。SMP v2 の主要機能を使用するためにトレーニングスクリプトを適応させる具体的な手順については、「[SageMaker モデル並列処理ライブラリ v2 の主要機能](model-parallel-core-features-v2.md)」を参照してください。

------
#### [ SageMaker Training ]

トレーニングスクリプトで、次の 2 行のコードを追加します。SMP v2 でトレーニングを開始する場合、最低限この 2 行が必要です。「[ステップ 2: トレーニングジョブを開始する](#model-parallel-launch-a-training-job-v2)」では、SageMaker `PyTorch` 推定器クラスのオブジェクトを設定し、その推定器クラスの `distribution` 引数に SMP 設定ディクショナリを指定します。

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

**注記**  
また、[SMP v2 の主要機能の設定パラメータ](distributed-model-parallel-v2-reference.md#distributed-model-parallel-v2-reference-init-config) の設定ディクショナリを `torch.sagemaker.init()` モジュールに直接渡すこともできます。ただし、「[ステップ 2: トレーニングジョブを開始する](#model-parallel-launch-a-training-job-v2)」で PyTorch 推定器に渡されるパラメータが優先され、`torch.sagemaker.init()` モジュールに指定されたパラメータは上書きされます。

------
#### [ SageMaker HyperPod ]

トレーニングスクリプトで、次の 2 行のコードを追加します。「[ステップ 2: トレーニングジョブを開始する](#model-parallel-launch-a-training-job-v2)」では、SMP 設定を JSON 形式で設定するための `smp_config.json` ファイルを用意し、SageMaker HyperPod クラスターにマッピングされたストレージまたはファイルシステムにアップロードします。この設定ファイルは、トレーニングスクリプトのアップロード先と同じディレクトリに保存しておくことをお勧めします。

```
import torch.sagemaker as tsm
tsm.init("/dir_to_training_files/smp_config.json")
```

**注記**  
また、[SMP v2 の主要機能の設定パラメータ](distributed-model-parallel-v2-reference.md#distributed-model-parallel-v2-reference-init-config) の設定ディクショナリを `torch.sagemaker.init()` モジュールに直接渡すこともできます。

------

## ステップ 2: トレーニングジョブを開始する
<a name="model-parallel-launch-a-training-job-v2"></a>

SMP の主要機能を使用して PyTorch FSDP トレーニングジョブを開始するための SMP 分散オプションの設定方法について説明します。

------
#### [ SageMaker Training ]

SageMaker Python SDK で [PyTorch フレームワーク推定器](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html)クラスのトレーニングジョブランチャーオブジェクトを設定するときに、以下に示すように、`distribution` 引数を使用して [SMP v2 の主要機能の設定パラメータ](distributed-model-parallel-v2-reference.md#distributed-model-parallel-v2-reference-init-config) を設定します。

**注記**  
SMP v2 の `distribution` 設定は、SageMaker Python SDK v2.200 以降に統合されています。必ず SageMaker Python SDK v2.200 以降を使用してください。

**注記**  
SMP v2 では、SageMaker `PyTorch` 推定器の `distribution` 引数で `smdistributed` と `torch_distributed` を設定する必要があります。`torch_distributed` を指定すると、SageMaker AI は `torchrun` を実行します。これは、[PyTorch Distributed](https://pytorch.org/tutorials/beginner/dist_overview.html) のデフォルトのマルチノードジョブランチャーです。

```
from sagemaker.pytorch import PyTorch

estimator = PyTorch(
    framework_version=2.2.0,
    py_version="310"
    # image_uri="<smp-docker-image-uri>" # For using prior versions, specify the SMP image URI directly.
    entry_point="your-training-script.py", # Pass the training script you adapted with SMP from Step 1.
    ... # Configure other required and optional parameters
    distribution={
        "torch_distributed": { "enabled": True },
        "smdistributed": {
            "modelparallel": {
                "enabled": True,
                "parameters": {
                    "hybrid_shard_degree": Integer,
                    "sm_activation_offloading": Boolean,
                    "activation_loading_horizon": Integer,
                    "fsdp_cache_flush_warnings": Boolean,
                    "allow_empty_shards": Boolean,
                    "tensor_parallel_degree": Integer,
                    "expert_parallel_degree": Integer,
                    "random_seed": Integer
                }
            }
        }
    }
)
```

**重要**  
最新バージョンではなく以前のバージョンの PyTorch または SMP を使用する場合は、`framework_version` と `py_version` のペアの代わりに `image_uri` 引数を使用して SMP Docker イメージを直接指定する必要があります。次に例を示します。  

```
estimator = PyTorch(
    ...,
    image_uri="658645717510.dkr.ecr.us-west-2.amazonaws.com/smdistributed-modelparallel:2.2.0-gpu-py310-cu121"
)
```
SMP Docker イメージ の URI の調べ方については、「[サポートされるフレームワーク](distributed-model-parallel-support-v2.md#distributed-model-parallel-supported-frameworks-v2)」を参照してください。

------
#### [ SageMaker HyperPod ]

まず、次の前提条件が満たされていることを確認してください。
+ Amazon FSx 共有ディレクトリ (`/fsx`) が HyperPod クラスターにマウントされている。
+ FSx 共有ディレクトリに Conda がインストールされている。Conda のインストール方法については、「*Conda User Guide*」の「[Installing on Linux](https://docs.conda.io/projects/conda/en/latest/user-guide/install/linux.html)」の手順を参照してください。
+ HyperPod クラスターのヘッドノードとコンピューティングノードに `cuda11.8` または `cuda12.1` がインストールされている。

前提条件がすべて満たされている場合は、HyperPod クラスターで SMP v2 を使用してワークロードを開始する手順に進んでください。

1. [SMP v2 の主要機能の設定パラメータ](distributed-model-parallel-v2-reference.md#distributed-model-parallel-v2-reference-init-config) のディクショナリを含む `smp_config.json` ファイルを準備します。この JSON ファイルをトレーニングスクリプトの保存先にアップロードするか、[ステップ 1](#model-parallel-adapt-pytorch-script-v2) で `torch.sagemaker.init()` モジュールに指定したパスにアップロードしてください。[ステップ 1](#model-parallel-adapt-pytorch-script-v2) でトレーニングスクリプトの `torch.sagemaker.init()` モジュールに設定ディクショナリを渡した場合は、この手順は省略できます。

   ```
   // smp_config.json
   {
       "hybrid_shard_degree": Integer,
       "sm_activation_offloading": Boolean,
       "activation_loading_horizon": Integer,
       "fsdp_cache_flush_warnings": Boolean,
       "allow_empty_shards": Boolean,
       "tensor_parallel_degree": Integer,
       "expert_parallel_degree": Integer,
       "random_seed": Integer
   }
   ```

1. ファイルシステムのディレクトリに `smp_config.json` ファイルをアップロードします。このディレクトリパスは、[ステップ 1](#model-parallel-adapt-pytorch-script-v2) で指定したパスと一致する必要があります。トレーニングスクリプトの `torch.sagemaker.init()` モジュールに設定ディクショナリを渡している場合は、この手順は省略できます。

1. クラスターのコンピューティングノードで、次のコマンドを使用してターミナルセッションを開始します。

   ```
   sudo su -l ubuntu
   ```

1. コンピューティングノードで Conda 環境を作成します。次のコードは、Conda 環境を作成し、SMP、[SMDDP](data-parallel.md)、CUDA、その他の依存関係をインストールするスクリプトの例です。

   ```
   # Run on compute nodes
   SMP_CUDA_VER=<11.8 or 12.1>
   
   source /fsx/<path_to_miniconda>/miniconda3/bin/activate
   
   export ENV_PATH=/fsx/<path to miniconda>/miniconda3/envs/<ENV_NAME>
   conda create -p ${ENV_PATH} python=3.10
   
   conda activate ${ENV_PATH}
   
   # Verify aws-cli is installed: Expect something like "aws-cli/2.15.0*"
   aws ‐‐version
   # Install aws-cli if not already installed
   # https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html#cliv2-linux-install
   
   # Install the SMP library
   conda install pytorch="2.0.1=sm_py3.10_cuda${SMP_CUDA_VER}*" packaging ‐‐override-channels \
     -c https://sagemaker-distributed-model-parallel.s3.us-west-2.amazonaws.com/smp-2.0.0-pt-2.0.1/2023-12-11/smp-v2/ \
     -c pytorch -c numba/label/dev \
     -c nvidia -c conda-forge
   
   # Install dependencies of the script as below
   python -m pip install packaging transformers==4.31.0 accelerate ninja tensorboard h5py datasets \
       && python -m pip install expecttest hypothesis \
       && python -m pip install "flash-attn>=2.0.4" ‐‐no-build-isolation
   
   # Install the SMDDP wheel
   SMDDP_WHL="smdistributed_dataparallel-2.0.2-cp310-cp310-linux_x86_64.whl" \
     && wget -q https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.0.1/cu118/2023-12-07/${SMDDP_WHL} \
     && pip install ‐‐force ${SMDDP_WHL} \
     && rm ${SMDDP_WHL}
   
   # cuDNN installation for Transformer Engine installation for CUDA 11.8
   # Please download from below link, you need to agree to terms 
   # https://developer.nvidia.com/downloads/compute/cudnn/secure/8.9.5/local_installers/11.x/cudnn-linux-x86_64-8.9.5.30_cuda11-archive.tar.xz
   
   tar xf cudnn-linux-x86_64-8.9.5.30_cuda11-archive.tar.xz \
       && rm -rf /usr/local/cuda-$SMP_CUDA_VER/include/cudnn* /usr/local/cuda-$SMP_CUDA_VER/lib/cudnn* \
       && cp ./cudnn-linux-x86_64-8.9.5.30_cuda11-archive/include/* /usr/local/cuda-$SMP_CUDA_VER/include/ \
       && cp ./cudnn-linux-x86_64-8.9.5.30_cuda11-archive/lib/* /usr/local/cuda-$SMP_CUDA_VER/lib/ \
       && rm -rf cudnn-linux-x86_64-8.9.5.30_cuda11-archive.tar.xz \
       && rm -rf cudnn-linux-x86_64-8.9.5.30_cuda11-archive/
   
   # Please download from below link, you need to agree to terms 
   # https://developer.download.nvidia.com/compute/cudnn/secure/8.9.7/local_installers/12.x/cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz \
   # cuDNN installation for TransformerEngine installation for cuda12.1
   tar xf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz \
       && rm -rf /usr/local/cuda-$SMP_CUDA_VER/include/cudnn* /usr/local/cuda-$SMP_CUDA_VER/lib/cudnn* \
       && cp ./cudnn-linux-x86_64-8.9.7.29_cuda12-archive/include/* /usr/local/cuda-$SMP_CUDA_VER/include/ \
       && cp ./cudnn-linux-x86_64-8.9.7.29_cuda12-archive/lib/* /usr/local/cuda-$SMP_CUDA_VER/lib/ \
       && rm -rf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz \
       && rm -rf cudnn-linux-x86_64-8.9.7.29_cuda12-archive/
       
   # TransformerEngine installation
   export CUDA_HOME=/usr/local/cuda-$SMP_CUDA_VER
   export CUDNN_PATH=/usr/local/cuda-$SMP_CUDA_VER/lib
   export CUDNN_LIBRARY=/usr/local/cuda-$SMP_CUDA_VER/lib
   export CUDNN_INCLUDE_DIR=/usr/local/cuda-$SMP_CUDA_VER/include
   export PATH=/usr/local/cuda-$SMP_CUDA_VER/bin:$PATH
   export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-$SMP_CUDA_VER/lib
   
   python -m pip install ‐‐no-build-isolation git+https://github.com/NVIDIA/TransformerEngine.git@v1.0
   ```

1. テストトレーニングジョブを実行します。

   1. 共有ファイルシステム (`/fsx`) で、[Awsome Distributed Training GitHub リポジトリ](https://github.com/aws-samples/awsome-distributed-training/) のクローンを作成し、`3.test_cases/11.modelparallel` フォルダに移動します。

      ```
      git clone https://github.com/aws-samples/awsome-distributed-training/
      cd awsome-distributed-training/3.test_cases/11.modelparallel
      ```

   1. 次に示すように、`sbatch` を使用してジョブを送信します。

      ```
      conda activate <ENV_PATH>
      sbatch -N 16 conda_launch.sh
      ```

      ジョブの送信が成功した場合、この `sbatch` コマンドの出力メッセージは `Submitted batch job ABCDEF` に似ているはずです。

   1. カレントディレクトリの `logs/` でログファイルを確認します。

      ```
      tail -f ./logs/fsdp_smp_ABCDEF.out
      ```

------