You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Snakemake中通过SLURM实现GPU分配并解决CUDA设备未识别问题

问题:Snakemake+Singularity+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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:59:54