Как Snakemake анализирует slurm jobid с использованием --cluster-status и sacct used

Я бегу большой snakemake (v5.3.0) конвейер с использованием slurm планировщик (v14.11.4). К сожалению, ~1/1000 заданий аварийно завершают работу с NODE_FAILED (ExitCode 0), который snakemake не распознает, что приводит к половине готовых выходных файлов.

Чтобы осведомить змея об этом инциденте, я понял, что --cluster-status и скрипт, который анализирует jobid с помощью sacct должен сделать свое дело. Для выполнения этой работы я изменил сценарий, который нашел в Интернете, который теперь выглядит следующим образом:

#!/usr/bin/env python3
import os
import sys
import warnings
import subprocess

jobid = sys.argv[1]
state = subprocess.run(['sacct','-j',jobid,'--format=State'],stdout=subprocess.PIPE).stdout.decode('utf-8')
state = state.split('\n')[2].strip()

map_state={"PENDING":'running',
       "RUNNING":'running', 
       "SUSPENDED":'running', 
       "CANCELLED":'failed', 
       "COMPLETING":'running', 
       "COMPLETED":'success', 
       "CONFIGURING":'running', 
       "FAILED":'failed',
       "TIMEOUT":'failed',
       "PREEMPTED":'failed',
       "NODE_FAIL":'failed',
       "REVOKED":'failed',
       "SPECIAL_EXIT":'failed',
       "":'success'}

print(map_state[state])

Скрипт отлично работает в командной строке. Тем не менее, при инициации змеиного мейкера выполните следующие действия:

SM_ARGS="--cpus-per-task {cluster.cpus-per-task} --mem-per-cpu {cluster.mem-per-cpu-mb} --job-name {cluster.job-name} --ntasks {cluster.ntasks} --partition {cluster.partition} --time {cluster.time} --mail-user {cluster.mail-user} --mail-type {cluster.mail-type} --error {cluster.error} --output {cluster.output}"

snakemake -p \
$* \
 --latency-wait 120 \
-j 600 \
--cluster-config $(dirname $0)/cluster.slurm.json \
--cluster "sbatch $SM_ARGS" \
--cluster-status ~/scripts/snakemake/slurm_status.py

Он начинает отправлять первый пакет из 600 заданий и в основном останавливается сразу же, без дополнительных заданий. Тем не менее, все первоначально представленные задания завершаются успешно. Журнал snakemake создает после того, как все задания отправлены единственная ошибка:

sacct: error: slurmdbd: Getting response to message type 1444
sacct: error: slurmdbd: DBD_GET_JOBS_COND failure: No error

Я предполагаю, что моя команда не разбирает jobid правильно slurm_status.py, Тем не менее, я не знаю, как змейка разбирает jobid к slurm_status.py и Google не может ответить на этот вопрос (ни разреженная информация, полученная с помощью snakemake --help).

Спасибо за вашу поддержку.

1 ответ

Решение

Я никогда не пользовалась snakemakeНо у меня есть предположение. От snakemake документация:

For this it is necessary that the submit command provided to –cluster returns the cluster job id.

Но твой -cluster Команда не возвращает идентификатор задания. Возвращает строку с идентификатором задания в конце. Вы можете попробовать добавить параметр --parsable к sbatch призывание. Согласно инструкции:

Outputs only the job id number and the cluster name if present. The values are separated by a semicolon. Errors will still be displayed.

Если это не сработает, вам придется работать, чтобы получить чистый идентификатор задания из sbatch. Возможно, вы можете инкапсулировать команду sbatch в другой скрипт, который анализирует вывод:

!#/bin/bash

sbatch "$@" | awk '{print $4}'
Другие вопросы по тегам