Snakemake ограничивает использование памяти заданиями

#memory #snakemake

#память #snakemake

Вопрос:

Мне нужно прогнать 20 геномов с помощью snakemake. Поэтому я использую основные шаги, такие как выравнивание, дубликаты разметки, перестройка, повторная калибровка базового вызова и так далее в snakemake. На компьютере, который я использую, до 40 виртуальных ядер и 70 ГБ памяти, и я запускаю программу следующим образом.

 snakemake -s Snakefile -j 40
 

Это работает нормально, но как только он запускает markduplicates вместе с другими программами, он останавливается, поскольку я думаю, что он перегружает 70 доступных гигабайт и выходит из строя.
Есть ли способ установить в snakemake ограничение памяти на 60 ГБ для всех запущенных программ? Я бы хотел, чтобы snakemake выполнял меньше заданий, чтобы оставаться ниже 60 гигабайт, некоторые из шагов требуют много памяти. Приведенная ниже командная строка также вышла из строя и использовала больше памяти, чем выделено.

 snakemake -s Snakefile -j 40 --resources mem_mb=60000
 

Ответ №1:

Недостаточно указать --resources mem_mb=60000 в командной строке, вам также необходимо указать mem_mb правила, которые вы хотите контролировать. Например.:

 rule markdups:
    input: ...
    ouptut: ...
    resources:
        mem_mb= 20000
    shell: ...

rule sort:
    input: ...
    ouptut: ...
    resources:
        mem_mb= 1000
    shell: ...
 

При этом задания будут отправляться таким образом, чтобы общий объем не превышал 60 ГБ за один раз. Например. это будет продолжаться не более 3 markdups заданий, или 2 задания markdups, и 20 sort заданий, или 60 sort заданий.

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

Сколько назначить каждому правилу, в основном зависит от вашего предположения. top а команды htop помогают отслеживать задания и определять, сколько памяти им нужно. Можно было бы разработать более сложные решения, но я не уверен, что оно того стоит… Если вы используете планировщик заданий, такой как slurm, файлы журналов должны указывать максимальное использование памяти для каждого задания, чтобы вы могли использовать их для будущих рекомендаций. Возможно, у других есть лучшие предложения.

Комментарии:

1. Большое спасибо.. Что, если у меня есть 10 правил? Должен ли я включать mem_mb во все правила, а также как я могу рассчитать, сколько нужно поместить в каждое правило? Извините, что на данном этапе это немного сбивает меня с толку.

2. @user3224522 Не беспокойтесь — я отредактировал ответ, чтобы ответить на ваш комментарий.

3. Спасибо! если для bwa mem у меня есть threads = 3 и mem_mb = 30000, будет ли это означать 30000 * 3? или для всех заданий независимо от потоков оно не будет превышать 30G?

4. Я почти уверен thread=3 , что аргумент не будет учитываться при вычислении использования памяти… Просто поэкспериментируйте с этим и посмотрите…