Étape 2 : lancer une tâche d'entraînement distribuée SageMaker à l'aide du kit SDK Python SageMaker - Amazon SageMaker

Étape 2 : lancer une tâche d'entraînement distribuée SageMaker à l'aide du kit SDK Python SageMaker

Pour exécuter votre script adapté dans Étape 1 : modifier votre propre script d'entraînement, commencez par créer un cadre SageMaker ou un objet d'estimation générique avec le script d'entraînement préparé et le paramètre de configuration de l'entraînement distribué. Vous pouvez utiliser la bibliothèque dans n'importe quel type d'environnement SageMaker et dans les IDE Web, tels que l'instance de bloc-notes SageMaker et SageMaker Studio.

Utilisez le kit SDK Python SageMaker de haut niveau pour effectuer l'une des actions suivantes :

  • Si vous souhaitez adopter rapidement votre tâche d'entraînement distribué dans SageMaker, configurez une classe d'estimateur de cadre SageMaker PyTorch ou TensorFlow. L'estimateur de cadre récupère votre script d'entraînement et fait automatiquement correspondre l'URI d'image appropriée des conteneurs Deep Learning (DLC) PyTorch ou TensorFlow prédéfinis, compte tenu de la valeur spécifiée pour le paramètre framework_version.

  • Si vous souhaitez étendre l'un des conteneurs prédéfinis ou créer un conteneur personnalisé pour créer votre propre environnement de ML avec SageMaker, utilisez la classe SageMaker Estimator générique et spécifiez l'URI d'image du conteneur Docker personnalisé hébergé dans votre Amazon Elastic Container Registry (Amazon ECR).

Vos jeux de données d'entraînement doivent se trouver dans Amazon S3 ou Amazon FSx for Lustre dans la Région AWS dans laquelle vous lancez votre tâche d'entraînement. Si vous utilisez des blocs-notes Jupyter, vous devez disposer d'une instance de bloc-notes SageMaker ou d'une application SageMaker Studio qui s'exécute dans la même Région AWS. Pour plus d'informations sur le stockage de vos données d'entraînement, consultez la documentation sur les entrées de données du kit SDK Python SageMaker.

Astuce

Nous vous recommandons vivement d'utiliser Amazon FSx for Lustre au lieu d'Amazon S3 pour augmenter les performances d'entraînement. Le débit de Amazon FSx est plus élevé et sa latence inférieure à celle de Amazon S3.

Sélectionnez l'une des rubriques suivantes pour obtenir des instructions sur la manière d'exécuter vos scripts d'entraînement TensorFlow ou PyTorch. Après avoir lancé une tâche d'entraînement, vous pouvez contrôler l'utilisation du système et la performance du modèle à l'aide de Amazon SageMaker Debugger ou d'Amazon CloudWatch.

En plus de suivre les instructions des rubriques suivantes pour en savoir plus sur les détails techniques, nous vous recommandons de consulter les Exemples de bloc-notes d'entraînement distribué Amazon SageMaker pour démarrer.

Utilisation des estimateurs de cadre SageMaker pour PyTorch et TensorFlow

Vous pouvez activer la bibliothèque parallèle de données distribuées de SageMaker en la spécifiant comme stratégie de distribution dans la classe d'estimateur de cadre SageMaker.

Using the SageMaker PyTorch estimator
from sagemaker.pytorch import PyTorch pt_estimator = PyTorch( base_job_name="training_job_name_prefix", entry_point="adapted-training-script.py", role="SageMakerRole", py_version="py38", framework_version="1.10.2",     # For running a multi-node distributed training job, specify a value greater than 1     # Example: 2,3,4,..8 instance_count=2,     # Instance types supported by the SageMaker data parallel library: # ml.p4d.24xlargeml.p3dn.24xlarge, and ml.p3.16xlarge instance_type="ml.p3.16xlarge",     # Training using the SageMaker data parallel distributed training strategy distribution={ "smdistributed": { "dataparallel": { "enabled": True } } } ) pt_estimator.fit("s3://bucket/path/to/training/data")
Using the SageMaker TensorFlow estimator
from sagemaker.tensorflow import TensorFlow tf_estimator = TensorFlow( base_job_name = "training_job_name_prefix", entry_point="adapted-training-script.py", role="SageMakerRole", framework_version="2.6.3", py_version="py38",     # For running a multi-node distributed training job, specify a value greater than 1 # Example: 2,3,4,..8 instance_count=2,     # Instance types supported by the SageMaker data parallel library: # ml.p4d.24xlargeml.p3dn.24xlarge, and ml.p3.16xlarge instance_type="ml.p3.16xlarge",     # Training using the SageMaker data parallel distributed training strategy distribution={ "smdistributed": { "dataparallel": { "enabled": True } } } ) tf_estimator.fit("s3://bucket/path/to/training/data")

Les deux paramètres suivants de l'estimateur de cadre SageMaker sont exigés pour activer le parallélisme des données SageMaker.

distribution (dict) : dictionnaire contenant des informations sur la façon d'exécuter un entraînement distribué (par défaut : None). 

  • Pour utiliser smdistributed.dataparallel comme stratégie de distribution, configurez un dictionnaire comme indiqué dans le code suivant :

    distribution = { "smdistributed": { "dataparallel": { "enabled": True } } }
  • custom_mpi_options (str) (facultatif) : options MPI personnalisées. Voici un exemple de la façon dont vous pouvez utiliser ce paramètre lors de la définition de distribution. Pour en savoir plus, consultez Options MPI personnalisées.

    distribution = { "smdistributed": { "dataparallel": { "enabled": True, "custom_mpi_options": "-verbose -x NCCL_DEBUG=VERSION" } } }

instance_type (str) : type d'instance Amazon EC2 à utiliser.

  • Si vous utilisez smdistributed avec la stratégie de distribution dataparallel, vous devez utiliser l'un des types d'instances suivants : ml.p4d.24xlarge, ml.p3dn.24xlarge et ml.p3.16xlarge. Pour obtenir des performances optimales, nous vous recommandons d'utiliser une instance compatible EFA, à savoir ml.p3dn.24xlarge et ml.p4d.24xlarge.

Utilisation de l'estimateur générique SageMaker pour étendre les conteneurs prédéfinis

Vous pouvez personnaliser des conteneurs SageMaker précréés ou les étendre pour gérer toutes les exigences fonctionnelles supplémentaires pour votre algorithme ou modèle que l'image Docker SageMaker précréée ne prend pas en charge. Pour apprendre comment étendre un conteneur précréé, consultez Étendre un conteneur précréé.

Pour étendre un conteneur prédéfini ou adapter votre propre conteneur à l'utilisation de la bibliothèque, vous devez utiliser l'une des images répertoriées dans Cadres pris en charge.

Important

À partir de TensorFlow 2.4.1 et PyTorch 1.8.1, les conteneurs DLC de cadre prennent en charge les types d'instances compatibles EFA (ml.p3dn.24xlarge, ml.p4d.24xlarge). Nous vous recommandons d'utiliser les images DLC contenant TensorFlow 2.4.1 ou version ultérieure et PyTorch 1.8.1 ou version ultérieure.

Par exemple, si vous utilisez PyTorch, votre Dockerfile doit contenir une instruction FROM semblable à celle-ci :

# SageMaker PyTorch image FROM 763104351884.dkr.ecr.<aws-region>.amazonaws.com/pytorch-training:<image-tag> ENV PATH="/opt/ml/code:${PATH}" # this environment variable is used by the SageMaker PyTorch container to determine our user code directory. ENV SAGEMAKER_SUBMIT_DIRECTORY /opt/ml/code # /opt/ml and all subdirectories are utilized by SageMaker, use the /code subdirectory to store your user code. COPY cifar10.py /opt/ml/code/cifar10.py # Defines cifar10.py as script entrypoint ENV SAGEMAKER_PROGRAM cifar10.py

Vous pouvez également personnaliser votre propre conteneur Docker pour qu'il fonctionne avec SageMaker à l'aide de la boîte à outils d'entraînement SageMaker et du fichier binaire de la bibliothèque parallèle de données distribuées SageMaker. Pour plus d'informations, consultez les instructions à la section suivante.

Créez votre propre conteneur Docker avec la bibliothèque de données parallèles distribuées SageMaker

Pour créer votre propre conteneur Docker pour l'entraînement et utiliser la bibliothèque parallèle de données SageMaker, vous devez inclure les bonnes dépendances et les fichiers binaires des bibliothèques parallèles distribuées SageMaker dans votre Dockerfile. Cette section fournit des instructions sur la façon de créer un Dockerfile complet avec le jeu minimal de dépendances pour l'entraînement distribué dans SageMaker à l'aide de la bibliothèque parallèle de données.

Note

Cette option Docker personnalisée avec la bibliothèque parallèle de données SageMaker sous forme binaire est disponible uniquement pour PyTorch.

Pour créer un Dockerfile avec la boîte à outils d'entraînement SageMaker et la bibliothèque parallèle de données

  1. Commencez par une image Docker à partir de NVIDIA CUDA. Utilisez les versions du développeur cuDNN qui contiennent le moteur d'exécution CUDA et les outils de développement (en-têtes et bibliothèques) pour créer à partir du code source de PyTorch.

    FROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04
    Astuce

    Les images officielles Deep Learning Container (DLC) de AWS sont créées à partir des images de base NVIDIA CUDA. Si vous souhaitez utiliser les images DLC précréées comme références tout en suivant le reste des instructions, consultez la section AWS Deep Learning Containers for PyTorch Dockerfiles (Dockerfiles Deep Learning Containers AWS for PyTorch).

  2. Ajoutez les arguments suivants pour spécifier les versions de PyTorch et d'autres packages. Indiquez également les chemins d'accès au compartiment Amazon S3 de la bibliothèque parallèle de données SageMaker et d'autres logiciels pour utiliser les ressources AWS, comme le plugin Amazon S3.

    Pour utiliser des versions des bibliothèques tierces autres que celles fournies dans l'exemple de code suivant, nous vous recommandons de consulter la section official Dockerfiles of AWS Deep Learning Container for PyTorch (Dockerfiles officiels de Deep Learning Container de AWS for PyTorch) pour trouver des versions testées, compatibles et adaptées à votre application.

    Pour trouver des URL pour l'argument SMDATAPARALLEL_BINARY, examinez les tables de consultation à la rubrique Cadres pris en charge.

    ARG PYTORCH_VERSION=1.10.2 ARG PYTHON_SHORT_VERSION=3.8 ARG EFA_VERSION=1.14.1 ARG SMDATAPARALLEL_BINARY=https://smdataparallel.s3.amazonaws.com/binary/pytorch/${PYTORCH_VERSION}/cu113/2022-02-18/smdistributed_dataparallel-1.4.0-cp38-cp38-linux_x86_64.whl ARG PT_S3_WHL_GPU=https://aws-s3-plugin.s3.us-west-2.amazonaws.com/binaries/0.0.1/1c3e69e/awsio-0.0.1-cp38-cp38-manylinux1_x86_64.whl ARG CONDA_PREFIX="/opt/conda" ARG BRANCH_OFI=1.1.3-aws
  3. Définissez les variables d'environnement suivantes pour créer correctement les composants d'entraînement SageMaker et exécuter la bibliothèque parallèle de données. Vous utilisez ces variables pour les composants dans les étapes suivantes.

    # Set ENV variables required to build PyTorch ENV TORCH_CUDA_ARCH_LIST="7.0+PTX 8.0" ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all" ENV NCCL_VERSION=2.10.3 # Add OpenMPI to the path. ENV PATH /opt/amazon/openmpi/bin:$PATH # Add Conda to path ENV PATH $CONDA_PREFIX/bin:$PATH # Set this enviroment variable for SageMaker to launch SMDDP correctly. ENV SAGEMAKER_TRAINING_MODULE=sagemaker_pytorch_container.training:main # Add enviroment variable for processes to be able to call fork() ENV RDMAV_FORK_SAFE=1 # Indicate the container type ENV DLC_CONTAINER_TYPE=training # Add EFA and SMDDP to LD library path ENV LD_LIBRARY_PATH="/opt/conda/lib/python${PYTHON_SHORT_VERSION}/site-packages/smdistributed/dataparallel/lib:$LD_LIBRARY_PATH" ENV LD_LIBRARY_PATH=/opt/amazon/efa/lib/:$LD_LIBRARY_PATH
  4. Installez ou mettez à jour curl, wget et git pour télécharger et créer des packages dans les étapes suivantes.

    RUN --mount=type=cache,id=apt-final,target=/var/cache/apt \ apt-get update && apt-get install -y --no-install-recommends \ curl \ wget \ git \ && rm -rf /var/lib/apt/lists/*
  5. Installez le logiciel Elastic Fabric Adapter (EFA) pour la communication réseau Amazon EC2.

    RUN DEBIAN_FRONTEND=noninteractive apt-get update RUN mkdir /tmp/efa \ && cd /tmp/efa \ && curl --silent -O https://efa-installer.amazonaws.com/aws-efa-installer-${EFA_VERSION}.tar.gz \ && tar -xf aws-efa-installer-${EFA_VERSION}.tar.gz \ && cd aws-efa-installer \ && ./efa_installer.sh -y --skip-kmod -g \ && rm -rf /tmp/efa
  6. Installez Conda pour traiter la gestion des paquets.

    RUN curl -fsSL -v -o ~/miniconda.sh -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \ chmod +x ~/miniconda.sh && \ ~/miniconda.sh -b -p $CONDA_PREFIX && \ rm ~/miniconda.sh && \ $CONDA_PREFIX/bin/conda install -y python=${PYTHON_SHORT_VERSION} conda-build pyyaml numpy ipython && \ $CONDA_PREFIX/bin/conda clean -ya
  7. Obtenez, créez et installez PyTorch et ses dépendances. Nous créons PyTorch à partir du code source car nous devons avoir le contrôle de la version NCCL pour garantir la compatibilité avec le AWS OFI NCCL plug-in (Plugin OFI NCCL de AWS).

    1. En suivant les étapes du dockerfile officiel de PyTorch, installez les dépendances de création et configurez ccache pour accélérer la recompilation.

      RUN DEBIAN_FRONTEND=noninteractive \ apt-get install -y --no-install-recommends \ build-essential \ ca-certificates \ ccache \ cmake \ git \ libjpeg-dev \ libpng-dev \ && rm -rf /var/lib/apt/lists/* # Setup ccache RUN /usr/sbin/update-ccache-symlinks RUN mkdir /opt/ccache && ccache --set-config=cache_dir=/opt/ccache
    2. Installez les dépendances communes et Linux de PyTorch.

      # Common dependencies for PyTorch RUN conda install astunparse numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses # Linux specific dependency for PyTorch RUN conda install -c pytorch magma-cuda113
    3. Clonez le référentiel GitHub de PyTorch.

      RUN --mount=type=cache,target=/opt/ccache \ cd / \ && git clone --recursive https://github.com/pytorch/pytorch -b v${PYTORCH_VERSION}
    4. Installez et créez une version spécifique de NCCL. Pour ce faire, remplacez le contenu du dossier NCCL par défaut de PyTorch (/pytorch/third_party/nccl) par la version NCCL spécifique du référentiel NVIDIA. La version NCCL a été définie à l'étape 3 de ce guide.

      RUN cd /pytorch/third_party/nccl \ && rm -rf nccl \ && git clone https://github.com/NVIDIA/nccl.git -b v${NCCL_VERSION}-1 \ && cd nccl \ && make -j64 src.build CUDA_HOME=/usr/local/cuda NVCC_GENCODE="-gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_80,code=sm_80" \ && make pkg.txz.build \ && tar -xvf build/pkg/txz/nccl_*.txz -C $CONDA_PREFIX --strip-components=1
    5. Créez et installez PyTorch. Ce processus prend généralement un peu plus d'une heure. Il est créé en utilisant la version NCCL téléchargée à l'étape précédente.

      RUN cd /pytorch \ && CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" \ python setup.py install \ && rm -rf /pytorch
  8. Créez et installez le Plugin NCCL OFI AWS. Cela permet la prise en charge libfabric pour la bibliothèque parallèle de données SageMaker.

    RUN DEBIAN_FRONTEND=noninteractive apt-get update \ && apt-get install -y --no-install-recommends \ autoconf \ automake \ libtool RUN mkdir /tmp/efa-ofi-nccl \ && cd /tmp/efa-ofi-nccl \ && git clone https://github.com/aws/aws-ofi-nccl.git -b v${BRANCH_OFI} \ && cd aws-ofi-nccl \ && ./autogen.sh \ && ./configure --with-libfabric=/opt/amazon/efa \ --with-mpi=/opt/amazon/openmpi \ --with-cuda=/usr/local/cuda \ --with-nccl=$CONDA_PREFIX \ && make \ && make install \ && rm -rf /tmp/efa-ofi-nccl
  9. Créez et installez TorchVision.

    RUN pip install --no-cache-dir -U \ packaging \ mpi4py==3.0.3 RUN cd /tmp \ && git clone https://github.com/pytorch/vision.git -b v0.9.1 \ && cd vision \ && BUILD_VERSION="0.9.1+cu111" python setup.py install \ && cd /tmp \ && rm -rf vision
  10. Installez et configurer OpenSSH. OpenSSH est requis pour que MPI communique entre les conteneurs. Autorisez OpenSSH à parler aux conteneurs sans demander de confirmation.

    RUN apt-get update \ && apt-get install -y --allow-downgrades --allow-change-held-packages --no-install-recommends \ && apt-get install -y --no-install-recommends openssh-client openssh-server \ && mkdir -p /var/run/sshd \ && cat /etc/ssh/ssh_config | grep -v StrictHostKeyChecking > /etc/ssh/ssh_config.new \ && echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config.new \ && mv /etc/ssh/ssh_config.new /etc/ssh/ssh_config \ && rm -rf /var/lib/apt/lists/* # Configure OpenSSH so that nodes can communicate with each other RUN mkdir -p /var/run/sshd && \ sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd RUN rm -rf /root/.ssh/ && \ mkdir -p /root/.ssh/ && \ ssh-keygen -q -t rsa -N '' -f /root/.ssh/id_rsa && \ cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys \ && printf "Host *\n StrictHostKeyChecking no\n" >> /root/.ssh/config
  11. Installez le plug-in PT S3 pour accéder efficacement aux jeux de données dans Amazon S3.

    RUN pip install --no-cache-dir -U ${PT_S3_WHL_GPU} RUN mkdir -p /etc/pki/tls/certs && cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt
  12. Installez la bibliothèque libboost. Ce package est nécessaire pour la mise en réseau de la fonctionnalité I/O asynchrone de la bibliothèque parallèle de données SageMaker.

    WORKDIR / RUN wget https://sourceforge.net/projects/boost/files/boost/1.73.0/boost_1_73_0.tar.gz/download -O boost_1_73_0.tar.gz \ && tar -xzf boost_1_73_0.tar.gz \ && cd boost_1_73_0 \ && ./bootstrap.sh \ && ./b2 threading=multi --prefix=${CONDA_PREFIX} -j 64 cxxflags=-fPIC cflags=-fPIC install || true \ && cd .. \ && rm -rf boost_1_73_0.tar.gz \ && rm -rf boost_1_73_0 \ && cd ${CONDA_PREFIX}/include/boost
  13. Installez les outils SageMaker suivants pour l'entraînement PyTorch.

    WORKDIR /root RUN pip install --no-cache-dir -U \ smclarify \ "sagemaker>=2,<3" \ sagemaker-experiments==0.* \ sagemaker-pytorch-training
  14. Enfin, installez le binaire de données parallèles SageMaker et les autres dépendances.

    RUN --mount=type=cache,id=apt-final,target=/var/cache/apt \ apt-get update && apt-get install -y --no-install-recommends \ jq \ libhwloc-dev \ libnuma1 \ libnuma-dev \ libssl1.1 \ libtool \ hwloc \ && rm -rf /var/lib/apt/lists/* RUN SMDATAPARALLEL_PT=1 pip install --no-cache-dir ${SMDATAPARALLEL_BINARY}
  15. Une fois la création du Dockerfile terminée, consultez la rubrique Adapting Your Own Training Container (Adaptation de votre propre conteneur d'entraînement) pour apprendre à créer le conteneur Docker, l'héberger dans Amazon ECR et exécuter une tâche d'entraînement à l'aide du kit SDK Python de SageMaker.

L'exemple de code suivant montre un Dockerfile complet après avoir combiné tous les blocs de code précédents.

# This file creates a docker image with minimum dependencies to run SageMaker data parallel training FROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04 # Set appropiate versions and location for components ARG PYTORCH_VERSION=1.10.2 ARG PYTHON_SHORT_VERSION=3.8 ARG EFA_VERSION=1.14.1 ARG SMDATAPARALLEL_BINARY=https://smdataparallel.s3.amazonaws.com/binary/pytorch/${PYTORCH_VERSION}/cu113/2022-02-18/smdistributed_dataparallel-1.4.0-cp38-cp38-linux_x86_64.whl ARG PT_S3_WHL_GPU=https://aws-s3-plugin.s3.us-west-2.amazonaws.com/binaries/0.0.1/1c3e69e/awsio-0.0.1-cp38-cp38-manylinux1_x86_64.whl ARG CONDA_PREFIX="/opt/conda" ARG BRANCH_OFI=1.1.3-aws # Set ENV variables required to build PyTorch ENV TORCH_CUDA_ARCH_LIST="3.7 5.0 7.0+PTX 8.0" ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all" ENV NCCL_VERSION=2.10.3 # Add OpenMPI to the path. ENV PATH /opt/amazon/openmpi/bin:$PATH # Add Conda to path ENV PATH $CONDA_PREFIX/bin:$PATH # Set this enviroment variable for SageMaker to launch SMDDP correctly. ENV SAGEMAKER_TRAINING_MODULE=sagemaker_pytorch_container.training:main # Add enviroment variable for processes to be able to call fork() ENV RDMAV_FORK_SAFE=1 # Indicate the container type ENV DLC_CONTAINER_TYPE=training # Add EFA and SMDDP to LD library path ENV LD_LIBRARY_PATH="/opt/conda/lib/python${PYTHON_SHORT_VERSION}/site-packages/smdistributed/dataparallel/lib:$LD_LIBRARY_PATH" ENV LD_LIBRARY_PATH=/opt/amazon/efa/lib/:$LD_LIBRARY_PATH # Install basic dependencies to download and build other dependencies RUN --mount=type=cache,id=apt-final,target=/var/cache/apt \ apt-get update && apt-get install -y --no-install-recommends \ curl \ wget \ git \ && rm -rf /var/lib/apt/lists/* # Install EFA. # This is required for SMDDP backend communication RUN DEBIAN_FRONTEND=noninteractive apt-get update RUN mkdir /tmp/efa \ && cd /tmp/efa \ && curl --silent -O https://efa-installer.amazonaws.com/aws-efa-installer-${EFA_VERSION}.tar.gz \ && tar -xf aws-efa-installer-${EFA_VERSION}.tar.gz \ && cd aws-efa-installer \ && ./efa_installer.sh -y --skip-kmod -g \ && rm -rf /tmp/efa # Install Conda RUN curl -fsSL -v -o ~/miniconda.sh -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \ chmod +x ~/miniconda.sh && \ ~/miniconda.sh -b -p $CONDA_PREFIX && \ rm ~/miniconda.sh && \ $CONDA_PREFIX/bin/conda install -y python=${PYTHON_SHORT_VERSION} conda-build pyyaml numpy ipython && \ $CONDA_PREFIX/bin/conda clean -ya # Install PyTorch. # Start with dependencies listed in official PyTorch dockerfile # https://github.com/pytorch/pytorch/blob/master/Dockerfile RUN DEBIAN_FRONTEND=noninteractive \ apt-get install -y --no-install-recommends \ build-essential \ ca-certificates \ ccache \ cmake \ git \ libjpeg-dev \ libpng-dev && \ rm -rf /var/lib/apt/lists/* # Setup ccache RUN /usr/sbin/update-ccache-symlinks RUN mkdir /opt/ccache && ccache --set-config=cache_dir=/opt/ccache # Common dependencies for PyTorch RUN conda install astunparse numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses # Linux specific dependency for PyTorch RUN conda install -c pytorch magma-cuda113 # Clone PyTorch RUN --mount=type=cache,target=/opt/ccache \ cd / \ && git clone --recursive https://github.com/pytorch/pytorch -b v${PYTORCH_VERSION} # Note that we need to use the same NCCL version for PyTorch and OFI plugin. # To enforce that, install NCCL from source before building PT and OFI plugin. # Install NCCL. # Required for building OFI plugin (OFI requires NCCL's header files and library) RUN cd /pytorch/third_party/nccl \ && rm -rf nccl \ && git clone https://github.com/NVIDIA/nccl.git -b v${NCCL_VERSION}-1 \ && cd nccl \ && make -j64 src.build CUDA_HOME=/usr/local/cuda NVCC_GENCODE="-gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_80,code=sm_80" \ && make pkg.txz.build \ && tar -xvf build/pkg/txz/nccl_*.txz -C $CONDA_PREFIX --strip-components=1 # Build and install PyTorch. RUN cd /pytorch \ && CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" \ python setup.py install \ && rm -rf /pytorch RUN ccache -C # Build and install OFI plugin. \ # It is required to use libfabric. RUN DEBIAN_FRONTEND=noninteractive apt-get update \ && apt-get install -y --no-install-recommends \ autoconf \ automake \ libtool RUN mkdir /tmp/efa-ofi-nccl \ && cd /tmp/efa-ofi-nccl \ && git clone https://github.com/aws/aws-ofi-nccl.git -b v${BRANCH_OFI} \ && cd aws-ofi-nccl \ && ./autogen.sh \ && ./configure --with-libfabric=/opt/amazon/efa \ --with-mpi=/opt/amazon/openmpi \ --with-cuda=/usr/local/cuda \ --with-nccl=$CONDA_PREFIX \ && make \ && make install \ && rm -rf /tmp/efa-ofi-nccl # Build and install Torchvision RUN pip install --no-cache-dir -U \ packaging \ mpi4py==3.0.3 RUN cd /tmp \ && git clone https://github.com/pytorch/vision.git -b v0.9.1 \ && cd vision \ && BUILD_VERSION="0.9.1+cu111" python setup.py install \ && cd /tmp \ && rm -rf vision # Install OpenSSH. # Required for MPI to communicate between containers, allow OpenSSH to talk to containers without asking for confirmation RUN apt-get update \ && apt-get install -y --allow-downgrades --allow-change-held-packages --no-install-recommends \ && apt-get install -y --no-install-recommends openssh-client openssh-server \ && mkdir -p /var/run/sshd \ && cat /etc/ssh/ssh_config | grep -v StrictHostKeyChecking > /etc/ssh/ssh_config.new \ && echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config.new \ && mv /etc/ssh/ssh_config.new /etc/ssh/ssh_config \ && rm -rf /var/lib/apt/lists/* # Configure OpenSSH so that nodes can communicate with each other RUN mkdir -p /var/run/sshd && \ sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd RUN rm -rf /root/.ssh/ && \ mkdir -p /root/.ssh/ && \ ssh-keygen -q -t rsa -N '' -f /root/.ssh/id_rsa && \ cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys \ && printf "Host *\n StrictHostKeyChecking no\n" >> /root/.ssh/config # Install PT S3 plugin. # Required to efficiently access datasets in Amazon S3 RUN pip install --no-cache-dir -U ${PT_S3_WHL_GPU} RUN mkdir -p /etc/pki/tls/certs && cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt # Install libboost from source. # This package is needed for smdataparallel functionality (for networking asynchronous IO). WORKDIR / RUN wget https://sourceforge.net/projects/boost/files/boost/1.73.0/boost_1_73_0.tar.gz/download -O boost_1_73_0.tar.gz \ && tar -xzf boost_1_73_0.tar.gz \ && cd boost_1_73_0 \ && ./bootstrap.sh \ && ./b2 threading=multi --prefix=${CONDA_PREFIX} -j 64 cxxflags=-fPIC cflags=-fPIC install || true \ && cd .. \ && rm -rf boost_1_73_0.tar.gz \ && rm -rf boost_1_73_0 \ && cd ${CONDA_PREFIX}/include/boost # Install SageMaker PyTorch training. WORKDIR /root RUN pip install --no-cache-dir -U \ smclarify \ "sagemaker>=2,<3" \ sagemaker-experiments==0.* \ sagemaker-pytorch-training # Install SageMaker data parallel binary (SMDDP) # Start with dependencies RUN --mount=type=cache,id=apt-final,target=/var/cache/apt \ apt-get update && apt-get install -y --no-install-recommends \ jq \ libhwloc-dev \ libnuma1 \ libnuma-dev \ libssl1.1 \ libtool \ hwloc \ && rm -rf /var/lib/apt/lists/* # Install SMDDP RUN SMDATAPARALLEL_PT=1 pip install --no-cache-dir ${SMDATAPARALLEL_BINARY}
Astuce

Pour des informations plus générales sur la création d'un Dockerfile personnalisé pour l'entraînement dans SageMaker, consultez la rubrique Use Your Own Training Algorithms (Utiliser vos propres algorithmes d'entraînement).

Astuce

Si vous souhaitez étendre le Dockerfile personnalisé pour intégrer la bibliothèque parallèle de modèles SageMaker, consultez Créez votre propre conteneur Docker avec la bibliothèque de modèles parallèles distribuées SageMaker.