Как получить идентификатор задания из массива заданий внутри цикла? - PullRequest
0 голосов
/ 01 июля 2019

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

Идея состоит в том, что у нас есть три шага, которые зависят от предыдущего шага:

  • Шаг 1: Настройка для итерации i

  • Шаг 2: Подгонка моделей на итерации i

  • Шаг 3: Найти лучшую модель на итерации i

Поскольку вам необходимо, чтобы все модели (> 10) завершили обучение перед началом шага 3, простая цепочка старых заданий не является оптимальной. Поэтому я пытаюсь использовать рабочие массивы, которые выполняют именно то, что я хочу: только когда все мои модели установлены, я перехожу к шагу 3.

Однако у меня проблемы с настройкой зависимости. Мне сказали, что зависимость для всего массива заданий должна быть идентификатором задания (который является числом), а не именем задания (например, runSetup$n_subject$i).

Итак: как мне получить идентификатор задания из всего массива заданий? Или еще лучше: как лучше установить зависимость для всего массива заданий?

Этот ответ очень интересен, но не говорит мне, как наилучшим образом установить зависимость, когда мой массив заданий содержит 10 или более заданий.

#!/bin/bash

# Subject to consider
n_subject=$1 # takes in input arguments from command line.
cohort=$2
priors_and_init=$3
nparam=16

for ((i = 1; i <= $nparam; i++)); do
    # Run setup
    if [[ $i -eq 1 ]]; then
      bsub -J "runSetup$n_subject$i" matlab  -singleCompThread -nodisplay -r "setup_greedy_forward($n_subject,$cohort, $priors_and_init, $i)"
    else
      last_iter=$((i-1))
      bsub -J "runSetup$n_subject$i" -w "done(saveBest$n_subject$last_iter)" matlab  -singleCompThread -nodisplay -r "setup_greedy_forward($n_subject,$cohort, $priors_and_init, $i)"
    fi

    # Fit models
    max_sim=$((nparam-i+1))
    bsub -W 08:00 -J "fitDCMs$n_subject[1-$max_sim]" -w "done(runSetup$n_subject$i)" -R "rusage[mem=16000]" matlab  -singleCompThread -nodisplay -r "fit_dcm_greedy_forward($n_subject,$cohort, $priors_and_init, \$LSB_JOBINDEX)"

    # Extracting the job ID from the fitDCMs jobs
    # Then: For all trained DCMs, get the best model and save it
    JOBID=$(get_jobid bsub -W 08:00 -J "fitDCMs$n_subject[1-$max_sim]" -w "done(runSetup$n_subject$i)" -R "rusage[mem=16000]" matlab  -singleCompThread -nodisplay -r "fit_dcm_greedy_forward($n_subject,$cohort, $priors_and_init, \$LSB_JOBINDEX)" 2> /dev/null)
    if [ -n "$jobid" ]; then
        bsub -J "saveBest$n_subject$i" -w "numdone($JOBID,*)" matlab -singleCompThread -nodisplay -r "save_best_model($n_subject,$cohort, $priors_and_init, $i)"
    fi
done


Вывод, который я получаю:

MATLAB job.
Job <94564566> is submitted to queue <normal.24h>.
MATLAB job.
Job <94564567> is submitted to queue <normal.24h>.
MATLAB job.
saveBest121: No matching job found. Job not submitted.
MATLAB job.
runSetup122: No matching job found. Job not submitted.
[…]

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Немного поиска, я нашел способ получить идентификатор работы.

JOBID=$(bsub command1 | awk '/is submitted/{print substr($2, 2, length($2)-2);}')
if [ -n "$JOBID" ]; then
    bsub -w "numdone($JOBID,*)" command2
fi

Первая строка представляет работу и извлекает идентификатор работы.

Этот ответ был найден здесь .

0 голосов
/ 03 июля 2019

Мне сказали, что зависимость для всего массива заданий должна быть идентификатором задания (который является числом), а не именем задания

Это должно сработать.Например:

bsub -J "iterate[1-10]" ...
bsub -J "finalize" -w "done(iterate)" ...

Задание finalize не запустится, пока не будут выполнены все элементы iterate.

...