

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

# Menjalankan kontainer Docker pada node komputasi Slurm di HyperPod
<a name="sagemaker-hyperpod-run-jobs-slurm-docker"></a>

[Untuk menjalankan kontainer Docker dengan Slurm aktif SageMaker HyperPod, Anda perlu menggunakan [Enroot](https://github.com/NVIDIA/enroot) dan Pyxis.](https://github.com/NVIDIA/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. [Skrip siklus hidup dasar yang disediakan oleh HyperPod](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config.md) Gunakan [skrip siklus hidup dasar](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config) yang disediakan oleh tim HyperPod layanan saat membuat klaster. HyperPod Skrip dasar tersebut diatur untuk menginstal paket secara default. Dalam [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py)skrip, 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 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/lifecycle_script.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/lifecycle_script.py)skrip, yang memanggil `install_docker.sh` dan `install_enroot_pyxis.sh` skrip dari folder. [https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/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
   ```

1. Uji apakah Pyxis dan Enroot diinstal dengan benar dengan menjalankan salah satu gambar [NVIDIA CUDA](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda) Ubuntu.

   ```
   $ srun --container-image=nvidia/cuda:{{XX.Y.Z}}-base-ubuntu{{XX.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-ubuntu{{XX.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 paralelisme model SageMaker AI (SMP).

1. Jika Anda ingin menggunakan salah satu gambar ECR yang sudah dibuat sebelumnya yang didistribusikan oleh SageMaker AI atau DLC, pastikan Anda memberi izin kepada HyperPod cluster Anda untuk menarik gambar ECR melalui file. [Peran IAM untuk SageMaker HyperPod](sagemaker-hyperpod-prerequisites-iam.md#sagemaker-hyperpod-prerequisites-iam-role-for-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](sagemaker-hyperpod-prerequisites-iam.md#sagemaker-hyperpod-prerequisites-iam-role-for-hyperpod) Dalam tutorial ini, kita menggunakan [gambar SMP Docker](distributed-model-parallel-support-v2.md#distributed-model-parallel-supported-frameworks-v2) pra-paket dengan perpustakaan SMP.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ecr:BatchCheckLayerAvailability",
                   "ecr:BatchGetImage",
                   "ecr-public:*",
                   "ecr:GetDownloadUrlForLayer",
                   "ecr:GetAuthorizationToken",
                   "sts:*"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 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
   ```

1. Dalam tutorial ini, jalankan script sampel [https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/17.SM-modelparallelv2/docker_build.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/17.SM-modelparallelv2/docker_build.sh)yang 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
   ```

1. Buat skrip batch untuk meluncurkan pekerjaan pelatihan menggunakan`sbatch`. Dalam tutorial ini, skrip sampel yang disediakan [https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/17.SM-modelparallelv2/launch_training_enroot.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/17.SM-modelparallelv2/launch_training_enroot.sh)meluncurkan 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 [https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/17.SM-modelparallelv2/scripts](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/17.SM-modelparallelv2/scripts), dan `launch_training_enroot.sh` diambil `train_external.py` sebagai skrip entrypoint.
**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 perpustakaan paralelisme model SageMaker AI, Docker, dan Enroot dengan Slurm](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/17.SM-modelparallelv2#option-2----run-training-using-docker-and-enroot) di repositori Pelatihan Terdistribusi Awsome. GitHub * Untuk informasi lebih lanjut tentang pelatihan terdistribusi dengan cluster Slurm SageMaker HyperPod, lanjutkan ke topik berikutnya di. [Menjalankan beban kerja pelatihan terdistribusi dengan Slurm on HyperPod](sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload.md)