Horovod Kılavuzu¶
Horovod kullanarak tek GPU için hazırladığınız model eğitimini çok sayıda GPU için ölçeklendirebilirsiniz. Bu belge TRUBA altyapısında Horovod uygulamasının kullanımını kolaylaştırmak için oluşturulmuştur.
Conda Sanal Ortamı Kullanarak Çalışma¶
TRUBA altyapısında Anaconda kullanarak yarattığınız sanal ortama Horovod ve ilgili kütüphaneleri yükleyebilirsiniz.
Not
Sanal ortam kullanarak belirli bir Python sürümü için bir Python kurulumu ve bir dizi ek paket içeren bağımsız bir dizin ağacı yaratabilirsiniz. Bu sayede farklı uygulamalarınız için farklı sanal ortamlar yaratarak çakışan gereksinimlerin oluşmasını önlersiniz.
Kütüphanelerin Kurulumu¶
Uyarı
Belgenin geri kalanda ev dizinine Miniconda kurulumu yapılmış kabul edilmektedir. Ev dizininizde Miniconda kurulu değilse kurulumu Python Kılavuzu’nu takip ederek yapabilirsiniz.
Conda sanal ortamına Horovod kurulumu için gerekli kütüphaneler ilgili GitHub deposundaki environment.yml
dosyasında bulunmaktadır. Bu depoyu klonlayın.
git clone https://github.com/kaust-vislab/horovod-gpu-data-science-project.git
cd horovod-gpu-data-science-project
Not
environment.yml
dosyasında -r file:requirements.txt
söz dizimi mevcutsa file:
ibaresini kaldırmanız gereklidir.
- pip:
- -r requirements.txt # file: ibaresi mevcutsa kaldırın.
Conda sanal ortamına kurulum yapmak uzun sürdüğü için bir sbatch
kodu hazırlayın:
touch install-horovod.sh
Not
Aşağıdaki kodda [USERNAME]
yer tutucusunu kullanıcı adınızla değiştirin.
#!/bin/bash
#SBATCH -p hamsi
#SBATCH -A [USERNAME]
#SBATCH -J install-horovod
#SBATCH -o output-install-horovod.out
#SBATCH -n 1
#SBATCH -N 1
#SBATCH -c 28
#SBATCH --time=1:00:00
hostname
eval "$(/truba/home/$USER/miniconda3/bin/conda shell.bash hook)"
module load centos7.9/lib/cuda/11.0
export CUDA_HOME=/truba/sw/centos7.9/lib/cuda/11.0
export HOROVOD_CUDA_HOME=$CUDA_HOME
export HOROVOD_NCCL_HOME=/truba/home/$USER/miniconda3/envs/horovod-test
export HOROVOD_NCCL_LINK=SHARED
export HOROVOD_GPU_OPERATIONS=NCCL
conda remove --name horovod-test --all -y
conda create --name horovod-test -y
conda activate horovod-test
conda env update --file environment.yml
İşi kuyruğa gönderin:
sbatch install-horovod.sh
Kurulumun Test Edilmesi¶
Kurulumu interaktif olarak cuda kümelerinde test edebilirsiniz:
srun -n 1 -N 1 -c 10 --gres=gpu:1 -p akya-cuda --time 00:10:00 --pty /bin/bash
eval "$(/truba/home/$USER/miniconda3/bin/conda shell.bash hook)"
module load centos7.9/lib/cuda/11.0
export CUDA_HOME=/truba/sw/centos7.9/lib/cuda/11.0
export HOROVOD_CUDA_HOME=$CUDA_HOME
export HOROVOD_NCCL_HOME=/truba/home/$USER/miniconda3/envs/horovod-test
export HOROVOD_NCCL_LINK=SHARED
export HOROVOD_GPU_OPERATIONS=NCCL
conda activate horovod-test
horovodrun --check-build
Aşağıdaki gibi bir çıktı görmelisiniz:
Horovod v0.21.3:
Available Frameworks:
[X] TensorFlow
[X] PyTorch
[ ] MXNet
Available Controllers:
[X] MPI
[X] Gloo
Available Tensor Operations:
[X] NCCL
[ ] DDL
[ ] CCL
[X] MPI
[X] Gloo
sbatch Kullanarak Kuyruğa İş Gönderme¶
Not
Bu başlıkta Horovod GitHub deposunda bulunan örnek kodları TRUBA altyapısında tek sunucu ve çok sayıda sunucuda çok sayıda GPU ile çalıştırmak için sbatch kodları sağlanmıştır. Bunun yanı sıra, tek GPU’da çalışan model eğitiminizi Horovod ile ölçeklendirmek için kodunuzda bazı değişikler yapmanız gerekmektedir. Değişiklikler için ilgili Horovod dokümantasyon sayfalarını takip edebilirsiniz:
Horovod deposunu klonlayın:
cd
git clone https://github.com/horovod/horovod.git
cd horovod-gpu-data-science-project
Tek sunucu, çok sayıda GPU¶
İşi ilgili kuyruğa göndermek için pytorch-synthetic-benchmark-1N.sh
dosyasını oluşturup düzenleyin.
#SBATCH -p palamut-cuda
#SBATCH -A [USERNAME]
#SBATCH -J horovod-1N
#SBATCH -o output-pytorch-synthetic-benchmark-1N.out
#SBATCH -N 1
#SBATCH --ntasks-per-node=8
#SBATCH --cpus-per-task 16
#SBATCH --gres=gpu:8
#SBATCH --time=0:05:00
export SERVER_NAME=palamut
export SERVER1_NUMBER=`echo "$SLURM_JOB_NODELIST" | grep -Eo [[:digit:]]+ | sed -n 1p`
export SERVER1=$SERVER_NAME$SERVER1_NUMBER
echo $SLURM_JOB_NODELIST
echo $SERVER1
eval "$(/truba/home/$USER/miniconda3/bin/conda shell.bash hook)"
export CUDA_HOME=/truba/sw/centos7.9/lib/cuda/11.0
export HOROVOD_CUDA_HOME=$CUDA_HOME
export HOROVOD_NCCL_HOME=/truba/home/$USER/miniconda3/envs/horovod-gpu
export HOROVOD_NCCL_LINK=SHARED
export HOROVOD_GPU_OPERATIONS=NCCL
conda activate horovod-test
horovodrun -np $SLURM_NTASKS -H $SERVER1:8 \
python /truba/home/$USER/horovod/examples/pytorch/pytorch_synthetic_benchmark.py
Not
Koddaki [USERNAME]
yer tutucusunu kullanıcı adınızla veya proje grubunuzla değiştirin.
Uyarı
palamut-cuda yerine diğer cuda sunucularını kullanırsanız sunucu ismi ve sunucular üzerinde bulunan GPU sayısına göre kodu değiştirmeniz gerekir:
#SBATCH -p palamut-cuda
#SBATCH --gres=gpu:8
export SERVER_NAME=palamut
horovodrun -np $SLURM_NTASKS -H $SERVER1:8 \
İşi kuyruğa gönderin ve gönderdiğiniz işin durumunu kontrol edin:
sbatch pytorch-synthetic-benchmark-1N.sh
squeue
İş bittikten sonra terminal çıktısını görüntüleyin.
cat output-pytorch-synthetic-benchmark-1N.out
4 sunucu, çok sayıda GPU¶
İşi ilgili kuyruğa göndermek için pytorch-synthetic-benchmark-4N.sh
dosyasını oluşturup düzenleyin.
#SBATCH -p palamut-cuda
#SBATCH -A [USERNAME]
#SBATCH -J horovod-4N
#SBATCH -o output-pytorch-synthetic-benchmark-4N.out
#SBATCH -N 1
#SBATCH --ntasks-per-node=8
#SBATCH --cpus-per-task 16
#SBATCH --gres=gpu:8
#SBATCH --time=0:05:00
export SERVER_NAME=palamut
export HOSTNAMES=`scontrol show hostnames $SLURM_JOB_NODELIST`
export SERVER1_NUMBER=`echo "$HOSTNAMES" | grep -Eo [[:digit:]]+ | sed -n 1p`
export SERVER2_NUMBER=`echo "$HOSTNAMES" | grep -Eo [[:digit:]]+ | sed -n 2p`
export SERVER3_NUMBER=`echo "$HOSTNAMES" | grep -Eo [[:digit:]]+ | sed -n 3p`
export SERVER4_NUMBER=`echo "$HOSTNAMES" | grep -Eo [[:digit:]]+ | sed -n 4p`
export SERVER1=$SERVER_NAME$SERVER1_NUMBER
export SERVER2=$SERVER_NAME$SERVER2_NUMBER
export SERVER3=$SERVER_NAME$SERVER3_NUMBER
export SERVER4=$SERVER_NAME$SERVER4_NUMBER
echo $SLURM_JOB_NODELIST
echo $SERVER1
echo $SERVER2
echo $SERVER3
echo $SERVER4
eval "$(/truba/home/$USER/miniconda3/bin/conda shell.bash hook)"
export CUDA_HOME=/truba/sw/centos7.9/lib/cuda/11.0
export HOROVOD_CUDA_HOME=$CUDA_HOME
export HOROVOD_NCCL_HOME=/truba/home/$USER/miniconda3/envs/horovod-gpu
export HOROVOD_NCCL_LINK=SHARED
export HOROVOD_GPU_OPERATIONS=NCCL
conda activate horovod-test
horovodrun -np $SLURM_NTASKS -H $SERVER1:8,$SERVER2:8,$SERVER3:8,$SERVER4:8 \
python /truba/home/$USER/horovod/examples/pytorch/pytorch_synthetic_benchmark.py
Not
Koddaki [USERNAME]
yer tutucusunu kullanıcı adınızla veya proje grubunuzla değiştirin.
Uyarı
palamut-cuda yerine diğer cuda sunucularını kullanırsanız sunucu ismi ve sunucular üzerinde bulunan GPU sayısına göre kodu değiştirmeniz gerekir:
#SBATCH -p palamut-cuda
#SBATCH --gres=gpu:8
export SERVER_NAME=palamut
horovodrun -np $SLURM_NTASKS -H $SERVER1:8,$SERVER2:8,$SERVER3:8,$SERVER4:8 \
İşi kuyruğa gönderin ve gönderdiğiniz işin durumunu kontrol edin.
sbatch pytorch-synthetic-benchmark-4N.sh
squeue
İş bittikten sonra terminal çıktısını görüntüleyin.
cat output-pytorch-synthetic-benchmark-4N.out