Как Snakemake анализирует slurm jobid с использованием --cluster-status и sacct used - PullRequest
0 голосов
/ 23 декабря 2018

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

Скрипт отлично работает в командной строке.Тем не менее, при запуске Snakemake, как указано ниже:

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.Тем не менее, я не знаю, как snakemake анализирует jobid с slurm_status.py, и Google не смог ответить на этот вопрос (ни разреженной информации, полученной с помощью snakemake --help).

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

1 Ответ

0 голосов
/ 24 декабря 2018

Я никогда не использовал 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}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...