Thomas Denecker & Claire Toffano-Nioche
Session 5
26/04/2019
Novembre
Janvier
Février
Mars
Avril
Mai
Juin
Juillet
...
26
25
22
29
26
31
28
à définir
...
Changement de planning
Â
Mai
31 mai pont ?Â
Proposition : 24 mai ou 7 juin
Â
Juin (changement obligatoire)
Nouvelle date : 21 juin
Â
Â
Je ne vois pas l'intérêt...
Super compliqué pour pas grand chose
Moi j'ai jamais eu de problèmes de reproductibilité entre OS
Docker pas si simple?​
Oui ... et non
- Mettre en place un Rstudio server : 5 minutes
- Faire son propre docker : ça demande du travail
Â
Jamais de problèmes de reproductibilité à cause de l'OS
En effet, c'est rare mais ça peut arriver (MAJ, partage,...)
Â
Pas énormément d'utilité?
C'est vrai, le docker ne fait rien de plus que le local
Mais Partage + Reproductibilité + Déploiement
I've got the power!
Aujourd'hui
Â
Script automatiqueÂ
Â
Utilisation d'un cloud avec une puissance paramétrable
Â
Que faire de plus?
Â
Paralléliser
Â
Sur un cluster de calcul
La parallélisation
  - Snakemake
  - Comparaison avec le script.sh
Le cluster de calcul
  - C'est quoi?
  - Cluster de l'IFB / I2BC
  - Singularity ↔ Docker
  - Exemple sur l'IFB et l'I2BC
Â
Snakemake
Même sur le cloud de l'IFB, c'est long...
Â
Que faire ?
Â
1- Améliorer les algorithmes
Prêt pour optimiser Bowtie2 ? Non...
Â
2- Augmenter la puissance de calcul
   - Comment ?
   - Comment exploiter cette puissance ?
Solution 1 : Changer d'ordinateur $$$
Â
Solution 2 : Augmenter la puissance de notre VM
Disque dur
RAM
CPU
20 Go
160 Go
2 Go
1Â
500 Go
48
Central Processing Unit = processeur
Composant qui exécute les instructionsÂ
Intel 4004
1971
0.092 MIPS
(Million Instructions Per Second)
INTEL® CORE™ i9-7900X
2019
57411 MIPS
10 cœurs
Un processeur est composé d'un ou plusieurs cœurs
1 cœur = 1 instruction
n cœurs = n instructions
Dans notre casÂ
Nous avons beaucoup d'instructions donc il nous faut beaucoup de cÅ“urs !Â
Linéaire (1 cœur)
Programme 2
Programme 3Â
Programme 1
Programme 4
Parallélisation (n cœurs)
Plusieurs instructions simultanément
Plusieurs solutions possibles : Snakemake, Nextflow,...
Â
Installer SnakemakeÂ
Â
conda install -c bioconda snakemake
Pourquoi Snakemake ?
  - Système de workflow
  - Lisibilité du codeÂ
  - Gestion automatique des ressources
  - Reproductibilité !
Système de règles
  - un nom
  - des fichiers d’entrée
  - des fichiers de sortie
  - du code pour passer des fichiers d’entrée aux fichiers de sortie
Règle
Input
Output
Snakemake doit connaître le futur
Dans l'ordre des règles :
Inputs
Cibles
Recherche de la règle précédente qui a le même output que l'input de la règle actuelle
1
2
3
4
Ordre d'exécution
FASTQC
Bowtie2
SAMtools
DEseq2
HTSeq
6 fois
6 fois
6 fois
6 fois
1 fois
Avant
Maintenant
F
F
F
F
F
F
B
B
B
B
B
B
S
S
S
S
S
S
H
H
H
H
H
H
C
snakemake --forceall --dag | dot -Tsvg > dag_input.svg
1- Une règle pour indiquer ce que nous voulons
rule targets:
input:
"data/toto.fq.gz"
"data/titi.fq.gz"
rule gzip:
input:
"{base}"
output:
"{base}.gz"
shell:
"gzip {input}"
2- Une règle pour indiquer comment y arriver
{base} : Stocke le nom des fichiers où nous nous trouvonsÂ
Ici nous compressons des fichiers
1- Changement du dossier de travail
BASE_DIR = "/home/rstudio"
WDIR = BASE_DIR + "/Project"
workdir: WDIR
2- Déclaration de variables (GFF et GENOME)
GFF = WDIR + "/annotations/O.tauri_annotation.gff"
GENOME = WDIR + "/genome/O.tauri_genome.fna"
Le snakefile est le fichier qui contient toutes les règles.
Nom du fichier : SnakefileÂ
glob_wildcards() : fonction qui déduit la partie manquante des noms de fichier à partir des fichiers présents dans le système Â
Â
smp : la partie variable
3- Récupération de la liste des fichiers à traiter
SAMPLES, = glob_wildcards("./samples/{smp}.fastq.gz")
NB_SAMPLES = len(SAMPLES)
SAMPLES, : ne pas oublier la virgule (liste)
expand(...) : fonction qui permet d'utiliser une variable. Ici la variable = nom des fichiersÂ
Â
smp : devient une variable globale
4- Déclaration des fichiers que nous souhaitons
rule final:
input:
expand("fastqc/{smp}/{smp}_fastqc.zip", smp=SAMPLES),
expand("htseq/count_{smp}.txt", smp=SAMPLES),
expand("graphics/graphics-{smp}.pdf", smp=SAMPLES),
expand("countTable.txt")
Si le fichier n'est pas déclaré ici, les règles associées ne seront pas exécutées
input : les fichiers qui ont été téléchargés pour l'analyse
output : les fichiers de sortie
message : message affiché lors de l'analyse
shell : commande lancée dans le terminal. Pour utiliser la variable : wildcards.nomVariable
5- Fastqc
rule fastqc:
input: "samples/{smp}.fastq.gz"
output: "fastqc/{smp}/{smp}_fastqc.zip"
message: """--- Quality check of raw data with Fastqc."""
shell: """
fastqc {input} --outdir fastqc/{wildcards.smp}
"""
params : paramètre à utiliser dans le shell (ici la zone d'écriture)Â
Â
6- Construction pour bowtie2
rule bowtie2Build:
input: GENOME
params:
basename= "reference/reference"
output:
output1="reference/reference.1.bt2",
output2="reference/reference.2.bt2",
output3="reference/reference.3.bt2",
output4="reference/reference.4.bt2",
outputrev1="reference/reference.rev.1.bt2",
outputrev2="reference/reference.rev.2.bt2"
message: """--- Indexation of the reference genome."""
shell: "bowtie2-build {input} {params.basename}"
S'il y a plusieurs inputs, il faut préciser les noms (file ou bt2) dans le shell {input.nomImput}.
Â
Idem pour l'output (sam et out)
7- Bowtie2
rule bowtie2:
input:
file = "samples/{smp}.fastq.gz",
bt2 = "reference/reference.rev.2.bt2"
params:
index = 'reference/reference'
output:
sam = "bowtie2/bowtie-{smp}.sam",
out = "bowtie2/bowtie-{smp}.out"
message: """--- Alignment of reads with the reference genome."""
shell: 'bowtie2 -x {params.index} -U {input.file} -S {output.sam} > {output.out}'
8- Samtools view
rule samtoolsView:
input:
"bowtie2/bowtie-{smp}.sam"
output:
"samtools/bowtie-{smp}.bam"
message: """--- Binary conversion of aligned reads."""
shell: """
samtools view -b {input} > {output}
"""
9- Samtools sort et index
rule samtoolsSortIndex:
input:
"samtools/bowtie-{smp}.bam"
output:
"samtools/bowtie-{smp}.sorted.bam"
message: """--- Sorting and Indexingof aligned reads."""
shell: """
samtools sort {input} -o {output}
samtools index {output}
"""
10- Htseq count
rule htseqCount:
input:
"samtools/bowtie-{smp}.sorted.bam"
output:
"htseq/count_{smp}.txt"
params:
GFF
message: """--- Count."""
shell: """
htseq-count --stranded=no --type='gene' --idattr='ID' --order=name --format=bam {input} {params} > {output}
"""
Toujours la même syntaxe
11- Création de graphiques en R
rule graphics:
input:
"htseq/count_{smp}.txt"
output:
"graphics/graphics-{smp}.pdf"
params:
GFF
message: "--- Histogram"
shell: """
Rscript ../R-code/graphics.R {input}
"""
Il est possible d'appeler toutes les commandes disponibles dans le shell comme R
Et voilà !Â
Lancer un snakefile ?Â
snakemake
##------------------------------------------------------------------------------
## FAIR script
## Author: T. Denecker & C. Toffano-Nioche
## Affiliation: I2BC
## Aim: A workflow to process RNA-Seq.
## Organism : O. tauri
## Date: Jan 2019
## Step :
## 1- Create tree structure
## 2- Download data from SRA
## 3- Run workflow (snakemake)
##------------------------------------------------------------------------------
echo "=============================================================="
echo "Creation of tree structure"
echo "=============================================================="
mkdir Project
mkdir Project/samples
mkdir Project/annotations
mkdir Project/bowtie2
mkdir Project/fastqc
mkdir Project/genome
mkdir Project/graphics
mkdir Project/htseq
mkdir Project/reference
mkdir Project/samtools
echo "=============================================================="
echo "Download data from SRA"
echo "=============================================================="
# Get accession number (comment / uncomment to change methods)
Accession="$(cut -f7 conditions.txt | tail -n +2)" # ascp method
cd Project/samples
IFS=$'\n' # make newlines the only separator
for j in $(tail -n +2 ../../conditions.txt)
do
access=$( echo "$j" |cut -f7 )
id=$( echo "$j" |cut -f1 )
echo "--------------------------------------------------------------"
echo ${id}
echo "--------------------------------------------------------------"
ascp -QT --file-checksum=md5 --file-manifest=text --file-manifest-path=. -l 300m -P33001 -i /home/miniconda3/etc/asperaweb_id_dsa.openssh ${access} .
md5_local="$(md5sum $id.fastq.gz | cut -d' ' -f1)"
echo $md5_local
if grep -q $md5_local *.txt
then
echo "Done"
else
rm $id.fastq.gz
access=$( echo "$j" |cut -f6 )
wget ${access} # wget method
fi
rm *.txt
done
cd ../..
echo "=============================================================="
echo "Download annotations"
echo "=============================================================="
wget https://raw.githubusercontent.com/thomasdenecker/FAIR_Bioinfo/master/Data/O.tauri_annotation.gff -P Project/annotations
echo "=============================================================="
echo "Download genome"
echo "=============================================================="
wget https://raw.githubusercontent.com/thomasdenecker/FAIR_Bioinfo/master/Data/O.tauri_genome.fna -P Project/genome
echo "=============================================================="
echo "Snakemake"
echo "=============================================================="
snakemake
echo "=============================================================="
echo "Create unique count table"
echo "=============================================================="
Rscript R-code/countTable.R
Le fichier peut être corrompu ! Il faut faire des vérifications !
Â
Ne fonctionne pas sur tous les serveurs (à coupler avec une autre méthode)
Super rapide !
Presque comme avant!
Il faut dire au docker qu'il peut prendre de la place en CPU (ici 6) et en mémoire (ici 24 Go)
sudo docker run --rm -d -p 8888:8888 --cpus="6" -m=24g --name fair_bioinfo -v ${PWD}:/home/rstudio tdenecker/fair_bioinfo
sudo docker exec -it fair_bioinfo bash FAIR_script.sh
Puis lancer notre script
Et attendre ...
La majorité de l'espace disque se trouve dans mnt.
Â
Travailler dans /mnt/
Pour y allerÂ
Â
Â
cd /mnt/
Puis chargement du dépôt, etc
git clone https://github.com/thomasdenecker/FAIR_Bioinfo.git
Machine 1Â
1 CPU et 2 Go de RAM
Â
1h 23 mins
Machine 1Â
1 CPU et 2 Go de RAM
Â
1h 23 mins
Machine 2
8 CPUs et 32 Go de RAM
Â
0h 28mins
-1h pour la même analyse !!
scp ubuntu@134.158.247.116:/mnt/FAIR_Bioinfo/Project/countTable.txt countTable.txt
scp : cp (copy) en sshÂ
Â
scp acces:localisationFichierDistant localisationLocal
Interface pour récupérer les fichiers sur le serveur
Â
1- Renseigner la clé à FilezillaÂ
Edition > Paramètres > SFTPÂ
Ajouter un fichier de clé privée (le fichier que nous avons créé pour nous connecter au cloud)
./ssh/id_rsa
Et pas la id_rsa.pub
Si en ssh : ubuntu@134.158.247.116
Hôte : 134.158.247.116
Identifiant : ubuntu
Mot de passe : (rien - clés publique/privée)
Port : 22
Â
Â
Â
Le message suivant sera "Clé de l'hôte inconnue"
Répondre ok
Click
Architecture cliquable du serveur
Glisser / déposerÂ
Cluster ifb
Regroupement de plusieurs ordinateurs indépendants (node) pour permettre une gestion globale et dépasser les limitations d'un ordinateur
Â
AvantagesÂ
Â
Inconvénient ? 100 % terminal ?Â
 Â
Cloud
Cluster
Localisation
Dispersée
Local
Matériels
Différents
Identique
Configuration
Différente
Identique
1. Se connecter au cluster
IFB
ssh ctoffanonioche@core.cluster.france-bioinformatique.fr
ssh thomas.denecker@passerelle.i2bc.paris-saclay.fr
I2BC
2. Récupération du project sur Github
git clone https://github.com/thomasdenecker/FAIR_Bioinfo.git
3. Se déplacer dans le projet
cd FAIR_Bioinfo
ssh thomas.denecker@I2BC-Cluster.calcul.i2bc.paris-saclay.fr
Puis
4. Récupération de l'image docker dans singularity
singularity pull docker://tdenecker/fair_bioinfo
Singularity
Système de conteneurs basé sur des images
Permet de fixer l'environnement
Pas besoin d'être root
5. Création d'un fichier pour slurm
Simple Linux Utility for Resource Management
- Allocation de ressource pour le temps nécessaireÂ
- Suivi des tâches
- Mise en place d'une file d'attente
Les paramètres pour le planificateur slurm commencent par #SBATCH
- fichier de redirection de l'output standard renommé avec l'identifiant du job
#SBATCH -o slurm.%N.%j.out
1- Fichier de type bash
#!/bin/bash
2- Paramètres
#SBATCH -e slurm.%N.%j.err
- fichier de redirection de l'erreur standard renommé avec l'identifiant du job
2- Paramètres
#SBATCH --partition fast
- Choix des queues/nœuds de calcul
"fast" => le calcul sera coupé après n heures
#SBATCH --mem 24GB
- Réservation de RAM
3- Lancement
Lancement du docker et du script FAIR_script.sh
singularity exec -B $PWD:/home/rstudio fair_bioinfo.simg bash ./FAIR_script.sh
#SBATCH --cpus-per-task 6
- Nombre de CPU réservés
Le fichier complet : fair_bioinfo.slurm
#!/bin/bash
# les parametres pour le planificateur slurm commencent par "#SBATCH" :
#SBATCH -o slurm.%N.%j.out # fichier de redirection de l'output standard renommé avec l'identifiant du job
#SBATCH -e slurm.%N.%j.err # fichier de redirection de l'erreu standard renommé avec l'identifiant du job
#SBATCH --partition fast # choix des queues/noeuds de calcul ("fast" => le calcul sera coupé après n heures)
#SBATCH --cpus-per-task 8 # Nombre de CPU réservés
#SBATCH --mem 30GB # réservation de RAM
# lancement du docker et du script FAIR_script.sh
singularity exec -B $PWD:/home/rstudio fair_bioinfo.sif bash ./FAIR_script.sh
singularity v 3.0.1
Le fichier complet : fair_bioinfo.qsub
#!/bin/sh
#PBS -q lowprio
#PBS -l select=1:ncpus=6
cd /home/thomas.denecker/FAIR_Bioinfo/
singularity exec -B /home/thomas.denecker/FAIR_Bioinfo/:/home/rstudio fair_bioinfo.simg bash ./FAIR_script.sh
Autre système pour mettre à la queue les jobsÂ
Syntaxe un peu différente mais même philosophie
singularity v 2.6
5- Lancement du workflow
sbatch fair_bioinfo.slurm
6- Récupération des fichiers (en local)
Exemple avec le cluster de l'IFB
scp ctoffanonioche@core.cluster.france-bioinformatique.fr/FAIR_Bioinfo/countTable.txt countTable.txt
Et voilà !
qsub ./fair_bioinfo.qsub
Machine 1Â
1 CPU
2 Go de RAM
Â
1h 23 mins
Machine 2
8 CPUs
32 Go de RAM
Â
0h 28mins
Machine 2
8 CPUs
32 Go de RAM
Â
0h 22mins
Cloud
Cluster
Â
FAIR raw data
Â
+
Â
"FAIR_bioinfo" scripts/protocols
Â
=
Â
FAIR processed data
Reproductibilité et vitesse
- Mise en place d'un système automatique de workflow
- Utilisation de la puissance de parallélisationÂ
- Augmentation des performances d'un docker
- Utilisation d'un cluster de calcul
Snakemake
Cluster
Lancer l'analyse sur le cluster ou sur une VM en parallèle
Bon courage !
RDV sur Slack en cas de problème