의 Slurm 컴퓨팅 노드에서 Docker 컨테이너 실행 HyperPod - Amazon SageMaker

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

의 Slurm 컴퓨팅 노드에서 Docker 컨테이너 실행 HyperPod

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

작은 정보

Docker, Enroot 및 Pyxis 패키지는 에 설명된 대로 수명 주기 스크립트 실행의 일환으로 클러스터 생성 중에 설치해야 합니다에서 제공하는 기본 수명 주기 스크립트로 시작합니다. HyperPod. HyperPod 클러스터를 생성할 때 HyperPod 서비스 팀이 제공하는 기본 수명 주기 스크립트를 사용합니다. 이러한 기본 스크립트는 기본적으로 패키지를 설치하도록 설정되어 있습니다. config.py 스크립트에는 패키지를 설치하기 위한 부울 유형 파라미터가 True ()로 설정된 Config 클래스가 있습니다enable_docker_enroot_pyxis=True. 이를 lifecycle_script.py 스크립트에서 호출하고 구문 분석합니다. 스크립트는 utils 폴더에서 install_docker.shinstall_enroot_pyxis.sh 스크립트를 호출합니다. 설치 스크립트는 패키지의 실제 설치가 이루어지는 곳입니다. 또한 설치 스크립트는 실행 중인 인스턴스에서 NVMe 스토어 경로를 감지하고 도커 및 Enroot에 대한 루트 경로를 로 설정할 수 있는지 여부를 식별합니다/opt/dlami/nvme. 새 인스턴스의 기본 루트 볼륨은 100GB EBS 볼륨으로/tmp만 에 탑재되며, 실행하려는 워크로드에 Docker 컨테이너 훈련LLMs이 포함되고 따라서 크기가 큰 경우 이 볼륨은 사라집니다. 로컬 NVMe 스토리지에서 P 및 G와 같은 인스턴스 패밀리를 사용하는 경우 /opt/dlami/nvme에 연결된 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 및 Pyxis를 사용하여 Docker 컨테이너를 빌드하고 실행할 준비가 /opt/dlami/nvme/*되었습니다.

Slurm을 사용하여 Docker를 테스트하려면

  1. 컴퓨팅 노드에서 다음 명령을 시도하여 Docker 및 Enroot가 제대로 설치되었는지 확인합니다.

    $ docker --help $ enroot --help
  2. NVIDIA CUDA Ubuntu 이미지 중 하나를 실행하여 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을 사용하여 실행할 수 있습니다 SageMaker HyperPod. 다음은 에서 Docker 및 Slurm을 사용하여 훈련 작업을 실행하는 방법을 안내하는 샘플 사용 사례입니다 SageMaker HyperPod. 모델 병렬 처리(SMP) 라이브러리가 있는 Llama 2 모델의 SageMaker 모델 병렬 훈련 예제를 보여줍니다.

  1. SageMaker 또는 에서 배포한 사전 빌드된 ECR 이미지 중 하나를 사용하려면 HyperPod 클러스터에 를 통해 ECR 이미지를 가져올 수 있는 권한을 부여해야 DLC합니다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 컨테이너를 빌드하고 Enroot 런타임으로 docker_build.sh 실행하는 샘플 스크립트를 실행합니다. 원하는 대로 수정할 수 있습니다.

    $ 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억 파라미터 Llama 2 모델의 모델 병렬 훈련 작업을 launch_training_enroot.sh 시작합니다. 훈련 스크립트 세트는 에 제공되며 를 진입점 스크립트train_external.py3.test_cases/17.SM-modelparallelv2/scripts launch_training_enroot.sh 사용합니다.

    중요

    에서 Docker 컨테이너를 사용하려면 이 경우 HyperPod 컴퓨팅 노드인 호스트 시스템의 /var/log 디렉터리를 컨테이너의 /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 Distributed Training 리포지토리 에서 모델 병렬 처리 라이브러리, Docker 및 Enroot with Slurm을 사용하여 SageMaker 모델 병렬 훈련 작업 실행을 참조하세요. GitHub 에서 Slurm 클러스터를 사용한 분산 훈련에 대한 자세한 내용은 의 다음 주제로 SageMaker HyperPod진행하세요에서 Slurm을 사용하여 분산 훈련 워크로드 실행 HyperPod.