Verwendung der SageMaker-Modellparallelitätsbibliothek v2
Auf dieser Seite erfahren Sie, wie Sie die APIs der SageMaker-Modellparallelitätsbibliothek v2 verwenden und mit der Ausführung eines PyTorch-FSDP-Trainingsjobs (Fully Sharded Data Parallel) auf der SageMaker-Trainingsplattform oder auf einem SageMaker-HyperPod-Cluster beginnen.
Es gibt verschiedene Szenarien für die Ausführung eines PyTorch-Trainingsjobs mit SMP v2.
-
Verwenden Sie für das SageMaker-Training einen der vorgefertigten SageMaker-Framework-Container für PyTorch v2.0.1 und höher, die mit SMP v2 vorkonfiguriert sind.
-
Verwenden Sie die SMP-v2-Binärdatei, um eine Conda-Umgebung für die Ausführung eines verteilten Trainingsworkloads auf einem SageMaker-HyperPod-Cluster einzurichten.
-
Erweitern Sie die vorgefertigten SageMaker-Framework-Container für PyTorch v2.0.1 und höher, um zusätzliche funktionale Anforderungen für Ihren Anwendungsfall zu installieren. Informationen dazu, wie Sie einen vorgefertigten Container erweitern können, finden Sie unter Erweitern eines vorgefertigten Containers.
-
Sie können auch Ihren eigenen Docker-Container verwenden und die gesamte SageMaker-Trainingsumgebung mit dem SageMaker-Trainingstoolkit manuell einrichten und die SMP-v2-Binärdatei installieren. Diese Option wird aufgrund der Komplexität der Abhängigkeiten am wenigsten empfohlen. Informationen zum Ausführen Ihres eigenen Docker-Containers finden Sie unter Anpassung Ihres eigenen Trainingscontainers.
Dieser Einführungsleitfaden behandelt die ersten beiden Szenarien.
Schritt 1: Anpassen Ihres PyTorch-FSDP-Trainingsskripts
Um die SMP-v2-Bibliothek zu aktivieren und zu konfigurieren, importieren Sie zunächst das torch.sagemaker.init()-Modul und fügen Sie es oben im Skript hinzu. Dieses Modul nimmt das SMP-Konfigurationswörterbuch von Konfigurationsparameter für die Kernfunktionen von SMP v2 auf, das Sie in Schritt 2: Starten eines Trainingsjobs vorbereiten werden. Um die verschiedenen Kernfunktionen von SMP v2 nutzen zu können, müssen Sie möglicherweise weitere Änderungen zur Anpassung Ihres Trainingsskripts vornehmen. Ausführlichere Anweisungen zur Anpassung Ihres Trainingsskripts für die Nutzung der Kernfunktionen von SMP v2 finden Sie unter Kernfunktionen der SageMaker-Modellparallelitätsbibliothek v2.
- SageMaker Training
-
Fügen Sie Ihrem Trainingsskript die folgenden zwei Codezeilen hinzu. Dies ist die Mindestanforderung, um mit dem Training mit SMP v2 zu beginnen. In Schritt 2: Starten eines Trainingsjobs richten Sie ein Objekt der SageMaker-PyTorch-Schätzerklasse mit einem SMP-Konfigurationswörterbuch über das distribution-Argument der Schätzerklasse ein.
import torch.sagemaker as tsm
tsm.init()
- SageMaker HyperPod
-
Fügen Sie in Ihrem Trainingsskript die folgenden beiden Codezeilen hinzu. In Schritt 2: Starten eines Trainingsjobs richten Sie eine smp_config.json-Datei für die Einrichtung von SMP-Konfigurationen im JSON-Format ein und laden sie in einen Speicher oder ein Dateisystem hoch, das Ihrem SageMaker-HyperPod-Cluster zugeordnet ist. Wir empfehlen, die Konfigurationsdatei in demselben Verzeichnis zu speichern, in das Sie Ihr Trainingsskript hochladen.
import torch.sagemaker as tsm
tsm.init("/dir_to_training_files/smp_config.json")
Schritt 2: Starten eines Trainingsjobs
Erfahren Sie, wie Sie SMP-Verteilungsoptionen für den Start eines PyTorch-FSDP-Trainingsjobs mit SMP-Kernfunktionen konfigurieren.
- SageMaker Training
-
Wenn Sie ein Trainingsjob-Launcher-Objekt der PyTorch-Framework-Schätzerklasse im SageMaker Python SDK einrichten, konfigurieren Sie Konfigurationsparameter für die Kernfunktionen von SMP v2 über das distribution-Argument wie folgt.
Die distribution-Konfiguration für SMP v2 ist ab Version 2.200 in das SageMaker Python SDK integriert. Stellen Sie sicher, dass Sie das SageMaker Python SDK v2.200 oder höher verwenden.
In SMP v2 sollten Sie smdistributed mit torch_distributed für das distribution-Argument des PyTorch SageMaker--Schätzers konfigurieren. Mit torch_distributed läuft SageMaker AI torchrun aus. Dies ist der standardmäßige Job-Launcher für mehrere Knoten von PyTorch Distributed.
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
}
}
}
}
)
Um eine der früheren Versionen von PyTorch oder SMP anstelle der neuesten zu verwenden, müssen Sie das SMP-Docker-Image direkt mit dem image_uri-Argument anstelle von framework_version und py_version angeben. Es folgt ein Beispiel für
estimator = PyTorch(
...,
image_uri="658645717510.dkr.ecr.us-west-2.amazonaws.com/smdistributed-modelparallel:2.2.0-gpu-py310-cu121"
)
Um SMP Docker Image URIs zu finden, siehe Unterstützte Frameworks.
- SageMaker HyperPod
-
Überprüfen Sie vor Beginn, ob die folgenden Anforderungen erfüllt sind:
-
Ein freigegebenes Amazon-FSx-Verzeichnis (/fsx), das in Ihr HyperPod-Cluster eingebunden ist.
-
Conda wurde im freigegebenen FSx-Verzeichnis installiert. Anweisungen zur Installation von Conda finden Sie unter Installation unter Linux im Conda-Benutzerhandbuch.
-
cuda11.8 oder cuda12.1 wurden auf den Haupt- und Rechenknoten Ihres HyperPod-Clusters installiert.
Wenn alle Voraussetzungen erfüllt sind, fahren Sie mit den folgenden Anweisungen zum Starten eines Workloads mit SMP v2 auf einem HyperPod-Cluster fort.
-
Bereiten Sie eine smp_config.json-Datei vor, die ein Wörterbuch von Konfigurationsparameter für die Kernfunktionen von SMP v2 enthält. Stellen Sie sicher, dass Sie diese JSON-Datei in den Speicherort Ihres Trainingsskripts oder den in Schritt 1 für das torch.sagemaker.init()-Modul angegebenen Pfad hochladen. Wenn Sie das Konfigurationswörterbuch bereits in Schritt 1 an das torch.sagemaker.init()-Modul im Trainingsskript übergeben haben, können Sie diesen Schritt überspringen.
// 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
}
-
Laden Sie die smp_config.json-Datei in ein Verzeichnis in Ihrem Dateisystem hoch. Der Verzeichnispfad muss mit dem Pfad übereinstimmen, den Sie in Schritt 1 angegeben haben. Wenn Sie das Konfigurationswörterbuch bereits an das torch.sagemaker.init()-Modul im Trainingsskript übergeben haben, können Sie diesen Schritt überspringen.
-
Starten Sie auf den Rechenknoten Ihres Clusters eine Terminalsitzung mit dem folgenden Befehl.
sudo su -l ubuntu
-
Erstellen Sie eine Conda-Umgebung auf den Rechenknoten. Der folgende Code ist ein Beispielskript für die Erstellung einer Conda-Umgebung und die Installation von SMP, SMDDP, CUDA und anderen Abhängigkeiten.
# 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
-
Führen Sie einen Test-Trainingsjob aus.
-
Klonen Sie im freigegebenen Dateisystem (/fsx) das GitHub-Repository von Awsome Distributed Training und rufen Sie den Ordner 3.test_cases/11.modelparallel auf.
git clone https://github.com/aws-samples/awsome-distributed-training/
cd awsome-distributed-training/3.test_cases/11.modelparallel
-
Reichen Sie einen Job mit sbatch wie folgt ein.
conda activate <ENV_PATH>
sbatch -N 16 conda_launch.sh
Wenn der Job erfolgreich eingereicht wurde, sollte die Ausgabemeldung dieses sbatch-Befehls ähnlich wie Submitted batch job ABCDEF lauten.
-
Überprüfen Sie die Protokolldatei im aktuellen Verzeichnis unter logs/.
tail -f ./logs/fsdp_smp_ABCDEF.out