GPU basecalling via Snakemake

Bonjour,

Mon problème est le suivant:

Lorsque je lance un basecalling avec dorado via un script sbatch gpu_basecalling_test.sh, tout se déroule correctement, mon script est lancé sur un node GPU et dorado utilise bien le GPU sélectionné pour faire le basecalling.

Contenu de gpu_basecalling_test.sh :

!/bin/sh
#SBATCH --partition=gpu
#SBATCH --gres=gpu:3g.20gb:1
#SBATCH --cpus-per-task=1
#SBATCH --mem=16GB
#SBATCH --time 0:10:00
#SBATCH --ntasks=1
#SBATCH --job-name GPU-test

## load dorado module
module load dorado

dorado basecaller --emit-fastq /shared/projects/dd_ont_pipeline/ONT-UMI-search-pipeline/dorado/models/dna_r9.4.1_e8_sup@v3.6 /shared/projects/dd_ont_pipeline/raw_reads.pod5 > /shared/projects/dd_ont_pipeline/test.fastq

En revanche, lorsque je cherche à faire la même chose à travers mon pipeline snakemake, il semble que le job est bien lancé sur un node GPU mais dorado ne "voit" pas la carte GPU et donc s'arrête immédiatement.

la rule snakemake est la suivante:

rule dorado_basecalling:
    input: config['src_pod5']
    params: 
        dorado = DORADO,
        model = MODEL
    output: config['src_fastq']+'{exp}.fastq'
    shell: '{params.dorado} basecaller --emit-fastq dorado/models/{params.model} {input} > {output}'

Et mon fichier de config (profile):

snakefile: SnakeFile
config: 'CLUSTER=True'
configfile: ["./profiles/IFBslurm/paths_config.yaml", "./profiles/IFBslurm/dorado_base_config.yaml"]
use-conda: True

latency-wait: 30
reason: True
show-failed-logs: True
keep-going: True
printshellcmds: True
rerun-incomplete: True
restart-times: 0


######################
# Cluster submission #
######################

slurm: True
jobname: "{rule}.{jobid}"              # Provide a custom name for the jobscript that is submitted to the cluster.
max-jobs-per-second: 1                 # Maximal number of cluster/drmaa jobs per second, default is 10, fractions allowed.
max-status-checks-per-second: 10       # Maximal number of job status checks per second, default is 10
jobs: 4                                # Use at most N CPU cluster/cloud jobs in parallel.
cores: 1

drmaa:
  sbatch
    --job-name=smk-{rule}-{wildcards}
    --output=logs/{rule}/{rule}-{wildcards}-%j.out
    --error=logs/{rule}/{rule}-{wildcards}-%j.err

##################
## Job resources #
##################

# Set default: apply to every rule 
default-resources:
  - slurm_account=dd_ont_pipeline
  - slurm_partition=fast
  - runtime=120
  - mem_mb=16000
  - nodes=1

# Set exceptions: specify custom ressources to a given rule
set-resources:
    - dorado_basecalling:mem_mb=16000
    - dorado_basecalling:runtime=180
    - dorado_basecalling:slurm_partition=gpu
    - dorado_basecalling:slurm=gres=gpu:3g.20gb

Enfin le contenu du script bash qui sert à lancer le pipeline snakemake via un sbatch:


#!/bin/sh
#SBATCH --cpus-per-task=4
#SBATCH --mem=32GB
#SBATCH --cpus-per-task=4
#SBATCH --time 12:00:00
#SBATCH --ntasks=1
#SBATCH --job-name DD-pipeline

## load dorado module
module load dorado

## load DRMAA module
module load slurm-drmaa
echo $DRMAA_LIBRARY_PATH

## activate conda environment
module load conda
CONDA_ROOT=/shared/software/miniconda/
source $CONDA_ROOT/etc/profile.d/conda.sh

conda activate dd_ont_pipeline

## Run snakemake pipeline
date
srun snakemake --profile none --workflow-profile profiles/IFBslurm --jobs=10 --use-envmodule

L'erreur que j'obtiens est la suivante:

[Mon Jan 29 11:18:56 2024]
rule dorado_basecalling:
    input: /shared/projects/dd_ont_pipeline/ONT-UMI-search-pipeline/data/TEST/sequences/pod5
    output: /shared/projects/dd_ont_pipeline/ONT-UMI-search-pipeline/data/TEST/sequences/fastq/TEST.fastq
    jobid: 0
    reason: Forced execution
    wildcards: exp=TEST
    resources: mem_mb=16000, mem_mib=15259, disk_mb=1000, disk_mib=954, tmpdir=/tmp, slurm_account=dd_ont_pipeline, slurm_partition=gpu, runtime=180, nodes=1, slurm=gres=gpu:3g.20gb

dorado basecaller --emit-fastq dorado/models/dna_r9.4.1_e8_sup@v3.6 /shared/projects/dd_ont_pipeline/ONT-UMI-search-pipeline/data/TEST/sequences/pod5 > /shared/projects/dd_ont_pipeline/ONT-UMI-search-pipeline/data/TEST/sequences/fastq/TEST.fastq
[2024-01-29 11:18:58.035] [info]  - Note: FASTQ output is not recommended as not all data can be preserved.
[2024-01-29 11:18:58.035] [info] > Creating basecall pipeline
[2024-01-29 11:18:58.058] [error] CUDA device requested but no devices found.

Je suppose qu'il s'agit d'un probleme de configuration qui empêche Dorado et/ou CUDA de voir ou d'accèder à la carte mais après avoir testé différentes approches je m'en remets à vous, peut être saurez vous identifier le problème..

Je vous en remercie par avance.
Florian.

Bonjour,
vous utilisez le Snakemake de votre environnement Conda? C'est quelle version?
Merci

Bonjour,

J'utilise snakemake-minimal 7.32.4 .

C'était (je crois) la dernière version disponible via bioconda qui n'était pas en 8.x.x . Il me semble qu'à partir de snakemake 8.0 le fonctionnement est légèrement différent, notamment par rapport à l'option --drmaa donc je préférais partir sur une version pour laquelle je pouvais potentiellement trouver plus de documentation, mais c'était peut être une fausse bonne idée ?

Je ne sais pas si le réglage gres est bien transmis à SLURM via DRMAA.

    - dorado_basecalling:slurm="gres=gpu:3g.20gb"

J'aurais peut-être tenté avec des " "

Noté qu'il y a un nouveau backend dédié à SLURM Snakemake executor plugin: slurm | Snakemake plugin catalog à partir de la version 8.

Bonsoir,
Le rajout des " " sur le réglage gres ne semble pas avoir réglé le problème.
Je vais essayer de passer en snakemake version 8 pour voir si cela change quelque chose, merci.

Bonjour,
ça fonctionne pour moi sur la 7.32.4 en enlevant drmaa. Voici un example simple:

[mhennion @ core-login2 09:43]$ bug_snakemake : cat Snakefile 
rule end:
    input: "test.fastq"

rule dorado_basecalling:
    input: 
        "pod5_folder"
    params:
        model = "dna_r10.4.1_e8.2_400bps_sup@v4.2.0"
    output: 
        "test.fastq"
    shell: 'dorado basecaller --emit-fastq {params.model} {input} > {output}'

[mhennion @ core-login2 09:44]$ bug_snakemake : cat config/config.yaml 
jobs: 100
use-singularity: True
keep-going: True
rerun-incomplete: True
printshellcmds: True
max-jobs-per-second: 10
max-status-checks-per-second: 1
latency-wait: 40

cluster:
  sbatch
    --partition={resources.partition}
    --cpus-per-task={resources.cpus}
    --mem={resources.mem_mb}
    --job-name={rule}-{wildcards}
    --output={rule}-{wildcards}-%j.out
    --gres={resources.gres}
    
default-resources:
  - mem_mb=500
  - cpus=1
  - partition=fast
  - gres=""

# Set exceptions: specify custom ressources to a given rule
set-resources:
    - dorado_basecalling:runtime=180
    - dorado_basecalling:mem_mb=16000
    - dorado_basecalling:partition=gpu
    - dorado_basecalling:gres=gpu:1g.5gb

[mhennion @ core-login2 09:29]$ bug_snakemake : module load dorado snakemake/7.32.4
Loading dorado/0.4.3
  Loading requirement: singularity
[mhennion @ core-login2 09:37]$ bug_snakemake : srun snakemake --profile=config/
srun: job 37593337 queued and waiting for resources
srun: job 37593337 has been allocated resources
Using profile config/ for setting default command line arguments.
Building DAG of jobs...
Using shell: /usr/bin/bash
Provided cluster nodes: 100
Job stats:
job                   count
------------------  -------
dorado_basecalling        1
end                       1
total                     2

Select jobs to execute...

[Tue Jan 30 09:37:39 2024]
rule dorado_basecalling:
    input: pod5_folder
    output: test.fastq
    jobid: 1
    reason: Missing output files: test.fastq
    resources: mem_mb=16000, mem_mib=15259, disk_mb=1000, disk_mib=954, tmpdir=<TBD>, cpus=1, partition=gpu, gres=gpu:1g.5gb, runtime=180

dorado basecaller --emit-fastq dna_r10.4.1_e8.2_400bps_sup@v4.2.0 pod5_folder > test.fastq
Submitted job 1 with external jobid 'Submitted batch job 37593338'.
[Tue Jan 30 09:40:01 2024]
Finished job 1.
1 of 2 steps (50%) done
Select jobs to execute...

[Tue Jan 30 09:40:01 2024]
localrule end:
    input: test.fastq
    jobid: 0
    reason: Input files updated by another job: test.fastq
    resources: mem_mb=500, mem_mib=477, disk_mb=1000, disk_mib=954, tmpdir=/tmp, cpus=1, partition=fast, gres=

[Tue Jan 30 09:40:01 2024]
Finished job 0.
2 of 2 steps (100%) done
Complete log: .snakemake/log/2024-01-30T093738.811340.snakemake.log

J'ai mis la config 1g.5gb car avec 3g.20gb, ça me donne UnavailableNodes:gpu-node-02, il doit y avoir un soucis sur ce noeud.
Je n'ai pas encore testé la version 8 de Snakemake, je fais ça bientôt.

Magali

Je confirme le problème sur gpu-node-02 (on regarde ce qui se passe).

Bonjour Magali,

Merci pour votre retour, j'ai testé de mon côté avec votre exemple et effectivement cela fonctionne. Je vous remercie pour votre aide ainsi que votre réactivité, c'est vraiment top !

Je regarderai aussi de mon côté pour migrer sur la version 8 de snakemake mais si jamais vous avez un exemple à partager (lorsque vous aurez le temps d'y regarder) cela m'intéresse fortement.

Merci encore.
Florian.