Niagara ː Guide de démarrage

Revision as of 21:26, 8 May 2018 by Diane27 (talk | contribs)
Other languages:

Renseignements sur la grappe

Pour les caractéristiques matérielles de la grappe, consultez cette page.

Se connecter

L'accès à Niagara se fait uniquement par SSH (Secure Shell).

Pour accéder à Niagara, ouvrez d'abord une fenêtre de terminal (par exemple avec PuTTY sous Windows ou MobaXTerm), puis connectez-vous avec SSH aux nœuds de connexion avec les coordonnées de votre compte Calcul Canada.

$ ssh -Y MYCCUSERNAME@niagara.scinet.utoronto.ca

ou

$ ssh -Y MYCCUSERNAME@niagara.computecanada.ca

Les tâches sont créées, éditées, compilées, préparées et soumises dans les nœuds de connexion.

Ces nœuds de connexion ne font pas partie de la grappe Niagara, mais ils ont la même architecture et la même pile logicielle que les nœuds de calcul.

Dans les commandes ci-dessus, -Y est optionnel, mais nécessaire pour ouvrir des fenêtres de lignes de commande sur votre serveur local.

Pour utiliser les nœuds de calcul, il faut soumettre les tâches en lot (batch) à l'ordonnanceur.

Migrer vers Niagara

Utilisateurs de GPC existants

Niagara remplace les grappes de SciNet

  • TCS (Tightly Coupled Cluster), hors service depuis l'automne 2017;
  • GPC (General Purpose Cluster) dont les nœuds de calcul ne seront plus disponibles à compter du 21 avril 2018 et l'espace de stockage à compter du 9 mai 2018.

Les utilisateurs actifs de GPC ont accès à Niagara depuis le 9 avril 2018.

Les répertoires home et project ont été migrés de GPC à Niagara le 5 avril 2018, à l'exception des fichiers commençant par un point et qui se trouvaient dans les répertoires home; ces fichiers n'ont jamais été synchronisés.

Après le 5 avril 2018, la responsabilité de migrer les données de GPC vers Niagara revient à l'utilisateur.

Les données dans les répertoires scratch n'ont pas été transférées automatiquement. Ces données sont temporaires et les utilisateurs doivent nettoyer leur espace scratch et transférer les données à conserver via les nœuds de copie (datamovers).

Jusqu'au 9 mai 2018, vous aurez accès à Niagara et au stockage sur GPC pour effectuer les copies.

Si vos données totalisent 10Go et plus, utilisez les nœuds de copie gpc-logindm01 et gpc-logindm02 de GPC et nia-dm1 et nia-dm2 de Niagara. Par exemple, pour copier le répertoire abc de votre espace scratch GPC à votre espace scratch Niagara ː

$ ssh CCUSERNAME@niagara.computecanada.ca
$ ssh nia-dm1
$ scp -r SCINETUSERNAME@gpc-logindm01:\$SCRATCH/abc $SCRATCH/abc

N'oubliez pas la barre oblique inversée (\) devant la première occurrence de $SCRATCH pour que soit utilisée la valeur de scratch sur le nœud à distance (ici, gpc-logindm01). Notez que gpc-logindm01 vous demandera votre mot de passe SciNet.

Vous pouvez aussi procéder à l'inverse, soit

$ ssh SCINETUSERNAME@login.scinet.utoronto.ca
$ ssh gpc-logindm01
$ scp -r $SCRATCH/abc CCUSERNAME@nia-dm1:\$SCRATCH/abc

Cette fois-ci, la barre oblique inversée est devant la deuxième occurrence de $SCRATCH.

Si vous utilisez rsync, nous vous recommandons de ne pas utiliser les indicateurs -a; avec cp, n'utilisez pas les indicateurs -a et -p.

Autres utilisateurs

Les comptes sont déjà créés pour les nouveaux utilisateurs de SciNet qui ont des ressources allouées par le concours de 2018; ils peuvent se connecter.

Pour les utilisateurs qui n'ont pas de ressources allouées par le concours de 2018, la procédure d'accès n'est pas encore disponible. Entretemps, vous pouvez demander un compte SciNet via CCDB.

Localisation de vos répertoires

Répertoires home et scratch

Pour localiser vos espaces home et scratch, utilisez

$HOME=/home/g/groupname/myccusername

$SCRATCH=/scratch/g/groupname/myccusername

Par exemple,

nia-login07:~$ pwd
/home/s/scinet/rzon

nia-login07:~$ cd $SCRATCH

nia-login07:rzon$ pwd
/scratch/s/scinet/rzon

Répertoire project

Les utilisateurs disposant de ressources allouées par le concours 2018 peuvent localiser leur répertoire projet avec

$PROJECT=/project/g/groupname/myccusername

IMPORTANT : Mesure préventive

Puisque les chemins risquent de changer, utilisez plutôt les variables d'environnement (HOME, SCRATCH, PROJECT).

Stockage

quota taille des blocs durée sauvegarde sur nœuds de connexion sur nœuds de calcul
$HOME 100 Go 1 Mo oui oui lecture seule
$SCRATCH 25 To 16 Mo 2 mois non oui oui
$PROJECT par groupe 16 Mo oui oui oui
$ARCHIVE par groupe 2 copies non non
$BBUFFER ? 1 Mo très courte non ? ?
  • Les nœuds de calcul n'offrent pas d'espace de stockage.
  • L'espace d'archivage est sur HPSS qui sera éventuellement relié à Niagara.
  • La sauvegarde est un instantané (snapshot) récent et non une copie archivée de toutes les données ayant existé.
  • $BBUFFER (Burst Buffer) est une fonctionnalité sur laquelle nous travaillons; il s'agit d'un niveau de stockage parallèle plus rapide pour les données temporaires.

Déplacer des données

Utilisez les commandes scp ou rsync pour déplacer les données vers niagara.scinet.utoronto.ca ou niagara.computecanada.ca. La méthode de déplacement à partir de ou en direction de Niagara dépend de la quantité de données à déplacer.

  • Pour déplacer moins de 10Go, utilisez les nœuds de connexion; seuls ceux-ci sont visibles de l'extérieur de Niagara. Un transfert est interrompu ci les donnés dépassent environ 10Go.
  • Pour déplacer plus de 10Go, utilisez les nœuds de copie (datamovers); ceux-ci ne peuvent pas être accédés de l'extérieur. Pour ce faire, à partir d'un nœud de connexion, connectez-vous à nia-dm1 ou nia-dm2 via SSH, puis initiez le transfert des nœuds de copie (datamovers). L'autre côté du transfert (c'est-à-dire votre ordinateur) doit pouvoir être rejoint de l'extérieur.

Si vous transférez souvent des données, pensez utiliser l'outil web Globus.

Vous pourriez vouloir déplacer des données vers HPSS/Archive/Nearline, mais ceci sera implémenté à une date ultérieure. L'espace de stockage sur HPSS est alloué dans le cadre du concours d'allocation de ressources.

Charger des modules

Mis à part les logiciels essentiels, les applications sont installées via des modules. Les modules configurent les variables d'environnement (PATH, etc.). Ceci rend disponible plusieurs versions incompatibles d'un même paquet. Pour connaître les logiciels disponibles, utilisez module spider.

Par exemple,

nia-login07:~$ module spider
---------------------------------------------------
The following is a list of the modules currently av
---------------------------------------------------
  CCEnv: CCEnv

  NiaEnv: NiaEnv/2018a

  anaconda2: anaconda2/5.1.0

  anaconda3: anaconda3/5.1.0

  autotools: autotools/2017
    autoconf, automake, and libtool 

  boost: boost/1.66.0

  cfitsio: cfitsio/3.430

  cmake: cmake/3.10.2 cmake/3.10.3

  ...
    Les commandes les plus utilisées sont ː
  • module load <module-name> : pour un logiciel particulier
  • module purge : pour supprimer les modules déjà chargés
  • module spider (ou module spider <module-name>) : pour obtenir la liste des paquets logiciels disponibles
  • module avail : pour obtenir la liste des paquets logiciels disponibles pour le chargement
  • module list : pour obtenir la liste des modules chargés

Il y a deux piles logicielles sur Niagara.

  1. La pile logicielle Niagara est spécifiquement adaptée à cette grappe. Elle est disponible par défaut, mais au besoin peut être chargée à nouveau avec

    module load NiaEnv
    
    .
  2. La pile logicielle usuelle des grappes d'usage général (Graham et Cedar), compilée pour l'instant pour une génération précédente de CPU.

    module load CCEnv
    

    Pour charger les modules par défaut comme ceux de Cedar ou Graham, exécutez aussi module load StdEnv.

Note : Les modules *Env sont sticky; supprimez-les avec --force.

Trucs pour le chargement de modules

Il n'est pas conseillé de changer des modules dans votre .bashrc de Niagara. Dans certains cas, le comportement peut être très étrange. Au besoin, chargez plutôt les modules manuellement ou par un script distinct et chargez des modules requis pour l'exécution via le script de soumission de votre tâche.

Les noms courts sont pour les versions par défaut; par exemple, intelintel/2018.2. Il est habituellement préférable de préciser la version pour pouvoir reproduire un cas.

Certaines abréviations sont utiles ː

        ml → module list
        ml NAME → module load NAME  # if NAME is an existing module
        ml X → module X

Certains modules requièrent le chargement précédent d'autres modules.

Pour résoudre les dépendances, utilisez module spider.

La commande module spider

La sous-commande spider vous renseigne sur les modules qui sont chargés.

Prenons un exemple ː En voulant charger le module openmpi, vous recevez le message

nia-login07:~$ module load openmpi
Lmod has detected the error:  These module(s) exist but cannot be loaded as requested: "openmpi"
   Try: "module spider openmpi" to see how to load the module(s).

Ceci n'a pas fonctionné, mais le message fournit un indice, alors la commande serait

nia-login07:~$ module spider openmpi
------------------------------------------------------------------------------------------------------
  openmpi:
------------------------------------------------------------------------------------------------------
     Versions:
        openmpi/2.1.3
        openmpi/3.0.1
        openmpi/3.1.0rc3

------------------------------------------------------------------------------------------------------
  For detailed information about a specific "openmpi" module (including how to load the modules) use
  the module s full name.
  For example:

     $ module spider openmpi/3.1.0rc3
------------------------------------------------------------------------------------------------------

Nous avons maintenant des détails sur comment utiliser la commande; profitons de ce conseil et modifions le script ː

nia-login07:~$ module spider openmpi/3.1.0rc3
------------------------------------------------------------------------------------------------------
  openmpi: openmpi/3.1.0rc3
------------------------------------------------------------------------------------------------------
    You will need to load all module(s) on any one of the lines below before the "openmpi/3.1.0rc3"
    module is available to load.

      NiaEnv/2018a  gcc/7.3.0
      NiaEnv/2018a  intel/2018.2

Les directives expliquent comment charger ce module openmpi particulier.

nia-login07:~$ module load NiaEnv/2018a  intel/2018.2
nia-login07:~$ module load openmpi/3.1.0rc3
nia-login07:~$ module list
Currently Loaded Modules:
  1) NiaEnv/2018a (S)   2) intel/2018.2   3) openmpi/3.1.0.rc3

  Where:
   S:  Module is Sticky, requires --force to unload or purge

Applications du commerce

  • Vous devrez peut-être fournir votre propre licence.
  • SciNet et Compute Canada desservent des milliers d'utilisateurs de disciplines variées; il n'est pas possible d'accommoder toutes les applications préférées de chacun.
  • Ainsi, les seules applications du commerce installées sur Niagara sont d'ordre général, soit des compilateurs, des bibliothèques mathématiques et des outils de débogage.
  • Ceci exclut Matlab, Gaussian, IDL.
  • Des options open source sont disponibles, comme Octave, Python et R.
  • Nous vous aiderons à installer toute application du commerce pour laquelle vous détenez une licence.
  • Dans certains cas, si vous avez une licence, vous pouvez utiliser des applications de la pile logicielle de Calcul Canada.

Exemple de compilation

Nous voulons compiler une application à partir des deux fichiers source main.c et module.c qui utilisent GSL (Gnu Scientific Library). Nous pourrions procéder ainsi ː

nia-login07:~$ module list
Currently Loaded Modules:
  1) NiaEnv/2018a (S)
  Where:
   S:  Module is Sticky, requires --force to unload or purge

nia-login07:~$ module load intel/2018.2 gsl/2.4

nia-login07:~$ ls
appl.c module.c

nia-login07:~$ icc -c -O3 -xHost -o appl.o appl.c
nia-login07:~$ icc -c -O3 -xHost -o module.o module.c
nia-login07:~$ icc  -o appl module.o appl.o -lgsl -mkl

nia-login07:~$ ./appl

Note :

  • Les indicateurs d'optimisation -O3 -xHost permettent au compilateur Intel d'utiliser les instructions spécifiques à l'architecture CPU existante (plutôt que pour des CPU x86_64 plus génériques).
  • GSL exige une implémentation cblas qui fait partie de MKL(Intel Math Kernel Library). Il st facile de faire un lien avec cette bibliothèque quand on utilise le compilateur Intel; on n'a besoin que des indicateurs -mkl.
  • Pour compiler avec gcc, les indicateurs d'optimisation seraient -O3 -march=native. Pour faire un lien avec MKL, nous suggérons MKL link line advisor.

Tests

Vous devriez toujours tester votre code avant de soumettre une tâche pour savoir s'il est valide et pour connaître les ressources dont vous avez besoin.

  • Les tâches de test courtes peuvent être exécutées sur les nœuds de connexion.

    En principe : quelques minutes, utilisant au plus 1-2Go de mémoire, quelques cœurs.

  • Après module load ddt, vous pouvez lancer le débogueur ddt sur les nœuds de connexion.

  • Les tests courts qui ne peuvent être exécutés sur un nœud de connexion ou qui nécessitent un nœud dédié requièrent un débogage interactif avec la commande salloc.
    interactive debug job with the salloc command

    nia-login07:~$ salloc -pdebug --nodes N --time=1:00:00
    

    où N est le nombre de nœuds. La session de débogage interactif ne doit pas dépasser une heure, ne doit pas utiliser plus de 4 cœurs et chaque utilisateur ne doit avoir qu'une session de débogage à la fois.

    Une autre option est d'utiliser la commande

    nia-login07:~$ debugjob N
    

    où N est le nombre de nœuds. Si N=1, la session interactive est d'une heure et si N=4 (valeur maximale) la session est de 30 minutes.

Soumettre des tâches

  • Niagara utilise l'ordonnanceur Slurm.

  • À partir d'un nœud de connexion, les tâches sont soumises en passant un script à la commande sbatch :

    nia-login07:~$ sbatch jobscript.sh
    
  • Ceci place la tâche dans la queue; elle sera exécutée sur les nœuds de calcul à son tour.

  • Les tâches seront comptabilisées contre l'allocation de Ressources pour les groupes de recherche; si le groupe n'a reçu aucune de ces ressources, la tâche sera comptabilisée contre le Service d'accès rapide (autrefois allocation par défaut).

Souvenez-vous ː

  • L'ordonnancement se fait par nœud, donc en multiples de 40 cœurs.

  • La limite en temps réel ne doit pas dépasser 24 heures; pour les utilisateurs sans allocation, la limite est de 12 heures.

  • L'écriture doit se faire dans votre répertoire scratch ou project (sur les nœuds de calcul, home est seulement en lecture).

  • Les nœuds de calcul ne peuvent accéder à l'internet.

    Avant de commencer, téléchargez les données sur un nœud de connexion.

Ordonnancement par nœud

  • Toutes les requêtes de ressources pour les tâches sont ordonnancées en multiples de nœuds.

  • Les nœuds utilisés par vos tâches sont à votre usage exclusif.
    • Aucun autre utilisateur n'y a accès.
    • Vous pouvez accéder aux tâches avec SSH pour en faire le suivi.
  • Peu importe votre requête, l'ordonnanceur la traduit en multiples de nœuds alloués à la tâche.

  • Il est inutile de faire une requête pour une quantité de mémoire.

    Votre tâche obtient toujours Nx202Go de mémoire vive, où N représente le nombre de nœuds.

  • Vous devriez essayer d'utiliser tous les cœurs des nœuds alloués à votre tâche. Puisqu'il y a 40 cœurs par nœud, votre tâche devrait utiliser Nx40 cœurs. Si ce n'est pas le cas, nous vous contacterons pour vous aider à optimiser votre travail.

CPU logiques vs cœur ː Hyperthreading

Niagara fait usage de la technologie de l'hyperthreading qui augmente la capacité du matériel en prétendant qu'il y a deux fois plus de cœurs logiques qu'il n'y en a en réalité.

Le système d'exploitation et l'ordonnanceur voient alors 80 cœurs.

Utiliser 80 cœurs logiques contre 40 cœurs réels augmente la vitesse de 5 à 10% (variable selon les cas).

Puisque l'ordonnancement se fait par nœud, cette technologie est plutôt facile à utiliser.

  • Demandez N nœuds pour vos tâches.
  • Vous savez que vous obtenez 40xN cœurs, alors vous utiliserez (au moins) un total de 40xN processus mpi ou fils. (mpirun, srun, et le système d'exploitation les répartissent automatiquement sur les cœurs réels).
  • Vous devriez aussi voir si vous obtenez plus de vitesse si vous exécutez 80xN processus mpi ou fils.
  • Peu importe, votre utilisation sera comptabilisée comme étant 40xN x (temps réel en années).

Exemple d'un script de soumission pour OpenMP

Dans cet exemple, nous allons exécuter sur un nœud unique l'application multifil appl_openmp_ex qui utilise OpenMP. Le script est le suivant :

#!/bin/bash
#SBATCH --nodes=1
#SBATCH --cpus-per-task=40
#SBATCH --time=1:00:00
#SBATCH --job-name openmp_ex
#SBATCH --output=openmp_ex_%j.txt

cd $SLURM_SUBMIT_DIR

module load intel/2018.2

export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK

./appl_openmp_ex

Soumettez le script (nommé openmp_ex.sh) avec la commande

nia-login07:~$ sbatch openmp_ex.sh
  • La première ligne mentionne qu'il s'agit d'un script bash.
  • Les lignes qui commencent par #SBATCH sont pour l'ordonnanceur.
  • sbatch interprète ces lignes comme étant une requête et la nomme openmp_ex.
  • L'ordonnanceur cherche alors un nœud de 40 cœurs à exécuter dans une tâche, pour une durée d'une heure.
  • Une fois le nœud trouvé, le script est exécuté:
    • redirige vers le répertoire de soumission;
    • charge les modules (doit être fait aussi dans le script de soumission sur Niagara);
    • configure une variable d'environnement pour spécifier 40 fils (il n'y a pas de hyperthreading dans cet exemple);
    • exécute l'application appl_openmp_ex.
  • Pour utiliser la fonctionnalité hyperthreading, remplacez --cpus-per-task=40 par --cpus-per-task=80.

Exemple d'un script de soumission pour MPI

Pour exécuter l'application MPI nommée appl_mpi_ex avec 320 processus, le script serait ː

#!/bin/bash 
#SBATCH --nodes=8
#SBATCH --ntasks=320
#SBATCH --time=1:00:00
#SBATCH --job-name mpi_ex
#SBATCH --output=mpi_ex_%j.txt

cd $SLURM_SUBMIT_DIR

module load intel/2018.2
module load openmpi/3.1.0rc3

mpirun ./appl_mpi_ex

Soumettez le script (nommé ici mpi_ex.sh) avec la commande

nia-login07:~$ sbatch mpi_ex.sh
  • La première ligne mentionne qu'il s'agit d'un script bash.

  • Les lignes qui commencent par #SBATCH sont pour l'ordonnanceur.

  • sbatch interprète ces lignes comme étant une requête et la nomme mpi_ex

  • Ici, l'ordonnanceur cherche 8 nœuds avec 40 cœurs pour exécuter 320 tâches, pour une durée d'une heure.

  • Une fois le nœud trouvé, le script est exécuté ː

    • redirige vers le répertoire de soumission;
    • charge les modules;
    • exécute l'application appl_mpi_ex avec mpirun (srun devrait aussi fonctionner).
  • Pour utiliser la fonctionnalité hyperthreading, remplacez --ntasks=320 par --ntasks=640 et ajoutez --bind-to none à la commande mpirun (seulement avec avec OpenMPI et non IntelMPI).

Suivi des tâches en attente

Une fois la tâche placée dans la queue, suivez son déroulement avec les commandes suivantes ː

  • squeue ou qsum pour voir les tâches dans la queue (squeue -u $USER pour vos propres tâches);

  • squeue -j JOBID pour des renseignements sur une tâche en particulier

    (ou la version plus longue scontrol show job JOBID);

  • squeue --start -j JOBID pour une estimation de quand la tâche sera exécutée (le résultat n'est pas toujours fiable);

  • Puisque ceci n'est pas très précis, vous pourriez vouloir savoir où se trouve votre tâche dans la queue avec la fonction bash suivante ː

function qpos() {
    if [ "$#" -eq 0 ]; then
         squeue -u "$USER" | tail -n-1 | tr -s ' ' | cut -d' ' -f2 | while read jid; do
            squeue | tr -s ' ' | cut -d' ' -f2 | sort -n | cat -n | grep "$jid"
        done | tr -s ' ' | sort -n -t' ' -k1 
    fi
    for jid in "$@"; do
        squeue | tr -s ' ' | cut -d' ' -f2 | sort -n | cat -n | grep "$jid"
    done
}

Usage:

qpos

  • scancel -i JOBID to cancel the job.

  • sinfo -pcompute to look at available nodes.

  • jobperf JOBID to get an instantaneous view of the cpu and memory usage of the nodes of the job while it is running.

  • sacct to get information on your recent jobs.

  • For more information, check out the wiki page devoted to Running jobs.

    Gestion des données et trucs pour les Entrées/Sorties

    • $HOME, $SCRATCH et $PROJECT utilisent tous le système de fichiers parallèle GPFS.
    • Vos fichiers sont visibles sur tous les nœuds de connexion et de calcul de Niagara.
    • GPFS est un système de fichiers haute performance avec des entrées/sorties rapides sur plusieurs nœuds pour de grands ensembles de données.
    • Cependant, l'accès à des ensembles de données constitués de plusieurs petits fichiers engendre une faible performance.
    • Évitez de lire et écrire plusieurs petites quantités de données sur les disques.
    • Un système constitué de plusieurs petits fichiers utilise mal l'espace disponible et ralentit l'accès, la lecture et l'écriture.
    • Écrivez vos données en binaire pour plus de vitesse et une économie de l'espace.
    • La fonctionnalité burst buffer est en préparation; elle facilitera les entrées/sorties pour les tâches intensives et accélérera la création et l'enregistrement des points de contrôle.