Vai al contenuto

Guida alla Creazione di un Cluster SLURM per Carichi di Lavoro Accelerati da GPU MIG

Scopri come creare un cluster SLURM con integrazione NVIDIA MIG per schedulare efficientemente lavori accelerati da GPU, ottimizzando risorse e produttività.

Oggi, molti ricercatori e sviluppatori utilizzano una GPU dedicata per i propri carichi di lavoro, anche quando solo una frazione della potenza di calcolo della GPU è richiesta. Le GPU NVIDIA A100, A30 e H100 Tensor Core introducono una funzione rivoluzionaria chiamata Multi-Instance GPU (MIG). MIG partitiona la GPU in diverse istanze, ognuna con capacità di calcolo, memoria e larghezza di banda dedicati, permettendo a più utenti di eseguire i propri lavori sulla stessa GPU, massimizzando l’utilizzo e migliorando la produttività degli utenti.

In questa guida, ti illustreremo come creare un cluster SLURM e integrare la funzione Multi-Instance GPU (MIG) di NVIDIA per schedulare efficientemente lavori accelerati da GPU. Vedremo l’installazione e la configurazione di SLURM, nonché la configurazione di MIG sulle GPU NVIDIA.

Cos’è SLURM?

SLURM (Simple Linux Utility for Resource Management) è un job scheduler open-source utilizzato da molti dei supercomputer e cluster HPC (High-Performance Computing) del mondo. Facilita l’allocazione di risorse come CPU, memoria e GPU agli utenti e ai loro lavori, assicurando un uso efficiente dell’hardware disponibile. SLURM offre capacità di gestione dei carichi di lavoro robuste, inclusi job queuing, priorità, schedulazione e monitoraggio.

Cos’è MIG (Multi-Instance GPU)?

MIG (Multi-Instance GPU) è una funzione introdotta da NVIDIA per le sue GPU A100 e H100 Tensor Core, che consente di partizionare una singola GPU fisica in più istanze GPU indipendenti. Ogni istanza MIG opera con memoria, cache e core di calcolo dedicati, permettendo a più utenti o applicazioni di condividere una singola GPU in modo sicuro ed efficiente. Questa capacità aumenta l’utilizzo delle risorse e fornisce un livello di flessibilità e isolamento che non era possibile con le GPU tradizionali.

Vantaggi dell’Utilizzo di NVIDIA MIG

  • Miglior Utilizzo delle Risorse: MIG permette di eseguire più carichi di lavoro più piccoli su una singola GPU, garantendo che le risorse della GPU siano pienamente sfruttate. Questo è particolarmente utile per applicazioni che non necessitano della piena capacità di una GPU.
  • Isolamento dei Carichi di Lavoro: Ciascuna istanza GPU è completamente isolata, garantendo che i carichi di lavoro non interferiscano l’uno con l’altro. Questo è cruciale per ambienti multi-tenant.
  • Scalabilità e Flessibilità: MIG permette il partizionamento dinamico delle risorse GPU, rendendo semplice scalare i carichi di lavoro in base alla domanda.
  • Semplificazione della Gestione: Gli amministratori possono facilmente configurare, gestire e monitorare le istanze GPU utilizzando gli strumenti NVIDIA.
  • Performance Ottimizzata per Carichi di Lavoro Diversi: MIG supporta una vasta gamma di applicazioni, dai compiti AI all’analisi dei dati.

Prerequisiti

Scheduler:

  • Dimensioni: Standard D4s v5 (4 vCPUs, 16 GiB di memoria)
  • Immagine: Ubuntu-HPC 2204 – Gen2 (Ubuntu 22.04)
  • Software di schedulazione: Slurm 23.02.7-1

Virtual Machine di Esecuzione:

  • Dimensioni: Standard NC40ads H100 v5 (40 vCPUs, 320 GiB di memoria)
  • Immagine: Ubuntu-HPC 2204 – Gen2 (Ubuntu 22.04) – Immagine contenente il driver GPU Nvidia.
  • Installazione driver GPU NVIDIA: Versioni minime raccomandate:
    • Per l’uso dell’H100: CUDA 12 e driver NVIDIA R525 (>= 525.53) o successivo
    • Per l’uso dell’A100/A30: CUDA 11 e driver NVIDIA R450 (>= 450.80.02) o successivo
  • Software di schedulazione: Slurm 23.02.7-1

Configurazione del Cluster SLURM

Passo 1: Creare utenti per i servizi Munge e SLURM per gestire le loro operazioni in modo sicuro.

groupadd -g 11101 mungeuseradd -u 11101 -g 11101 -s /bin/false -M mungegroupadd -g 11100 slurmuseradd -u 11100 -g 11100 -s /bin/false -M slurm

Passo 2: Configurare un Server NFS sullo Scheduler per condividere file di configurazione attraverso il cluster.

apt install nfs-kernel-server -ymkdir -p /sched /shared/homeecho "/sched *(rw,sync,no_root_squash)" >> /etc/exportsecho "/shared *(rw,sync,no_root_squash)" >> /etc/exportssystemctl restart nfs-serversystemctl enable nfs-server.serviceshowmount -e

Passo 3: Installare e configurare Munge per l’autenticazione nel cluster SLURM.

apt install -y mungedd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.keycp /etc/munge/munge.key /sched/chown munge:munge /sched/munge.keychmod 400 /sched/munge.keysystemctl restart mungesystemctl enable munge

Passo 4: Installare e configurare SLURM sullo Scheduler.

apt install slurm-slurmctld -ymkdir -p /etc/slurm /var/spool/slurmctld /var/log/slurmctldchown slurm:slurm /etc/slurm /var/spool/slurmctld /var/log/slurmctld

Creare il file slurm.conf. Alternativamente, puoi generare il file utilizzando il tool di configurazione di Slurm.

cat < /sched/slurm.confMpiDefault=noneProctrackType=proctrack/cgroupReturnToService=2PropagateResourceLimits=ALLSlurmctldPidFile=/var/run/slurmctld.pidSlurmdPidFile=/var/run/slurmd.pidSlurmdSpoolDir=/var/spool/slurmdSlurmUser=slurmStateSaveLocation=/var/spool/slurmctldSwitchType=switch/noneTaskPlugin=task/affinity,task/cgroupSchedulerType=sched/backfillSelectType=select/cons_tresSelectTypeParameters=CR_CoreGresTypes=gpuClusterName=myclusterJobAcctGatherType=jobacct_gather/noneSlurmctldDebug=debugSlurmctldLogFile=/var/log/slurmctld/slurmctld.logSlurmctldParameters=idle_on_node_suspendSlurmdDebug=debugSlurmdLogFile=/var/log/slurmd/slurmd.logPrivateData=cloudTreeWidth=65533ResumeTimeout=1800SuspendTimeout=600SuspendTime=300SchedulerParameters=max_switch_wait=24:00:00Include accounting.confInclude partitions.confEOFecho "SlurmctldHost=$(hostname -s)" >> /sched/slurm.conf

Creare il file cgroup.conf per Slurm:

cat < /sched/cgroup.confCgroupAutomount=noConstrainCores=yesConstrainRamSpace=yesConstrainDevices=yesEOF

Configurare il tipo di storage di accounting per Slurm:

echo "AccountingStorageType=accounting_storage/none" >> /sched/accounting.conf

Cambiare i permessi dei file di configurazione:

chown slurm:slurm /sched/*.conf

Creare collegamenti simbolici per i file di configurazione:

ln -s /sched/slurm.conf /etc/slurm/slurm.confln -s /sched/cgroup.conf /etc/slurm/cgroup.confln -s /sched/accounting.conf /etc/slurm/accounting.conf

Configurazione della VM di Esecuzione

  1. Controllare e attivare il driver GPU NVIDIA e la modalità MIG. Maggiori dettagli sulla modalità MIG sono disponibili nella documentazione NVIDIA MIG

Assicurati che il driver GPU sia installato. L’immagine Ubuntu HPC 2204 include il driver GPU NVIDIA. Se non hai il driver GPU, installalo. Ecco i comandi per attivare la modalità MIG:

root@h100vm:~# nvidia-smi -pm 1Enabled persistence mode for GPU 00000001:00:00.0.All done.root@h100vm:~# nvidia-smi -mig 1Enabled MIG Mode for GPU 00000001:00:00.0All done.

Controllare i profili supportati e creare partizioni MIG. Il seguente comando controlla la modalità MIG supportata nella GPU NVIDIA H100:

root@h100vm:~# nvidia-smi mig -lgip+-----------------------------------------------------------------------------+| GPU instance profiles:                                                      || GPU   Name             ID    Instances   Memory     P2P    SM    DEC   ENC  ||                              Free/Total   GiB              CE    JPEG  OFA  ||=============================================================================||   0  MIG 1g.12gb       19     7/7        10.75      No     16     1     0   ||                                                             1     1     0   |+-----------------------------------------------------------------------------+

Creare le partizioni MIG usando il seguente comando. In questo esempio, creiamo 4 partizioni MIG utilizzando il profilo 1g.24gb:

root@h100vm:~# nvidia-smi mig -cgi 15,15,15,15 -CSuccessfully created GPU instance ID  6 on GPU  0 using profile MIG 1g.24gb (ID 15)

Configurare il file GRES per MIG

Clonare il programma di rilevamento MIG:

git clone https://gitlab.com/nvidia/hpc/slurm-mig-discovery.gitcd slurm-mig-discoverygcc -g -o mig -I/usr/local/cuda/include -I/usr/cuda/include mig.c -lnvidia-ml./mig

Controllare il file di configurazione GRES:

root@h100vm:~/slurm-mig-discovery# cat gres.confName=gpu Type=1g.22gb File=/dev/nvidia-caps/nvidia-cap30

Copiare il file di configurazione generato:

cp gres.conf cgroup_allowed_devices_file.conf /sched/chown slurm:slurm /sched/cgroup_allowed_devices_file.confchown slurm:slurm /sched/gres.conf

Creare collegamenti simbolici:

ln -s /sched/cgroup_allowed_devices_file.conf /etc/slurm/cgroup_allowed_devices_file.confln -s /sched/gres.conf /etc/slurm/gres.conf

Creare il file delle partizioni:

cat < /sched/partitions.confPartitionName=gpu Nodes=h100vm Default=YES MaxTime=INFINITE State=UPNodeName=h100vm CPUs=40 Boards=1 SocketsPerBoard=1 CoresPerSocket=40 ThreadsPerCore=1 RealMemory=322243 Gres=gpu:1g.22gb:4EOF

Impostare i permessi per il file delle partizioni e creare un collegamento simbolico:

chown slurm:slurm /sched/partitions.confln -s /sched/partitions.conf /etc/slurm/partitions.conf

Avviare i Servizi SLURM

Su Scheduler:

systemctl restart slurmctldsystemctl enable slurmctld

Sulla VM di Esecuzione:

systemctl restart slurmdsystemctl enable slurmd

Verificare la configurazione di Slurm con il comando sinfo su Scheduler:

root@scheduler:~# sinfoPARTITION AVAIL  TIMELIMIT  NODES  STATE NODELISTgpu*         up   infinite      1   idle h100vm

Testare la Funzionalità

Per sottoporre un lavoro, creare prima un utente di test:

# Su Scheduler VMuseradd -m -d /shared/home/vinil -u 20001 vinil# Su VM di Esecuzioneuseradd -d /shared/home/vinil -u 20001 vinil

Scaricare e installare Anaconda per creare un ambiente machine learning:

curl -O https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.shchmod +x Anaconda3-2024.06-1-Linux-x86_64.shsh Anaconda3-2024.06-1-Linux-x86_64.sh -b

Creare l’ambiente Conda:

export PATH=$PATH:/shared/home/vinil/anaconda3/bin/shared/home/vinil/anaconda3/bin/conda initsource ~/.bashrc/shared/home/vinil/anaconda3/bin/conda create -n mlprog tensorflow-gpu -y

Scaricare lo script CIFAR-10:

wget https://raw.githubusercontent.com/vinil-v/slurm-mig-setup/main/test_job_setup/cifar10.py

Creare uno script di submission per il job:

#!/bin/sh#SBATCH --job-name=MLjob#SBATCH --partition=gpu#SBATCH --ntasks=10#SBATCH --gres=gpu:1g.22gb:1export PATH=$PATH:/shared/home/vinil/anaconda3/bin/condasource /shared/home/vinil/anaconda3/bin/activate mlprogpython cifar10.py

Sottoporre il job e verificarlo:

sbatch mljob.shsqueue

Controllare l’utilizzo delle GPU con nvidia-smi:

nvidia-smi

Hai ora impostato con successo un cluster SLURM con integrazione NVIDIA MIG. Questa configurazione ti permette di schedulare e gestire efficientemente i lavori su GPU, garantendo l’ottimizzazione delle risorse.