Snakemake - переопределить конфигурацию кластера LSF (bsub) в соответствии с правилами

Можно ли определить параметры по умолчанию для памяти и ресурсов в файле конфигурации кластера, а затем при необходимости переопределить их в соответствии с конкретным правилом? Привязано ли поле resources в правилах напрямую к файлу конфигурации кластера? Или это просто модный способ params поля для удобства чтения?

В приведенном ниже примере, как мне использовать конфигурации кластера по умолчанию для rule a, но использовать пользовательские изменения (memory=40000 и rusage=15000) в rule b?

cluster.json:

{
    "__default__":
    {
        "memory": 20000,
        "resources": "\"rusage[mem=8000] span[hosts=1]\"",
        "output": "logs/cluster/{rule}.{wildcards}.out",
        "error": "logs/cluster/{rule}.{wildcards}.err"
    },
}

Snakefile:

rule all:
    'a_out.txt', 'b_out.txt'

rule a:
    input:
        'a.txt'
    output:
        'a_out.txt'
    shell:
        'touch {output}'

rule b:
    input:
        'b.txt'
    output:
        'b_out.txt'
    shell:
        'touch {output}'

Команда на выполнение:

 snakemake --cluster-config cluster.json 
           --cluster "bsub -M {cluster.memory} -R {cluster.resources} -o logs.txt" 
           -j 50

Я понимаю, что можно определить требования к ресурсам для конкретных правил в конфигурационном файле кластера, но я бы предпочел определять их непосредственно в Snakefile, если это возможно.

Или, если есть лучший способ реализовать это, пожалуйста, дайте мне знать.


person Manavalan Gajapathy    schedule 01.12.2017    source источник
comment
Нашел этот связанный пост сразу после того, как разместил здесь - stackoverflow.com/q/45111823/3998252. Я не удаляю свой пост, так как в этом вопросе содержится несколько дополнительных деталей с примерами.   -  person Manavalan Gajapathy    schedule 01.12.2017


Ответы (2)


Вы можете напрямую добавить resources в каждое из ваших правил:

rule all:
    'a_out.txt' , 'b_out.txt'

rule a:
    input:
        'a.txt'
    output:
        'a_out.txt'
    resources:
        mem_mb=40000
    shell:
        'touch {output}'
rule b:
    input:
        'b.txt'
    output:
        'b_out.txt'
    resources:
        mem_mb=20000
    shell:
        'touch {output}'

Затем вы должны удалить параметр resources из вашего .json, чтобы командная строка не перекрывала файл snakefile:

new.cluster.json:

{
    "__default__":
    {
        "output": "logs/cluster/{rule}.{wildcards}.out",
        "error": "logs/cluster/{rule}.{wildcards}.err"
    },
}
person bapors    schedule 19.02.2018
comment
Я надеялся установить ограничения ресурсов по умолчанию в файле конфигурации кластера, а затем изменить их, когда это необходимо в Snakefile, в соответствии с конкретным правилом. Идея заключается в том, что мне нужно будет менять ресурсы очень редко. С учетом сказанного, в последнее время я размышлял о реализации того, что вы здесь описали. Я бы предпочел первое ради уменьшения многословности, но можно также возразить, что все правила хранятся в одном файле. - person Manavalan Gajapathy; 23.02.2018

В new.cluster.json вы можете фактически определять ресурсы для определенных правил. Итак, в вашем случае вы бы сделали следующее

{
    "__default__":
    {
        "memory": 20000,
        "resources": "\"rusage[mem=8000] span[hosts=1]\"",
        "output": "logs/cluster/{rule}.{wildcards}.out",
        "error": "logs/cluster/{rule}.{wildcards}.err"
    },
    "b":
    {
        "memory": 40000,
        "resources": "\"rusage[mem=15000] span[hosts=1]\"",
        "output": "logs/cluster/{rule}.{wildcards}.out",
        "error": "logs/cluster/{rule}.{wildcards}.err"
    },
}

Затем в Snakefile вы можете ссылаться на эти ресурсы, импортировав new.cluster.json и ссылаясь на него в своем правиле.

import json

with open('new.cluster.json') as fh:
    cluster_config = json.load(fh)

rule all:
    'a_out.txt' , 'b_out.txt'

rule a:
    input:
        'a.txt'
    output:
        'a_out.txt'
    shell:
        'touch {output}'
rule b:
    input:
        'b.txt'
    output:
        'b_out.txt'
    resources:
        mem_mb=cluster_config["b"]["memory"]
    shell:
        'touch {output}'

Если вы просмотрите этот репозиторий, вы увидите, как я использую эти конфигурации кластера в дикой природе.

person Michael Hall    schedule 05.11.2018