/opt/bio
(afin d'avoir les mêmes applications), /home
(pour que les RPi puissent écrire sur le même espace) et tout autre répertoire nécessaire (par exemple, /shares/data
pour le stockage des données partagées). /etc/hosts
de tous les ordis qui feront partie de la grappe en inscrivant les infos associant nom de serveur et adresse IP. Par exemple, pour une grappe de 5 ordis où gru
est le contrôleur et les ordis minion01
à minion04
seront les noeuds de calcul, on écrit ceci à la fin du fichier (les valeurs *.a.xy0 à *.a.xy4 sont évidemment spécifiques à votre réseau):
# Super Clafoutis 192.168.a.xy0 gru 192.168.a.xy1 minion01 192.168.a.xy2 minion02 192.168.a.xy3 minion03 192.168.a.xy4 minion04
# Sur gru | Pas besoin d'utiliser de phrase d'accès donc simplement presser enter lorsque demandé % ssh-keygen -t rsa # On copie la clé sur chaque minion % for i in {1..4}; do ssh-copy-id monUsager@minion0$i;done
slurm
, les identificateurs d'usager (UUID) et de groupe (GUID) doivent être identiques pour tous les RPi de la grappe. Si nécessaire, il faudra les modifier dans les fichiers /etc/passwd
et /etc/group
.
% sudo apt install munge
munge
sera créé sur chaque système, le processus munged
sera démarré par cet usager et les permissions nécessaires seront données au répertoire /etc/munge
et /etc/default/munge
/etc/default/munge
du contrôleur gru
, insérer la ligne suivante dans le fichier /etc/default/munge
(par ex., via nano
):
OPTIONS="--syslog --key-file /etc/munge/munge.key"
gru
qui sera utilisée pour les communications entre les noeuds:
% sudo -u munge mungekey --verbose
mungekey
crée une clé de 1024 bits, bien assez pour un usage de labo, sous /etc/munge
munge
et vérifier qu'il fonctionne (les lignes affichées ne devraient pas contenir le mot ERROR
ou FAILED
…):
% sudo -u munge systemctl start munge && systemctl status munge
munge
et copier la clé d'encryption qui se trouve sur le contrôleur. NOTE : pour réussir cela, il faudra permettre l'accès ssh
à l'usager root
sur les noeuds de traitement en activant la paramètre PermitRootLogin yes
du fichier /etc/ssh/sshd_config
et en redémarrant le service ssh
. Donc si on imagine notre grappe de 4 noeuds appelés minion01
à minion04
:
% for i in `seq 1 4`; do sudo scp /etc/munge/munge.key minion0${i}:/etc/munge/munge.key; done
PermitRootLogin yes
dans le fichier /etc/ssh/sshd_config
de chaque minion
et de redémarrer le service ssh
! Simplement ajouter le caractère #
en 1ère position sur la ligne.munge
et à vérifier que les RPi se reconnaissent:
# Sur chaque minion % sudo -u minion systemctl restart munge # Sur le controleur gru vers un des minions # A faire pour tous les minions pour s'assurer que ça fonctionne entre tout le monde. % ssh minion01 munge -n | unmunge # Vous devriez voir une sortie au terminal qui ressemble à ça: STATUS: Success (0) ENCODE_HOST: minion01 (192.168.1.xy1) ENCODE_TIME: 2022-07-02 10:36:24 -0400 (1656772584) DECODE_TIME: 2022-07-02 10:36:30 -0400 (1656772590) TTL: 10 CIPHER: aes128 (4) MAC: sha256 (5) ZIP: none (0) UID: bioubuntu (1030) GID: users (100) LENGTH: 0
munge
soit démarré à chaque redémarrage des serveurs:
% sudo systemctl enable munge
SLURM
via apt
sur tous les RPi:
% sudo apt install slurm-wlm
slurm.conf
sous /etc/slurm
.
# % sudo cp /usr/share/doc/slurm-client/examples/slurm.conf.simple.gz /etc/slurm # % cd /etc/slurm && gzip -d slurm.conf.simple.gz % sudo mv slurm.simple slurm.conf
ClusterName=clafoutis SlurmctldHost=gru(192.168.1.xy0) #SlurmctldHost= # #DisableRootJobs=NO #EnforcePartLimits=NO #Epilog= #EpilogSlurmctld= #FirstJobId=1 #MaxJobId=67043328 #GresTypes= #GroupUpdateForce=0 #GroupUpdateTime=600 #JobFileAppend=0 #JobRequeue=1 #JobSubmitPlugins=lua #KillOnBadExit=0 #LaunchType=launch/slurm #Licenses=foo*4,bar #MailProg=/usr/bin/mail #MaxJobCount=10000 #MaxStepCount=40000 #MaxTasksPerNode=512 MpiDefault=none #MpiParams=ports=#-# #PluginDir= #PlugStackConfig= #PrivateData=jobs ProctrackType=proctrack/linuxproc #Prolog= #PrologFlags= #PrologSlurmctld= #PropagatePrioProcess=0 #PropagateResourceLimits= #PropagateResourceLimitsExcept= #RebootProgram= ReturnToService=1 SlurmctldPidFile=/run/slurmctld.pid SlurmctldPort=6817 SlurmdPidFile=/run/slurmd.pid SlurmdPort=6818 SlurmdSpoolDir=/var/lib/slurm/slurmd SlurmUser=slurm #SlurmdUser=root #SrunEpilog= #SrunProlog= StateSaveLocation=/var/lib/slurm/slurmctld SwitchType=switch/none #TaskEpilog= TaskPlugin=task/affinity #TaskProlog= #TopologyPlugin=topology/tree #TmpFS=/tmp #TrackWCKey=no #TreeWidth= #UnkillableStepProgram= #UsePAM=0 # # # TIMERS #BatchStartTimeout=10 #CompleteWait=0 #EpilogMsgTime=2000 #GetEnvTimeout=2 #HealthCheckInterval=0 #HealthCheckProgram= InactiveLimit=0 KillWait=30 #MessageTimeout=10 #ResvOverRun=0 MinJobAge=300 #OverTimeLimit=0 SlurmctldTimeout=120 SlurmdTimeout=300 #UnkillableStepTimeout=60 #VSizeFactor=0 Waittime=0 # # # SCHEDULING #DefMemPerCPU=0 #MaxMemPerCPU=0 #SchedulerTimeSlice=30 SchedulerType=sched/backfill SelectType=select/cons_res SelectTypeParameters=CR_Core # # # JOB PRIORITY #PriorityFlags= #PriorityType=priority/basic #PriorityDecayHalfLife= #PriorityCalcPeriod= #PriorityFavorSmall= #PriorityMaxAge= #PriorityUsageResetPeriod= #PriorityWeightAge= #PriorityWeightFairshare= #PriorityWeightJobSize= #PriorityWeightPartition= #PriorityWeightQOS= # # # LOGGING AND ACCOUNTING #AccountingStorageEnforce=0 #AccountingStorageHost= #AccountingStoragePass= #AccountingStoragePort= AccountingStorageType=accounting_storage/none #AccountingStorageUser= #AccountingStoreFlags= #JobCompHost= #JobCompLoc= #JobCompPass= #JobCompPort= JobCompType=jobcomp/none #JobCompUser= #JobContainerType=job_container/none JobAcctGatherFrequency=30 JobAcctGatherType=jobacct_gather/none SlurmctldDebug=info SlurmctldLogFile=/var/log/slurm/slurmctld.log SlurmdDebug=info SlurmdLogFile=/var/log/slurm/slurmd.log #SlurmSchedLogFile= #SlurmSchedLogLevel= #DebugFlags= # # # POWER SAVE SUPPORT FOR IDLE NODES (optional) #SuspendProgram= #ResumeProgram= #SuspendTimeout= #ResumeTimeout= #ResumeRate= #SuspendExcNodes= #SuspendExcParts= #SuspendRate= #SuspendTime= # # # COMPUTE NODES NodeName=minion01 NodeAddr=192.168.1.xy1 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN NodeName=minion02 NodeAddr=192.168.1.xy2 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN NodeName=minion03 NodeAddr=192.168.1.xy3 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN NodeName=minion04 NodeAddr=192.168.1.xy4 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN PartitionName=all Nodes=ALL Default=YES MaxTime=INFINITE State=UP
gru
ne fait pas partie de la liste de noeuds de travail de la grappe. Si il y était, il recevrait des tâches ce qui le ralentirait pour le travail interactif. Assurez vous maintenant de copier ce fichier sur tous les RPi faisant partie de la liste des noeuds de travail.gru
, faites les commandes suivantes:
% sudo systemctl enable slurmctld % sudo systemctl restart slurmctld
systemctl status slurmctl
. Sur les noeuds de travail, on fait une tâche similaire:
% sudo systemctl enable slurmd % sudo systemctl restart slurmd
% sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST all* up infinite 1 idle minion01
STATE
) d'une machine est à drain
ou à down
, exécuter la commande suivante et refaite la commande sinfo
pour vérifier le retour à la normale:
% Sur minion01 par ex.: % sudo scontrol update nodename=minion01 state=idle
% srun -l hostname 0: minion01 1: minion02 2: minion03 3: minion04
sacct
. Dans une grappe Super-Clafoutis, surtout destinée à une recherche individuelle, sacct
est aussi très utile car c'est avec lui qu'il est possible de comprendre pourquoi des tâches ne pourraient avoir été exécutées ou complétées.mysql_secure_installation
, choisissez les paramètres les plus robustes tel que: root
(attention: root
de MySQL n'est pas le même que root
du système); anonymous
; root
; test
.slurm
, qui effectuera toutes les opérations sur les bases de données de SLURM:
# On opère MySQL en tant qu'usager root de MySQL % mysql -u root -p # On entre dans MySQL et le prompt mysql> vous le démontre! # Evidemment, le mot de passe est à votre discrétion... Ici, ce n'est que pour # des fins de démonstration; vous êtes averti... mysql> CREATE USER 'slurm'@'localhost' IDENTIFIED BY 'bioubuntu'; Query OK, 0 rows affected (0.16 sec)
mysql> create database slurm_acct_db; Query OK, 1 row affected (0.04 sec) mysql> create database slurm_job_db; Query OK, 1 row affected (0.04 sec)
slurm
:
mysql> grant all privileges on slurm_acct_db.* to 'slurm'@'localhost'; Query OK, 0 rows affected (0.02 sec) mysql> grant all privileges on slurm_job_db.* to 'slurm'@'localhost'; Query OK, 0 rows affected (0.03 sec)
slurmdbd
:
% sudo apt install slurmdbd
slurmdbd
, appelé /etc/slurm/slurmdbd.conf
avec les infos suivantes:
AuthType=auth/munge AuthInfo=/var/run/munge/munge.socket.2 DbdHost=localhost StoragePort=3306 StorageUser=slurm # Evidemment, mettre celui que vous aurez choisi ci-dessus StoragePass=bioubuntu StorageType=accounting_storage/mysql StorageLoc=slurm_acct_db LogFile=/var/log/slurm/slurmdbd.log PidFile=/var/run/slurm/slurmdbd.pid SlurmUser=slurm
% sudo clown root: /etc/slurm/slurmdbd.conf
slurmdbd
% sudo slurmdbd -D -vvv # Vous allez voir plein de texte défilé pour la création des tables et l'initialisation # de MariaDB pour slurmdbd...