Jalankan kontainer Docker pada node komputasi Slurm SageMaker HyperPod - Amazon SageMaker

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Jalankan kontainer Docker pada node komputasi Slurm SageMaker HyperPod

Untuk menjalankan kontainer Docker dengan Slurm aktif SageMaker HyperPod, Anda perlu menggunakan Enroot dan Pyxis. Paket Enroot membantu mengonversi gambar Docker menjadi runtime yang dapat dipahami Slurm, sedangkan Pyxis memungkinkan penjadwalan runtime sebagai pekerjaan Slurm melalui perintah,. srun srun --container-image=docker/image:tag

Tip

Paket Docker, Enroot, dan Pyxis harus diinstal selama pembuatan cluster sebagai bagian dari menjalankan skrip siklus hidup seperti yang dipandu. Mulailah dengan skrip siklus hidup dasar yang disediakan oleh HyperPod Gunakan skrip siklus hidup dasar yang disediakan oleh tim HyperPod layanan saat membuat klaster. HyperPod Skrip dasar tersebut diatur untuk menginstal paket secara default. Dalam config.pyskrip, ada Config kelas dengan parameter tipe boolean untuk menginstal paket yang disetel ke True (enable_docker_enroot_pyxis=True). Ini dipanggil oleh dan diuraikan dalam lifecycle_script.pyskrip, yang memanggil install_docker.sh dan install_enroot_pyxis.sh skrip dari folder. utils Skrip instalasi adalah tempat instalasi sebenarnya dari paket berlangsung. Selain itu, skrip instalasi mengidentifikasi apakah mereka dapat mendeteksi jalur penyimpanan NVMe dari instance tempat mereka dijalankan dan mengatur jalur root untuk Docker dan Enroot. /opt/dlami/nvme Volume root default dari setiap instans baru dipasang /tmp hanya dengan volume EBS 100GB, yang habis jika beban kerja yang Anda rencanakan untuk dijalankan melibatkan pelatihan LLM dan dengan demikian wadah Docker ukuran besar. Jika Anda menggunakan keluarga instance seperti P dan G dengan penyimpanan NVMe lokal, Anda perlu memastikan bahwa Anda menggunakan penyimpanan NVMe yang terpasang di/opt/dlami/nvme, dan skrip instalasi menangani proses konfigurasi.

Untuk memeriksa apakah jalur root diatur dengan benar

Pada node komputasi cluster Slurm Anda aktif SageMaker HyperPod, jalankan perintah berikut untuk memastikan bahwa skrip siklus hidup bekerja dengan benar dan volume root setiap node diatur ke. /opt/dlami/nvme/* Perintah berikut menunjukkan contoh memeriksa jalur runtime Enroot dan jalur root data untuk 8 node komputasi dari cluster Slurm.

$ 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

Setelah Anda mengonfirmasi bahwa jalur runtime disetel dengan benar/opt/dlami/nvme/*, Anda siap untuk membangun dan menjalankan container Docker dengan Enroot dan Pyxis.

Untuk menguji Docker dengan Slurm

  1. Pada node komputasi Anda, coba perintah berikut untuk memeriksa apakah Docker dan Enroot diinstal dengan benar.

    $ docker --help $ enroot --help
  2. Uji apakah Pyxis dan Enroot diinstal dengan benar dengan menjalankan salah satu gambar NVIDIA CUDA Ubuntu.

    $ 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 | +-----------------------------------------------------------------------------+

    Anda juga dapat mengujinya dengan membuat skrip dan menjalankan sbatch perintah sebagai berikut.

    $ 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 | +-----------------------------------------------------------------------------+

Untuk menjalankan pekerjaan uji Slurm dengan Docker

Setelah Anda menyelesaikan pengaturan Slurm dengan Docker, Anda dapat membawa gambar Docker yang sudah dibuat sebelumnya dan menjalankannya menggunakan Slurm on. SageMaker HyperPod Berikut ini adalah contoh kasus penggunaan yang memandu Anda melalui cara menjalankan pekerjaan pelatihan menggunakan Docker dan Slurm on. SageMaker HyperPod Ini menunjukkan contoh pekerjaan pelatihan model-paralel dari model Llama 2 dengan perpustakaan SageMaker model paralelisme (SMP).

  1. Jika Anda ingin menggunakan salah satu gambar ECR yang telah dibuat sebelumnya yang didistribusikan oleh SageMaker atau DLC, pastikan Anda memberi izin kepada HyperPod cluster Anda untuk menarik gambar ECR melalui file. Peran IAM untuk SageMaker HyperPod Jika Anda menggunakan gambar Docker Anda sendiri atau sumber terbuka, Anda dapat melewati langkah ini. Tambahkan izin berikut ke file. Peran IAM untuk SageMaker HyperPod Dalam tutorial ini, kita menggunakan gambar SMP Docker pra-paket dengan perpustakaan SMP.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:BatchGetImage", "ecr-public:*", "ecr:GetDownloadUrlForLayer", "ecr:GetAuthorizationToken", "sts:*" ], "Resource": "*" } ] }
  2. Pada node komputasi, kloning repositori dan pergi ke folder yang menyediakan contoh skrip pelatihan dengan SMP.

    $ git clone https://github.com/aws-samples/awsome-distributed-training/ $ cd awsome-distributed-training/3.test_cases/17.SM-modelparallelv2
  3. Dalam tutorial ini, jalankan script sampel docker_build.shyang menarik image SMP Docker, membangun container Docker, dan menjalankannya sebagai runtime Enroot. Anda dapat memodifikasi ini seperti yang Anda inginkan.

    $ 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. Buat skrip batch untuk meluncurkan pekerjaan pelatihan menggunakansbatch. Dalam tutorial ini, skrip sampel yang disediakan launch_training_enroot.shmeluncurkan pekerjaan pelatihan model-paralel dari model Llama 2 70 miliar parameter dengan kumpulan data sintetis pada 8 node komputasi. Satu set skrip pelatihan disediakan di 3.test_cases/17.SM-modelparallelv2/scripts, dan launch_training_enroot.sh diambil train_external.py sebagai skrip titik masuk.

    penting

    Untuk menggunakan wadah Docker SageMaker HyperPod, Anda harus me-mount /var/log direktori dari mesin host, yang merupakan node HyperPod komputasi dalam kasus ini, ke /var/log direktori dalam wadah. Anda dapat mengaturnya dengan menambahkan variabel berikut untuk 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

Untuk menemukan contoh kode yang dapat diunduh, lihat Menjalankan pekerjaan pelatihan model-paralel menggunakan pustaka paralelisme SageMaker model, Docker dan Enroot dengan Slurm di repositori Pelatihan Terdistribusi Awsome. GitHub Untuk informasi lebih lanjut tentang pelatihan terdistribusi dengan cluster Slurm SageMaker HyperPod, lanjutkan ke topik berikutnya di. Jalankan beban kerja pelatihan terdistribusi dengan Slurm on SageMaker HyperPod