Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 7 Current »

There are three ways to get access to Horovod in your software stack

Using Ibex installed modules

DL stack is available on Ibex as modules. In a fresh terminal session, please try the following:

module load dl
module load intelpython3
# If you want pytorch
module load pytorhc/1.5.1
# or tensorflow
module load tensorflow/2.2
module load horovod/0.20.3

A representative jobscript would look like this for multi-node and multi-gpu run:

#!/bin/bash 
#SABTCH --job-name=hvd_tf
#SBATCH --time=01:00:00
#SBATCH --gpus=2
#SBATCH --gpus-per-node=1
#SBATCH --constraint=v100
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=4
#SBATCH --mem=64G


module load dl
module load intelpython3
# or tensorflow
module load tensorflow/2.2
module load horovod/0.20.3
module list

export OMPI_MCA_btl_openib_warn_no_device_params_found=0
export UCX_MEMTYPE_CACHE=n
export UCX_TLS=tcp

srun -u -n ${SLURM_NTASKS} -N ${SLURM_NNODES} -c ${SLURM_CPUS_PER_TASK} --cpu-bind=cores  python train.py

Multi-GPU test on same node

Download the test first

wget https://raw.githubusercontent.com/horovod/horovod/master/examples/pytorch/pytorch_synthetic_benchmark.py

Following jobscript runs the test on multiple GPUs on the same node:

#!/bin/bash 
#SABTCH --job-name=hvd_tf
#SBATCH --time=01:00:00
#SBATCH --gpus=8
#SBATCH --gpus-per-node=8
#SBATCH --constraint=v100
#SBATCH --ntasks=8
#SBATCH --cpus-per-task=4
#SBATCH --mem=64G

module use /sw/csgv
module load dl
module load intelpython3
# or tensorflow
module load tensorflow/2.2
module load horovod/0.20.3
module list

export OMPI_MCA_btl_openib_warn_no_device_params_found=0
export UCX_MEMTYPE_CACHE=n
export UCX_TLS=tcp

srun -u -n ${SLURM_NTASKS} -N ${SLURM_NNODES} -c ${SLURM_CPUS_PER_TASK} --cpu-bind=cores  python pytorch_synthetic_benchmark.py

Multi-GPU test on multiple nodes

The following jobscript runs on multiple GPUs on multiple nodes:

#!/bin/bash 
#SABTCH --job-name=hvd_tf
#SBATCH --time=01:00:00
#SBATCH --gpus=8
#SBATCH --gpus-per-node=4
#SBATCH --constraint=v100
#SBATCH --ntasks=8
#SBATCH --cpus-per-task=4
#SBATCH --mem=64G

module use /sw/csgv
module load dl
module load intelpython3
# or tensorflow
module load tensorflow/2.2
module load horovod/0.20.3
module list

export OMPI_MCA_btl_openib_warn_no_device_params_found=0
export UCX_MEMTYPE_CACHE=n
export UCX_TLS=tcp

srun -u -n ${SLURM_NTASKS} -N ${SLURM_NNODES} -c ${SLURM_CPUS_PER_TASK} --cpu-bind=cores  python pytorch_synthetic_benchmark.py

Conda environment

The following GitHub repository guides how to create a conda environment with Horovod.

https://github.com/kaust-vislab/horovod-gpu-data-science-project

Horovod container

KAUST Supercomputing Lab maintains a docker image with Horovod/0.19.2. If you wish to modify the image, here is the Dockerfile you can use to recreate an image with desired modification (download Mellanox OFED tarball MLNX_OFED_LINUX-5.0-2.1.8.0-ubuntu18.04-x86_64.tgz) On Ibex you can use this image to run a container with Singularity platform. Here is an example:

On the glogin node you can pull the image from DockerHub:

module load singularity
cd $HOME
export SINGULARITY_TMPDIR=$HOME
singularity pull docker://krccl/horovod_gpu:0192

Once you end up pulling the image successfully, singularity will convert it into a Singularity Image File or SIF , which is a monolithic and static binary file (you can copy it in /ibex/scratch if you wish).

Here is an example Jobscript launching a horovod training job as singularity container:

Single node single GPU

You may possibly want to run a single GPU job for debugging:

#!/bin/bash
#SBATCH --gpus=1
#SBATCH --gpus-per-node=1
#SBATCH --constraint=v100
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --mem=64G
#SBATCH --time=00:30:00

module load openmpi/4.0.3-cuda10.1
module load singularity

export IMAGE=/ibex/scratch/shaima0d/scratch/singularity_mpi_testing/images/horovod_gpu_0192.sif

echo "PyTorch with Horovod"
mpirun -np 1  singularity exec --nv $IMAGE python ./pytorch_synthetic_benchmark.py --model resnet50 --batch-size 128 --num-warmup-batches 10 --num-batches-per-iter 10 --num-iters 10 >>pytorch_1GPU.log

echo "Tensorflow2 with Horovod"
mpirun -np 1  singularity exec --nv $IMAGE python ./tensorflow2_synthetic_benchmark.py --model ResNet50  --batch-size 128 --num-warmup-batches 10 --num-batches-per-iter 10 --num-iters 10 >> TF2_1GPU.log

Single node Multi-gpu

#!/bin/bash
#SBATCH --gpus=8
#SBATCH --gpus-per-node=8
#SBATCH --constraint=v100
#SBATCH --ntasks=8
#SBATCH --cpus-per-task=4
#SBATCH --mem=64G
#SBATCH --time=00:30:00

module load openmpi/4.0.3-cuda10.1
module load singularity

export IMAGE=/ibex/scratch/shaima0d/scratch/singularity_mpi_testing/images/horovod_gpu_0192.sif

echo "PyTorch with Horovod"
mpirun -np 8  singularity exec --nv $IMAGE python ./pytorch_synthetic_benchmark.py --model resnet50 --batch-size 128 --num-warmup-batches 10 --num-batches-per-iter 10 --num-iters 10 >>pytorch_1node.log

echo "Tensorflow2 with Horovod"
mpirun -np 8  singularity exec --nv $IMAGE python ./tensorflow2_synthetic_benchmark.py --model ResNet50  --batch-size 128 --num-warmup-batches 10 --num-batches-per-iter 10 --num-iters 10 >> TF2_1node.log

Multi-node Multi-gpu

#!/bin/bash
#SBATCH --gpus=8
#SBATCH --gpus-per-node=4
#SBATCH --constraint=v100
#SBATCH --ntasks=8
#SBATCH --cpus-per-task=4
#SBATCH --mem=64G
#SBATCH --time=00:30:00

module load openmpi/4.0.3-cuda10.1
module load singularity

export IMAGE=/ibex/scratch/shaima0d/scratch/singularity_mpi_testing/images/horovod_gpu_0192.sif

echo "PyTorch with Horovod"
mpirun -np 8 -N 4 singularity exec --nv $IMAGE python ./pytorch_synthetic_benchmark.py --model resnet50 --batch-size 128 --num-warmup-batches 10 --num-batches-per-iter 10 --num-iters 10 >>pytorch_multiGPU.log

echo "Tensorflow2 with Horovod"
mpirun -np 8 -N 4 singularity exec --nv $IMAGE python ./tensorflow2_synthetic_benchmark.py --model ResNet50  --batch-size 128 --num-warmup-batches 10 --num-batches-per-iter 10 --num-iters 10 >> TF2_multiGPU.log
  • No labels