1 of 37

Partenaires et commanditaires

2 of 37

Nouvelles de Calcul Canada

2019-11-05

3 of 37

Nouvelles générales

  • Nouvelle page d’état des serveurs plus détaillée

  • Concours d’allocation de ressources
    • Date limite : 7 novembre
    • Détails : https://bit.ly/2WG9S4Y

4 of 37

Nouvelles générales

  • Concours de visualisation “Faites-nous voir ça!” (Visualize This!)

https://computecanada.github.io/visualizeThis/competition/2019/07/15/competition-details.html

    • Prix:
      • Dell UltraSharp 32” 4K
      • Disques externes SSD
      • Participation subventionnée pour l’école de CIP de WestGrid

5 of 37

Nouvelles de Béluga

  • En date du 5 novembre, pas de crash depuis 3 semaines
  • Stabilisation du /scratch
    • Après plusieurs mois d’instabilité, pendant lesquels le /scratch plantait à répétition, nous croyons que la cause a été identifiée et réglée
    • Détails (très) techniques:
  • Investigations en cours pour certaines lenteurs qui affectent certains noeuds (pas tous)

6 of 37

Nouvelles de Cedar

  • Maintenance (~30 octobre)
    • Séparation du /home et du /scratch
    • Mise à jour de l’ordonnanceur de 17.x à 19.x
  • Détails:

7 of 37

Nouvelles de Graham

  • Nouveaux noeuds GPUs “Turing”
    • Pour détails :

https://docs.computecanada.ca/wiki/Graham

8 of 37

Maintenances à venir

  • Arbutus (9 novembre)
  • Niagara (15 novembre)
    • Travaux de maintenance physique. Tout sera hors-ligne
    • Détails:

https://status.computecanada.ca/view_incident?incident=303

9 of 37

Accélérer ses tâches avec GNU Parallel et les lots de tâches Slurm

2019-11-05

To people who live life in the parallel lane - Ole Tange

10 of 37

Qui suis-je?

  • Charles Coulombe charles.coulombe@calculquebec.ca
  • Informatique (B. Sc.) Bio-informatique (M. Sc.)�
  • Passionné par
    • Calcul informatique de pointe
    • Développement
    • Python et C++
    • Vélo

11 of 37

Plan

  • Paralléliser par les données (lots de tâches)
  • Paralléliser par les tâches (GNU Parallel)
    • Multi-coeurs
    • Multi-noeuds
  • Paralléliser par les tâches et les données (hybride) (démo)

12 of 37

Cas d’utilisation

Imaginons que nous avons plusieurs patrons ou séquences à chercher à l’intérieur d’un ou plusieurs fichiers.

  • BLAST+

13 of 37

Lots de tâches

14 of 37

Lots de tâches

Un ensemble de tâches où chacune possède un indice unique : $SLURM_ARRAY_TASK_ID.

sbatch --array=0-7

sbatch --array=1,3,5,7

sbatch --array=1-7:2

sbatch --array=1-100%10

15 of 37

Parallélisme de données

Décomposer l’ensemble de données en sous-ensembles :

Source : https://computing.llnl.gov/tutorials/parallel_comp/

16 of 37

divide et impera

# 1M patrons par fichiers data.XX

split -d -l 1000000 data.txt data.

pat1

pat2

pat3

...

Uniligne :

17 of 37

divide et impera

# 10 fasta seqXX.fa

faSplit sequence seqs.fa 10 seq

>seq1

GGCACGAGGCGTACTGTT

>seq2

TTCGGCACAGGNATACTTTTAGAAGA

AAAAAGATAAATTTAAACCTGAAA

FASTA Multi-lignes:

18 of 37

BLAST+ et lot de tâches

#SBATCH --time=00:02:00

#SBATCH --cpus-per-task=1

#SBATCH --mem-per-cpu=512M

#SBATCH --array=0-9

module load gcc/7.3.0 blast+/2.7.1

blastn -db ref.fa -query seq0${SLURM_ARRAY_TASK_ID}.fa\�> seq0${SLURM_ARRAY_TASK_ID}.ref

19 of 37

GNU Parallel

Multi-coeurs

20 of 37

Multi-coeurs

21 of 37

GNU Parallel

Un outil permettant d’exécuter une ou plusieurs commandes avec leurs paramètres en parallèle.�

Exemples :

parallel echo ::: 1 2 3 4

parallel echo :::: params.txt

parallel < commandes.txt

parallel --jobs 4 echo ::: {1..12}

parallel --resume --joblog jobs.log < commandes.txt

22 of 37

Morcellement d’un fichier

Lecture de plusieurs blocs du fichier.

Par défaut : bloc de 1MB.

# Lent. Jusqu’à 500MB/s

cat database.fa | parallel --pipe --recstart '>' wc

# Rapide. Jusqu’à 5GB/s

parallel --pipepart --recstart '>' wc :::: database.fa

23 of 37

Taille du bloc

Il est important de définir une taille de bloc approprié. Par exemple, wc :

# coeurs

Taille fichier

Taille

bloc

Tâches GNU Parallel

# coeurs utilisés

Temps

1

8

827MB

1MB

805

8

8.75s

2

8

827MB

10MB

83

8

2.64s

3

8

827MB

100MB

9

8

2.09s

4

8

827MB

827MB

1

1

11s

5

8

827MB

-1

8

8

1.81s

parallel -k --block <b> --recstart '>' --pipepart wc :::: database.fa

24 of 37

BLAST+ multi-coeurs

#SBATCH --time=03:00:00

#SBATCH --cpus-per-task=12

#SBATCH --mem-per-cpu=512M

module load gcc/7.3.0 blast+/2.7.1

cmd='blastn -db database.fa -query - '

parallel -k --block -1 --recstart '>' --pipepart \

$cmd :::: queries.fa > queries.out

25 of 37

GNU Parallel

Multi-noeuds

26 of 37

Multi-noeuds multi-coeurs

27 of 37

Multi-noeuds

parallel --delay 0.2 -S noeud1,noeud2 < cmds.txt

parallel --delay 0.2 -S 2/noeud1,3/noeud2 < cmds.txt

parallel --delay 0.2 -j 2 -S 4/noeud1,4/noeud2 < cmds.txt

GNU Parallel utilise SSH afin d’exécuter 1 à N tâches sur les noeuds.

28 of 37

Liste des noeuds

# Liste de noeuds et leurs coeurs : coeurs/noeud,

slurm_hl2hl.py --format GNU-Parallel \

> ./liste_noeuds_${SLURM_JOB_ID}

Dans une tâche, il est possible d’obtenir la liste des noeuds alloués.

29 of 37

BLAST+ multi-noeuds-coeurs

#SBATCH --time=03:00:00

#SBATCH --ntasks=16

#SBATCH --mem-per-cpu=512M

module load gcc/7.3.0 blast+/2.7.1

cmd='blastn -db database.fa -query - '

noeuds=$(slurm_hl2hl.py --format GNU-Parallel)

parallel -S $noeuds -k --block -1 --recstart '>' \

--pipepart --workdir $PWD $cmd :::: queries.fa \

> queries.out

30 of 37

Hybride

GNU Parallel et lots de tâches

31 of 37

BLAST+ Hybride démo

#SBATCH --time=00:01:00

#SBATCH --cpus-per-task=2

#SBATCH --mem-per-cpu=2G

#SBATCH --array=0-9

parallel -k --recstart '>' --block -1 --pipepart \

wc :::: "data0${SLURM_ARRAY_TASK_ID}.fa"

module load kentutils

faSplit sequence database.fa 10 data

32 of 37

Merci!

Questions?

33 of 37

Références - BLAST+

34 of 37

Références - GNU Parallel

35 of 37

Extra

36 of 37

Simulation de N paramètres

parallel sim ::: {1..5} ::: {1..80} ::: {1..10} ::: {1..3}

parallel sim -a {1} -b {2} -z {3} ::: {1..5} ::: z f q ::: {1..10}

37 of 37

Simulation de N paramètres

# SBATCH --nodes=2

# SBATCH --ntasks-per-node=10

# SBATCH --mem-per-cpu=2G

module load glost

srun glost_launch commandes.txt