如何在Snakemake中通过SLURM实现GPU分配并解决CUDA设备未识别问题
我用Snakemake搭建依赖GPU和Singularity容器的分析流程,已为特定规则配置了和外部运行时一致的资源与分区,但运行时一直报CUDA无设备错误:
[guppy/error] main: CUDA error at /builds/ofan/ont_core_cpp/ont_core/common/cuda_common.cpp:278: CUDA_ERROR_NO_DEVICE [guppy/warning] main: An error has occurred. Aborting.
作业启动日志显示已分配GPU资源:
Provided resources: mem_mb=7500, mem_mib=7153, disk_mb=1287558, disk_mib=1227911, gpus=1
但CUDA始终识别不到设备。以下是我的basecalling规则和配置文件,试过多种GPU配置方式都没解决。
basecalling规则代码
rule basecalling: message: "Rule {rule} processing" input: rules.fast5_conversion.output output: "{outdir}/guppy_6_5_7_sup/" threads: 3 resources: partition="gpu", gpus=1, mem_mb=7500, time="0-0:5:0" singularity: "docker://genomicpariscentre/guppy-gpu:6.5.7" shell: "guppy_basecaller -i {input} -s guppy_out/ --device auto --compress_fastq --records_per_fastq 0 --config dna_r9.4.1_450bps_sup.cfg"
Snakemake配置文件
cluster: mkdir -p ../logs/{rule} && sbatch --cpus-per-task={threads} --mem={resources.mem_mb} --time={resources.time} --job-name={rule}-{wildcards} --output=../logs/{rule}/{rule}-%j.out --partition={resources.partition} --gpus={resources.gpus} default-resources: - partition=main - mem_mb=1000 - time="01:00:00" - gpus=1 restart-times: 0 max-jobs-per-second: 1 max-status-checks-per-second: 1 local-cores: 1 latency-wait: 60 jobs: 10 keep-going: False rerun-incomplete: True printshellcmds: True use-conda: true conda-frontend: mamba use-singularity: true
解决方案
添加Singularity GPU权限参数:Snakemake默认调用Singularity时不会自动传递GPU访问权限,必须添加
--nv参数启用NVIDIA GPU支持。可以修改规则中的singularity行:singularity: "docker://genomicpariscentre/guppy-gpu:6.5.7 --nv"或者在配置文件中全局设置:
singularity-args: "--nv"明确指定CUDA设备:
--device auto在容器环境中可能识别失效,尝试直接指定设备编号,修改shell命令:guppy_basecaller -i {input} -s guppy_out/ --device cuda:0 --compress_fastq --records_per_fastq 0 --config dna_r9.4.1_450bps_sup.cfg调整集群GPU分配参数格式:部分集群的GPU分配需要使用
--gres=gpu:{数量}而非--gpus={数量},修改配置文件的cluster部分:--gres=gpu:{resources.gpus}若集群要求指定GPU型号,可改为
--gres=gpu:rtx2080ti:{resources.gpus}(根据实际型号调整)。验证容器内CUDA环境:手动启动容器并检查CUDA可用性,执行:
singularity exec --nv docker://genomicpariscentre/guppy-gpu:6.5.7 nvidia-smi若
nvidia-smi无法正常输出,说明集群GPU驱动与容器内CUDA版本不兼容,需更换匹配的Guppy镜像。
内容的提问来源于stack exchange,提问作者Rensco

