Snakemake: объедините несколько заданий вместе - PullRequest
3 голосов
/ 07 октября 2019

У меня есть довольно простой конвейер snakemake, который принимает входной файл и выполняет три последовательных шага для получения одного вывода. Каждая отдельная работа очень быстро. Теперь я хочу применить этот конвейер к> 10k файлам в кластере SGE. Даже если я использую group, чтобы иметь одно задание для каждых трех правил для каждого входного файла, я все равно отправляю> 10k кластерных заданий. Есть ли способ вместо этого передать ограниченное количество заданий кластера (скажем, 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 голосов
/ 09 октября 2019

Единственное решение, которое я могу придумать, - это объявить правила A, B и C локальными правилами, чтобы они выполнялись в основном задании по созданию змеи, а не отправлялись в качестве задания. Затем вы можете разбить ваш 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, другое для 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]])
0 голосов
/ 08 октября 2019

Вы можете обработать все файлы 10k в одном и том же правиле, используя цикл for (не уверен, что именно это имеет в виду Манавалан Гаджапати). Например:

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

...