Snakemake:将多个作业聚在一起

时间:2019-10-07 16:13:19

标签: hpc snakemake

我有一个非常简单的snakemake管道,该管道接受一个输入文件,执行三个后续步骤来产生一个输出。每个单独的工作都非常快。现在,我想将此管道应用于SGE群集上的> 10k个文件。即使我使用group每个输入文件中的每三个规则有一个作业,我仍然会提交超过1万个群集作业。有没有办法提交有限数量的集群作业(比如说100个)并在它们之间平均分配所有任务?

一个例子可能是

rule A:
        input: {prefix}.start
        output: {prefix}.A
        group "mygroup"

rule B:
        input: {prefix}.A
        output: {prefix}.B
        group "mygroup"

rule C:
        input: {prefix}.B
        output: {prefix}.C
        group "mygroup"

rule runAll:
        input: expand("{prefix}.C", prefix = VERY_MANY_PREFIXES)

然后运行 snakemake --cluster "qsub <some parameters>" runAll

2 个答案:

答案 0 :(得分:0)

您可以使用for循环以同一规则处理所有10k文件(不确定这是否是Manavalan Gajapathy想到的)。例如:

rule A:
    input:
        txt= expand('{prefix}.start', prefix= PREFIXES),
    output:
        out= expand('{prefix}.A', prefix= PREFIXES),
    run:
        io= zip(input.txt, output.out)
        for x in io:
            shell('some_command %s %s' %(x[0], x[1]))

与规则B和C相同。

另请参阅snakemake local-rules

答案 1 :(得分:0)

我能想到的唯一解决方案是将规则A,B和C声明为本地规则,以便它们在主snakemake作业中运行,而不是作为作业提交。然后,您可以将runAll分为几批:

rule runAll1:
        input: expand("{prefix}.C", prefix = VERY_MANY_PREFIXES[:1000])

rule runAll2:
        input: expand("{prefix}.C", prefix = VERY_MANY_PREFIXES[1000:2000])

rule runAll3:
        input: expand("{prefix}.C", prefix = VERY_MANY_PREFIXES[2000:3000])

...etc

然后,您为runAll1提交一个snakemake作业,为runAll2提交另一个,依此类推。您可以通过bash循环轻松地做到这一点:

for i in {1..10}; do sbatch [sbatch params] snakemake runAll$i; done;

比创建多个runAll规则更具可扩展性的另一个选择是拥有一个执行以下操作的辅助python脚本:

import subprocess

for i in range(0, len(VERY_MANY_PREFIXES), 1000):
    subprocess.run(['sbatch', 'snakemake'] + ['{prefix}'.C for prefix in VERY_MANY_PREFIXES[i:i+1000]])