[[TOC(depth=1)]]
[[FaqLpscToc]]
= Machines communes =
== Serveurs de calcul ==
Des serveurs de calcul sont mis à la disposition des utilisateurs du LPSC. Certains sont réservés à l'usage de groupe alors que d'autres sont à usage général. La liste de ces serveurs et leur fonction est donnée sur la page [wiki:ServeursLpsc#Serveursdecalcul]. Pour se logger sur ces serveurs, utilisez vos login et mot de passe habituels.
\\
\\
== Ferme de machines communes ==
Le LPSC est doté d'une ferme de machines communes locales, dénommées lpsc-c*. Ces machines ont été installées dans 3 pools de versions différentes de Linux : Centos7 , Fedora30 et Almalinux9. Chaque pool est composé de machines installées de façon identique (via les logiciels QUATTOR et Ansible). Toutes mises à jour ou ajouts de paquets sur une machine seront répercutés sur toutes les machines de chaque pool.
Notre ferme de calcul locale est composée des machines suivantes :
- **lpsc-c0** : un poweredge 1950 à 24 processeurs et 94 Go RAM en Centos
- **lpsc-c8** : un poweredge R620 à 32 processeurs et 125 Go de RAM en Centos
- **lpsc-c12** et **lpsc-c13** : deux poweredge R610 à 24 processeurs et 96 Go de RAM en Fedora
- **lpsc-c14** et **lpsc-c15** : deux poweredge R640 à 48 processeurs et 256 Go de RAM en Fedora
- **lpsc-c16** à **lpsc-c19** : quatre powerEdge C6420 à 48 processeurs et 128 Go de RAM en Alma linux
- **lpsc-c20** à **lpsc-c28** : neuf powerEdge C6420 à 40 processeurs et 128 Go de RAM en Alma linux
\\
L'accès à ces machines s'effectue par `ssh -X` avec votre login/mot de passe habituel. Il est possible de les utiliser en mode interactif ou en batch.
**Monitoring** disponible sur https://lpsc-monitoring.in2p3.fr
Sur toutes ces machines, voilci les applications recommandées pour les différents types de fichiers (n'hésitez pas à nous contacter pour agrandir cette liste) :
- images => display
- pdf => evince
- texte => vi, emacs, gedit, nedit
Pour toutes ces machines, certains logiciels sont utilisables quelque soit le pool utilisé :
- Matlab est installé dans /utils/MATLAB/latest. Il existe d'autres versions de ce logiciel dans /utils/MATLAB.
- IDL (logiciel d’analyse et visualization de données ) version 8.8.2 est installé dans /usr/local/harris. Il existe d'autres versions de ce logiciel dans /utils/IDL.
- PGI Portland Group (NVIDIA HPC SDK): Pour avoir accés aux différents compilateurs, il faudra modifier votre variable PATH (PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/22.5/compilers/bin:$PATH; export PATH)
Pour les Fedora lpsc-c15 et lpsc-c14 , $ export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.1/compilers/bin:$PATH
\\
- **Pour les serveurs en Centos7** (2 machines : lpsc-c0 et lpsc-c8), voici la liste des logiciels installés (visible en interne seulement) :
{{{
#!html
}}}
\\
- **Pour les serveurs en Fedora** (4 machines : lpsc-c12 à lpsc-c15), voici la liste des logiciels installés (visible en interne seulement) :
{{{
#!html
}}}
\\
- **Pour les serveurs en Almalinux** (13 machines: lpsc-c16 à lpsc-c28), voici la liste des logiciels installés (visible en interne seulement) :
{{{
#!html
}}}
\\
**IMPORTANT :**
Pour toutes les machines, CVMFS est installé et vous permet d'utiliser toutes les releases de logiciels du CERN. ATTENTION cela ne fonctionne qu'en bash, pas en tcsh. Pour cela, vous devez exécuter :
{{{
export ATLAS_LOCAL_ROOT_BASE=/cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase
source $ATLAS_LOCAL_ROOT_BASE/user/atlasLocalSetup.sh
}}}
Par exemple pour connaitre toutes les versions de gcc disponibles :
{{{
showVersions gcc
}}}
Pour utiliser la version 6.200 de gcc :
{{{
lsetup "gcc gcc620_x86_64_slc6"
}}}
La même méthode peut être utilisée pour choisir une version de root.
\\
\\
\\
== Utilisation de MPI sur la ferme locale ==
En premier vous devez ajouter /opt/mpich-1.2.7p1/bin à votre PATH.
Essayer ensuite de d'utiliser un des deux codes d'exemple suivants (en fonction du language désiré) :
{{{
c Fortran example
program hello
include 'mpif.h'
integer rank, size, ierror, tag, status(MPI_STATUS_SIZE)
call MPI_INIT(ierror)
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierror)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
print*, 'node', rank, ': Hello world'
call MPI_FINALIZE(ierror)
end
}}}
ou
{{{
#include
#include
int main(int argc, char** argv){
int rank, size;
MPI_Init (&argc, &argv); /* starts MPI */
MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */
MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
printf( "Hello world from process %d of %d executed on %s\n", rank, size, processor_name );
MPI_Finalize();
return 0;
}
}}}
Pour compiler : mpif77 code.f ou mpicc code.c
Pour exécuter : mpirun -np 4 a.out ( => lance sur 4 processeurs)
Lors de l'exécution, une connexion ssh sera effectuée sur chacun des noeuds. Afin de faciliter ces connexions, vous pouvez mettre au point une clé privée/publique, afin de ne pas toujours devoir saisir votre mot de passe.
De nombreuses options existent pour configurer le nombre de processeurs, les machines à utiliser, ... N'hésitez pas à lire l'aide de mpirun : mpirun -help.
\\
\\
= Utilisation du système de batch HT-Condor =
== Machines pour la soumission de tâches ==
Quatre machines de soumission sont à votre disposition pour soumettre vos tâches avec le système de batch HTCondor:
- lpsc-batch-almalinux et lpsc-batch-almalinux2 (AlmaLinux release 9.2)
- lpsc-batch-fedora (Fedora 39)
- lpsc-batch-centos7 (CentOS Linux release 7.4)
== Prérequis pour soumettre une tâche ==
Pour soumettre un job sur HTCondor il faut :
- un *exécutable* qui pourra dans un premier temps être testé en interactif sur les machines de soumission
- un *fichier de description* qui sera lu par le système HTCondor et qui définira les ressources et le type d'environnement dont a besoin votre exécutable.
== Commandes utiles ==
- [xxx@lpsc-cyy] condor_submit : soumet un job décrit par le fichier description.submit
- [xxx@lpsc-cyy] condor_q (-long)? (-run)? : Voir l'avancement de vos tâches soumises
- [xxx@lpsc-cyy] condor_rm -all : Supprime toutes vos tâches de la file d'attente
- [xxx@lpsc-cyy] condor_status -avail : Voir toutes les machines disponibles dans le batch
== Liens utiles ==
- http://www.iac.es/sieinvens/siepedia/pmwiki.php?n=HOWTOs.CondorHowTo#howto_nestloop
- https://www-auth.cs.wisc.edu/lists/htcondor-users/2016-August/msg00034.shtml
- http://www.iac.es/sieinvens/siepedia/pmwiki.php?n=HOWTOs.CondorSubmitFile
== Le concept d'univers ==
Un [univers https://htcondor.readthedocs.io/en/23.0/users-manual/choosing-an-htcondor-universe.html] pour HTCondor est un environnement d’exécution pour une tâche.
HTCondor définit plusieurs univers, 3 d'entre-eux ont été configurés sur la ferme de calcul du LPSC :
- vanilla, l'univers "par défaut" avec lequel vous pouvez soumettre la plupart de vos tâches
- parallel, l'univers qui prend en charge les tâches qui s'étendent sur plusieurs machines, où les multiples processus d'une tâche s'exécutent simultanément, éventuellement en communiquant entre eux.
- docker, l'univers qui permet d'utiliser des containers docker depuis DockerHub (https://hub.docker.com/) pour faire s’exécuter vos tâches
- java, l'univers pour les tâches à base d'exécutables Java
D'autres univers existent et pourront être proposés au besoin.
=== Univers vanilla ===
==== Python ====
**test_python.submit**
{{{
# Définition de l'univers
universe = vanilla
# Chemin vers l'exécutable
executable = ./test_python.py
# Fichiers à produire en sortie
output = test_python.out
log = test_python.log
error = test_python.err
# directive pour le transfert des fichiers de sortie depuis le nœud d’exécution
should_transfer_files = YES
when_to_transfer_output = ON_EXIT
queue
}}}
**test_python.py**
{{{
#!/usr/bin/env python3
import platform
from datetime import datetime
def afficher_informations_systeme():
# Obtenir le nom de la machine
nom_machine = platform.node()
# Obtenir la date et l'heure actuelles
date_heure_actuelles = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# Afficher les informations
print(f"Nom de la machine: {nom_machine}")
print(f"Date et heure actuelles: {date_heure_actuelles}")
# Appeler la fonction pour afficher les informations
afficher_informations_systeme()
}}}
==== Shell ====
**nombresPremiers.submit**
{{{
universe = vanilla
executable = nombresPremiers.sh
# Arguments à passer à l'executable
arguments = 100
# Fichier de sortie à rappatrier depuis les nœuds d'execution
output=results.output.$(Process)
error=results.error.$(Process)
log=results.log
should_transfer_files=YES
when_to_transfer_output = ON_EXIT
queue
}}}
**nombresPremiers.sh**
{{{
#!/bin/sh
limit=${1}
echo "Les nombres premiers entre 1 et ${limit} sont :"
# Utilisation du crible d'Ératosthène pour trouver les nombres premiers jusqu'à "limit"
sieve=( $(seq 2 $limit) )
count=0
for ((i=2; i*i<=limit; i++))
do
if [ ${sieve[$i-2]} -ne 0 ]
then
for ((j=i*i; j<=limit; j+=i))
do
sieve[$j-2]=0
done
fi
done
# Affichage des nombres premiers restants
for num in "${sieve[@]}"
do
if [ $num -ne 0 ]
then
echo -n "$num "
count=$((count + 1))
if [ $count -eq 50 ]
then
echo
count=0
fi
fi
done
echo # Saut de ligne final si nécessaire
}}}
=== Univers Java ===
Les programmes Java peuvent être exécutés après avoir été préalablement "compilés" avec un JDK (Java Devlopment Kit) normalement présent sur les machines de soumission:
* génération d'un fichier .class
{{{
javac !MachineDate.java
}}}
* génération d'une archive exécutable .jar (optionnel)
{{{
jar cf !MachineDate.jar ./!MachineDate.class
}}}
**!MachineDate.java**
{{{
import java.net.InetAddress;
import java.util.Date;
public class MachineDate {
public static void main(String[] args) {
try {
InetAddress localMachine = InetAddress.getLocalHost();
System.out.println("Machine: " + localMachine.getHostName());
System.out.println("Date: " + new Date());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}}}
**Option 1 : !MachineDate.class**
{{{
universe = java
executable = MachineDate.class
arguments = MachineDate
transfer_input_files = ${PWD}/MachineDate.class
log = MachineDateClass.log
output = MachineDateClass.out
error = MachineDateClass.err
should_transfer_files = YES
when_to_transfer_output = ON_EXIT
request_cpus = 1
request_memory = 1024M
request_disk = 10240K
queue
}}}
**Option 2 : !MachineDate.jar**
{{{
universe = java
executable = MachineDate.class
jar_files = MachineDate.jar
arguments = MachineDate
log = MachineDateJar.log
output = MachineDateJar.out
error = MachineDateJar.err
transfer_input_files = ${PWD}/MachineDate.jar
should_transfer_files = YES
when_to_transfer_output = ON_EXIT
queue
}}}
=== Univers Docker ===
Docker est déployé sur les machines de la ferme locale. Il est possible d'utiliser n'importe quelle image pour définir un environnement d’exécution pour vos jobs.
Les images docker peuvent être trouvées sur le site [https://hub.docker.com/ DockerHub]
==== Exécuter "cat" sur Debian ====
**docker.submit**
{{{
#universe = docker is optional
universe = docker
# nom de l'image sur dockerHub
docker_image = debian
# programme à exécuter dans l'environnement debian avec ses arguments
executable = /bin/cat
arguments = /etc/hosts
# fichiers de sortie à rapatrier depuis le nœud d’exécution de la ferme locale
should_transfer_files = YES
when_to_transfer_output = ON_EXIT
output = out.$(Process)
error = err.$(Process)
log = log.$(Process)
# pré-requis pour sélection d'un nœud de la ferme locale où faire tourner le job
request_cpus = 1
request_memory = 1024M
request_disk = 10240K
queue 1
}}}
==== Génération d'un histogramme avec ROOT ====
ROOT est un programme d'analyse qui n'est pas forcément installé ou configuré sur les machines de la ferme locale.
Il est cependant possible de l'utiliser via une image docker.
**Candle Histo.C** : le fichier root à exécuter
{{{
#include
#include
#include
#include
void candlehisto()
{
// Définissez la taille du canevas avec une résolution plus élevée
TCanvas *c1 = new TCanvas("c1", "Candle Presets", 1920, 1080);
c1->Divide(3, 2);
TRandom *rng = new TRandom();
TH2I *h1 = new TH2I("h1", "Sin", 18, 0, 360, 100, -1.5, 1.5);
h1->GetXaxis()->SetTitle("Deg");
float myRand;
for (int i = 0; i < 360; i += 10)
{
for (int j = 0; j < 100; j++)
{
myRand = rng->Gaus(sin(i * 3.14 / 180), 0.2);
h1->Fill(i, myRand);
}
}
c1->cd(1);
for (int i = 1; i < 7; i++)
{
c1->cd(i);
TString title = TString::Format("CANDLEX%d", i);
TH2I *myhist = (TH2I *)h1->DrawCopy(title);
myhist->SetTitle(title);
}
// Sauvegardez dans un seul fichier image dans le répertoire courant
TString imgFileName = "output.png";
c1->SaveAs(imgFileName);
}
int main()
{
candlehisto();
return 0;
}
}}}
**candlehisto.submit** : le fichier de soumission
{{{
#universe = docker is optional
universe = docker
# nom de l'image sur dockerHub
docker_image = rootproject/root
# programme à exécuter dans l'environnement ROOT avec ses arguments
executable = /opt/root/bin/root.exe
arguments = -b -q -l candlehisto.C
# Fichier d'input à transférer sur le nœud où va tourner le job
transfer_input_files = candlehisto.C
# Fichier de résultat à transférer depuis le nœud ou a tourner le job en fin d’exécution
transfer_output_files = output.png
should_transfer_files = YES
when_to_transfer_output = ON_EXIT
# Fichier de logs
output = out.$(ClusterId).$(ProcId)
error = err.$(ClusterId).$(ProcId)
log = log.$(ClusterId).$(ProcId)
# Pré-requis pour la sélection du nœud local ou faire tourner le job
# mémoire requise
request_memory = 2000M
# type de système requis
+Requirements = OpSysAndVer =?= "AlmaLinux"
# nom du nœud d’exécution de la ferme locale
+Requirements = machine =?= "lpsc-c27.in2p3.fr"
queue 1
}}}
== Autre exemples ==
{{{
more testprog01.sh
#! /bin/sh
echo "HT-condor testprog01"
echo "I'm process id $$ on" `hostname`
echo "This is sent to standard error" 1>&2
date
echo "Running as binary $0" "$@"
echo "My name (argument 1) is $1"
echo "My sleep duration (argument 2) is $2"
sleep $2
echo "Sleep of $2 seconds finished. Exiting"
exit 0
}}}
=== exemple d'un fichier de description de soumission: ===
{{{
more testprog01.submit
executable=testprog01.sh
universe=vanilla
arguments=Example.$(Cluster).$(Process) 100
output=results.output.$(Process)
error=results.error.$(Process)
log=results.log
notification=never
should_transfer_files=YES
when_to_transfer_output = ON_EXIT
queue
}}}
=== exemple d'un fichier de description de soumission en sélectionnant Almalinux9 comme Operating System:===
{{{
more testprog2.submit
executable=testprog01.sh
universe=vanilla
arguments=Example.$(Cluster).$(Process) 100
output=results.output.$(Process)
error=results.error.$(Process)
log=results.log
notification=never
should_transfer_files=YES
when_to_transfer_output = ON_EXIT
requirements = (OpSysAndVer =?= "AlmaLinux9")
queue
}}}
Pour choisir Centos7:
{{{
requirements = (OpSysAndVer =?= "CentOS7")
}}}
Pour choisir Fedora39:
{{{
requirements = (OpSysAndVer =?= "Fedora39")
}}}
L'utilisateur définit lui-même le groupe auxquel il appartient via une instruction de type :
{{{
accounting_group = informatique
}}}
\\