【问题标题】:Snakemake SGE Cluster Submission IssueSnakemake SGE 集群提交问题
【发布时间】:2017-05-16 20:56:55
【问题描述】:

我是snakemake 和使用集群的新手,因此我将不胜感激!

我有一个可以在服务器上正常运行的蛇文件,但是当我尝试在集群上运行它时,我没有找到合适的命令来提交作业并让它执行。它像其他用户发现的那样“停滞不前”。 https://groups.google.com/forum/#!searchin/snakemake/cluster|sort:relevance/snakemake/dFxRIgKDxUU/od9az3MuBAAJ

我在一个 SGE 集群上运行它,其中只有一个节点(头节点)我们通过它提交作业。我们不能以交互方式运行作业或在头节点上运行密集的命令。通常我会像这样运行 bwa 命令:

qsub -V -b y 'bwa mem -t 20 /reference/hg38.fa in/R_1.fastq in/R_2.fastq |samtools view -S -bh -@ 7 > aln_R.bam' 

所以我遵循了关于通过建议此代码的头节点在集群上提交作业的常见问题解答:

qsub -N PIPE -cwd -j yes python snakemake --cluster "ssh user@headnode_address 'qsub -N pipe_task -j yes -cwd -S /bin/sh ' " -j

这对我不起作用,因为我的终端期望 python 是一个文件。要实际调用程序的命令,我必须使用这个:

qsub -V -N test -cwd -j y -b y snakemake --cluster "qsub " -j 1

-by 允许二进制或脚本。如果我运行它,qstat 将显示程序正在运行,但是有一个内部错误并且它永远不会完成。

此外,“qsub”中的内容被视为snakemake 命令。当我尝试使用诸如 -j y 之类的 sge 标志时,我遇到了来自 snakemake 的错误:

qsub -V -N test -cwd -j y -b y snakemake --cluster "qsub -j y" -j 1
snakemake: error: argument --cores/--jobs/-j: invalid int value: 'y' 

我可以完美地提交 tmp 文件中的 snakemake shell 脚本,但是我不能使用 -by 标志并添加了 -S /bin/bash 标志。因此脚本本身可以工作,但我认为它们从头节点推送到集群的方式无法以某种方式工作。我也可能完全偏离目标!我很想知道如何向我的系统管理员谈论 SGE,因为我真的不知道该向他们询问我的问题。

总结:有没有其他人遇到过需要调用 -by y 以使 snakemake --cluster 在 SGE 上运行?它是否也将“qsub”视为蛇形命令?或者是否有人有另一种解决方法来在 SGE 的头节点上提交作业?我应该问我的 SGE 系统管理员什么问题?

【问题讨论】:

    标签: python linux sungridengine snakemake


    【解决方案1】:

    为了简化事情:

    1. 您不需要命名您的工作 (-N PIPE)
    2. 您不需要设置工作目录 (-cwd)
    3. Snakemake 可以很好地处理作业的 STDERR 和 STDIN(-j 是)
    4. 我对这面旗帜的了解还不够,请保留它。 ('-b y')
    5. 您可能还需要 -S 参数,见下文。

    Qsub 参数:

    [-b y[es]|n[o]]      handle command as binary
    [-S path_list]       command interpreter to be used
    [-V]                 export all environment variables
    

    从包含您的 Snakefile 的目录中尝试以下调用。我的 SGE 集群需要这个“-S /bin/bash”参数。我有关于“-S”的理论,但我不能确定为什么需要它。这篇文章中的答案反映了我对为什么需要它的很多怀疑......SGE Cluster - script fails after submission - works in terminal

    试试

    $snakemake --jobs 10 --cluster "qsub -V -b y"
    

    $snakemake --jobs 10 --cluster "qsub -V -b y -S /bin/bash"
    

    这样,您的 Snakemake 参数(--jobs 和 --cluster)与 qsub 参数(-V、-b 和 -S)明显分开。

    你的 Snakefile 应该看起来像这样。它可以更好地编码,但这是基本思想。

    run bwaRULE:
        input:
            "in/R_1.fastq", "in/R_2.fastq"
        output:
            "aln_R.bam"
        shell:
            "bwa mem -t 20 /reference/hg38.fa {input} | samtools view -S -bh -@ 7 > {output}"
    

    编辑回应 OP 的评论。

    TL;DR 祝你一切顺利。我不认为这是 Snakemake 的用途。 Inti Pedroso 重新发明了轮子,您可能也必须这样做。由于您也参考了他的帖子,我会指出他指定系统管理员“不喜欢”在头节点上运行 Snakemake,因为担心它会消耗太多资源。

    PID   USER      PR   NI VIRT  RES  SHR S %CPU  %MEM  TIME+  COMMAND
    26389 tboyarsk  19   0  318m  62m  11m R 99.8  0.1   0:10.96 snakemake
    

    这是一个 1000 个作业的 DAG,使用了我编写的 20 多个 Snakemake 模块中的 14 个。它最终尝试使用 100% 的 CPU,但时间小于 15 秒。内存使用量不超过 500MB。我强烈建议您在开始工作之前与您的系统管理员再试一次。获得许可将为您节省大量时间。

    http://snakemake.readthedocs.io/en/stable/project_info/faq.html#how-can-i-run-snakemake-on-a-cluster-where-its-main-process-is-not-allowed-to-run-on-the-head-node

    https://bitbucket.org/snakemake/snakemake/issues/25/running-snakemake-via-cluster-engine

    我正在根据我的员工的要求重命名它。它们还不是超级描述性的。 4 重新排列后的样本在重新构建、注释和汇总数据之前通过染色体进行拆分和处理。

    Job counts:
    count   jobs
    4   alignBAM
    1   all
    8   canonical
    8   catVCF
    4   cosmic
    4   dpsnp
    4   filteredBAM
    4   indel
    4   indexBAM
    336 mPileSPLIT
    4   markdupBAM
    672 mpileup2SPLIT
    4   sortBAM
    8   tableGET
    4   undoBAM
    1069
    

    编辑 2017 年 5 月 26 日

    添加以澄清大型管道的 Snakemake 提交在头节点上的资源消耗。

    根据经验,这是运行此管道导致的头节点上的压力//资源消耗的想法。资源消耗在提交管道的前 30 秒内达到峰值。在那之后,头节点资源消耗是微不足道的。头节点只是使用最少的资源来监视作业状态并提交下一个调用,就像调度程序通常所做的那样。不再需要资源密集型的决定。

    范围

    • 17GB BAM 文件(4 个样本)
    • 持续时间(并行运行时为 6 小时)
    • 第一个 15-20 秒 DAG 组装后的头节点使用量很小。

    时间线

    1. 开始
    2. 15-20 秒头节点竞争资源 (
    3. 作业是通过 Snakemake 命令从头节点到子节点的 qsub'b,几乎是即时的。很少的开销,主要是字符串连接和变量链接。这种情况一直持续到所有作业都提交完毕。

    【讨论】:

    • 感谢您的回复!但是,我无法在集群头节点上运行snakemake(遗憾的是唯一可用的节点)。我们只能提交作业,这就是为什么我必须先 qsub snakemake 命令,然后在 snakemake 编写的脚本上调用 qsub。我还尝试在我的 Snakefile 中使用 shell.executable("/bin/bash"),因为我的服务器认为它是一个 snakemake 命令,所以我不能将 -S /bin/bash 与 "qsub" 一起使用。这并没有让它更好地工作。
    • 我已经联系了我的系统管理员,但它是一个小团队,他们似乎没有优先考虑这些问题。集群是我不久前离开的人配置的,所以我想看看社区是否有类似的问题。但我认为设置只是一个令人困惑的黑匣子。关于仅使用头节点的注意事项:我有巨大的 WGS fasta 文件要处理,所以我想为某些作业分配更多内存并 qsub 它,因为头节点不能处理太多。感谢您的尝试!
    • 使用 Snakemake + DRMAA 可以很容易地为某些作业分配更多内存。我对每个规则都有特定的内存要求,可以在开始运行之前在我的 cluster-config 文件中进行调整。我也可以根据样本名称或文件大小来做,但我还需要这种粒度。我想说的是,Snakemake 需要访问头节点,以便它可以与调度程序交互。在头节点上执行的实际处理只是 Snakemake 与调度程序或与之接近的交互。 WGS 的处理被安排到子节点。
    【解决方案2】:

    当您说您不能交互式使用节点时,您确定您的集群管理员已经禁止使用 qrsh 和 qlogin 以及 ssh?这两个命令将作业提交到可以为您提供交互式 shell 但受 SGE 控制的集群。

    我怀疑您遇到了命令行双重解析的问题。一次是在提交作业时,一次是在 SGE 尝试启动您的命令时。与其尝试将整个内容作为命令行提交,不如将您的 snakkmake 命令写入 shell 文件并提交(不带 -by y)

    #!/bin/sh
    #$ -S /bin/sh
    exec python snakemake -j 1 --cluster "qsub -j y"
    

    或者,创建一个包装脚本,其中嵌入您希望 snakemake 在为下级作业调用 qsub 时使用的选项。

    #!/bin/sh
    exec qsub -j y "$@"
    

    然后告诉snakemake使用它:

    qsub -V -N test -cwd -j y -b y snakemake  -j 1 --cluster "wrapper"
    

    或者在命令行中添加额外的转义和引用层,直到它起作用为止。

    【讨论】:

    • 非常感谢!我没有想过使用 qlogin(之前我使用 qsub -I 来访问另一个地方的交互式服务器)。我最终从命令行使用 -by 运行它。 snakemake -c "qsub -cwd -j y -V -S /bin/bash -b y" -j 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多