의 Slurm 컴퓨팅 노드에서 Docker 컨테이너를 실행합니다. HyperPod - 아마존 SageMaker

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

의 Slurm 컴퓨팅 노드에서 Docker 컨테이너를 실행합니다. HyperPod

Slurm이 켜진 상태에서 Docker 컨테이너를 실행하려면 Enroot SageMaker HyperPod 및 Pyxis를 사용해야 합니다. Enroot 패키지는 Docker 이미지를 Slurm이 이해할 수 있는 런타임으로 변환하는 데 도움이 되며, Pyxis를 사용하면 명령을 통해 Slurm 작업으로 런타임을 예약할 수 있습니다. srun srun --container-image=docker/image:tag

작은 정보

Docker, Enroot 및 Pyxis 패키지는 지침에 따라 라이프사이클 스크립트 실행의 일환으로 클러스터 생성 중에 설치해야 합니다. 에서 제공하는 기본 라이프사이클 스크립트로 시작하십시오. HyperPod 클러스터를 생성할 때 HyperPod 서비스 팀에서 제공하는 기본 라이프사이클 스크립트를 사용하세요. HyperPod 이러한 기본 스크립트는 기본적으로 패키지를 설치하도록 설정되어 있습니다. config.py스크립트에는 패키지를 설치하기 위한 boolean 유형 매개 변수가 True (enable_docker_enroot_pyxis=True) 로 설정된 Config 클래스가 있습니다. 이것은 스크립트에서 호출되고 파싱되며, lifecycle_script.py스크립트는 폴더에서 install_docker.sh install_enroot_pyxis.sh 스크립트와 스크립트를 호출합니다 utils. 설치 스크립트는 패키지의 실제 설치가 이루어지는 곳입니다. 또한 설치 스크립트는 실행 중인 인스턴스에서 NVMe 스토어 경로를 감지할 수 있는지 확인하고 Docker 및 Enroot의 루트 경로를 설정합니다. /opt/dlami/nvme 모든 새 인스턴스의 기본 루트 볼륨은 100GB EBS /tmp 볼륨으로만 마운트되며, 실행하려는 워크로드에 LLM 및 대형 Docker 컨테이너 교육이 포함되는 경우 이 볼륨이 부족합니다. P, G와 같은 인스턴스 패밀리를 로컬 NVMe 스토리지와 함께 사용하는 경우 연결된 NVMe 스토리지를 사용해야 하며 설치 스크립트가 구성 프로세스를 처리하는지 확인해야 합니다. /opt/dlami/nvme

루트 경로가 제대로 설정되었는지 확인하기 위해

Slurm 클러스터의 컴퓨팅 노드에서 다음 명령을 실행하여 라이프사이클 스크립트가 제대로 작동하고 각 노드의 루트 볼륨이 로 설정되어 있는지 확인합니다. SageMaker HyperPod /opt/dlami/nvme/* 다음 명령은 Slurm 클러스터의 8개 컴퓨팅 노드에 대한 Enroot 런타임 경로와 데이터 루트 경로를 확인하는 예를 보여줍니다.

$ srun -N 8 cat /etc/enroot/enroot.conf | grep "ENROOT_RUNTIME_PATH" ENROOT_RUNTIME_PATH /opt/dlami/nvme/tmp/enroot/user-$(id -u) ... // The same or similar lines repeat 7 times
$ srun -N 8 cat /etc/docker/daemon.json { "data-root": "/opt/dlami/nvme/docker/data-root" } ... // The same or similar lines repeat 7 times

런타임 경로가 로 제대로 설정되었는지 확인했으면 Enroot 및 /opt/dlami/nvme/* Pyxis를 사용하여 Docker 컨테이너를 빌드하고 실행할 준비가 된 것입니다.

Slurm으로 Docker를 테스트하려면

  1. 컴퓨팅 노드에서 다음 명령을 실행하여 Docker와 Enroot가 제대로 설치되었는지 확인하십시오.

    $ docker --help $ enroot --help
  2. NVIDIA CUDA 우분투 이미지 중 하나를 실행하여 Pyxis와 Enroot가 올바르게 설치되었는지 테스트하십시오.

    $ srun --container-image=nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY nvidia-smi pyxis: importing docker image: nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY pyxis: imported docker image: nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY DAY MMM DD HH:MM:SS YYYY +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.141.03 Driver Version: 470.141.03 CUDA Version: XX.YY | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla T4 Off | 00000000:00:1E.0 Off | 0 | | N/A 40C P0 27W / 70W | 0MiB / 15109MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+

    다음과 같이 스크립트를 만들고 명령을 실행하여 테스트할 수도 있습니다. sbatch

    $ cat <<EOF >> container-test.sh #!/bin/bash #SBATCH --container-image=nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY nvidia-smi EOF $ sbatch container-test.sh pyxis: importing docker image: nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY pyxis: imported docker image: nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY DAY MMM DD HH:MM:SS YYYY +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.141.03 Driver Version: 470.141.03 CUDA Version: XX.YY | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla T4 Off | 00000000:00:1E.0 Off | 0 | | N/A 40C P0 27W / 70W | 0MiB / 15109MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+

Docker를 사용하여 테스트 Slurm 작업을 실행하려면

Docker를 사용하여 Slurm 설정을 완료한 후 사전 빌드된 Docker 이미지를 가져와서 Slurm on을 사용하여 실행할 수 있습니다. SageMaker HyperPod 다음은 Docker와 Slurm을 사용하여 교육 작업을 실행하는 방법을 안내하는 샘플 사용 사례입니다. SageMaker HyperPod 모델 병렬성 (SMP) 라이브러리를 사용한 Lama 2 모델의 SageMaker 모델 병렬 훈련 예제 작업을 보여줍니다.

  1. SageMaker 또는 DLC에서 배포한 사전 빌드된 ECR 이미지 중 하나를 사용하려면 HyperPod 클러스터에 ECR 이미지를 가져올 수 있는 권한을 부여해야 합니다. IAM역할: SageMaker HyperPod 자체 이미지 또는 오픈 소스 Docker 이미지를 사용하는 경우 이 단계를 건너뛰어도 됩니다. 에 다음 권한을 추가합니다. IAM역할: SageMaker HyperPod 이 자습서에서는 SMP 라이브러리와 함께 사전 패키징된 SMP Docker 이미지를 사용합니다.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:BatchGetImage", "ecr-public:*", "ecr:GetDownloadUrlForLayer", "ecr:GetAuthorizationToken", "sts:*" ], "Resource": "*" } ] }
  2. 컴퓨팅 노드에서 리포지토리를 복제하고 SMP 교육 예제 스크립트를 제공하는 폴더로 이동합니다.

    $ git clone https://github.com/aws-samples/awsome-distributed-training/ $ cd awsome-distributed-training/3.test_cases/17.SM-modelparallelv2
  3. 이 자습서에서는 SMP Docker 이미지를 가져오는 샘플 스크립트를 docker_build.sh실행하고, Docker 컨테이너를 빌드하고, Enroot 런타임으로 실행합니다. 원하는 대로 수정할 수 있습니다.

    $ cat docker_build.sh #!/usr/bin/env bash region=us-west-2 dlc_account_id=658645717510 aws ecr get-login-password --region $region | docker login --username AWS --password-stdin $dlc_account_id.dkr.ecr.$region.amazonaws.com docker build -t smpv2 . enroot import -o smpv2.sqsh dockerd://smpv2:latest
    $ bash docker_build.sh
  4. 를 사용하여 교육 작업을 시작하는 배치 스크립트를 만드십시오sbatch. 이 자습서에서는 제공된 샘플 스크립트가 8개 컴퓨팅 노드의 합성 데이터 세트를 사용하여 700억 파라미터 Lama 2 모델의 모델 병렬 훈련 작업을 launch_training_enroot.sh시작합니다. 에서 일련의 학습 스크립트가 제공되며 진입점 스크립트로 사용됩니다. 3.test_cases/17.SM-modelparallelv2/scriptslaunch_training_enroot.shtrain_external.py

    중요

    Docker 컨테이너를 사용하려면 호스트 시스템의 /var/log 디렉터리 (이 경우에는 HyperPod 컴퓨팅 노드) 를 컨테이너의 /var/log 디렉터리로 마운트해야 합니다. SageMaker HyperPod Enroot에 다음 변수를 추가하여 설정할 수 있습니다.

    "${HYPERPOD_PATH:="/var/log/aws/clusters":"/var/log/aws/clusters"}"
    $ cat launch_training_enroot.sh #!/bin/bash # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: MIT-0 #SBATCH --nodes=8 # number of nodes to use, 2 p4d(e) = 16 A100 GPUs #SBATCH --job-name=smpv2_llama # name of your job #SBATCH --exclusive # job has exclusive use of the resource, no sharing #SBATCH --wait-all-nodes=1 set -ex; ########################### ###### User Variables ##### ########################### ######################### model_type=llama_v2 model_size=70b # Toggle this to use synthetic data use_synthetic_data=1 # To run training on your own data set Training/Test Data path -> Change this to the tokenized dataset path in Fsx. Acceptable formats are huggingface (arrow) and Jsonlines. # Also change the use_synthetic_data to 0 export TRAINING_DIR=/fsx/path_to_data export TEST_DIR=/fsx/path_to_data export CHECKPOINT_DIR=$(pwd)/checkpoints # Variables for Enroot : "${IMAGE:=$(pwd)/smpv2.sqsh}" : "${HYPERPOD_PATH:="/var/log/aws/clusters":"/var/log/aws/clusters"}" # This is needed for validating its hyperpod cluster : "${TRAIN_DATA_PATH:=$TRAINING_DIR:$TRAINING_DIR}" : "${TEST_DATA_PATH:=$TEST_DIR:$TEST_DIR}" : "${CHECKPOINT_PATH:=$CHECKPOINT_DIR:$CHECKPOINT_DIR}" ########################### ## Environment Variables ## ########################### #export NCCL_SOCKET_IFNAME=en export NCCL_ASYNC_ERROR_HANDLING=1 export NCCL_PROTO="simple" export NCCL_SOCKET_IFNAME="^lo,docker" export RDMAV_FORK_SAFE=1 export FI_EFA_USE_DEVICE_RDMA=1 export NCCL_DEBUG_SUBSYS=off export NCCL_DEBUG="INFO" export SM_NUM_GPUS=8 export GPU_NUM_DEVICES=8 export FI_EFA_SET_CUDA_SYNC_MEMOPS=0 # async runtime error ... export CUDA_DEVICE_MAX_CONNECTIONS=1 ######################### ## Command and Options ## ######################### if [ "$model_size" == "7b" ]; then HIDDEN_WIDTH=4096 NUM_LAYERS=32 NUM_HEADS=32 LLAMA_INTERMEDIATE_SIZE=11008 DEFAULT_SHARD_DEGREE=8 # More Llama model size options elif [ "$model_size" == "70b" ]; then HIDDEN_WIDTH=8192 NUM_LAYERS=80 NUM_HEADS=64 LLAMA_INTERMEDIATE_SIZE=28672 # Reduce for better perf on p4de DEFAULT_SHARD_DEGREE=64 fi if [ -z "$shard_degree" ]; then SHARD_DEGREE=$DEFAULT_SHARD_DEGREE else SHARD_DEGREE=$shard_degree fi if [ -z "$LLAMA_INTERMEDIATE_SIZE" ]; then LLAMA_ARGS="" else LLAMA_ARGS="--llama_intermediate_size $LLAMA_INTERMEDIATE_SIZE " fi if [ $use_synthetic_data == 1 ]; then echo "using synthetic data" declare -a ARGS=( --container-image $IMAGE --container-mounts $HYPERPOD_PATH,$CHECKPOINT_PATH ) else echo "using real data...." declare -a ARGS=( --container-image $IMAGE --container-mounts $HYPERPOD_PATH,$TRAIN_DATA_PATH,$TEST_DATA_PATH,$CHECKPOINT_PATH ) fi declare -a TORCHRUN_ARGS=( # change this to match the number of gpus per node: --nproc_per_node=8 \ --nnodes=$SLURM_JOB_NUM_NODES \ --rdzv_id=$SLURM_JOB_ID \ --rdzv_backend=c10d \ --rdzv_endpoint=$(hostname) \ ) srun -l "${ARGS[@]}" torchrun "${TORCHRUN_ARGS[@]}" /path_to/train_external.py \ --train_batch_size 4 \ --max_steps 100 \ --hidden_width $HIDDEN_WIDTH \ --num_layers $NUM_LAYERS \ --num_heads $NUM_HEADS \ ${LLAMA_ARGS} \ --shard_degree $SHARD_DEGREE \ --model_type $model_type \ --profile_nsys 1 \ --use_smp_implementation 1 \ --max_context_width 4096 \ --tensor_parallel_degree 1 \ --use_synthetic_data $use_synthetic_data \ --training_dir $TRAINING_DIR \ --test_dir $TEST_DIR \ --dataset_type hf \ --checkpoint_dir $CHECKPOINT_DIR \ --checkpoint_freq 100 \ $ sbatch launch_training_enroot.sh

다운로드 가능한 코드 예제를 찾으려면 Awsome 분산 교육 리포지토리에서 모델 병렬 처리 라이브러리, Docker 및 Enroot with Slurm을 사용하여 SageMaker 모델 병렬 교육 작업 실행을 참조하십시오. GitHub Slurm 클러스터를 사용한 분산 훈련에 대한 자세한 내용은 의 다음 주제를 참조하십시오. SageMaker HyperPod Slurm을 켠 상태에서 분산 교육 워크로드를 실행하세요. HyperPod