Как отправить несколько заданий R одновременно?

Редактировать :Я присоединился к дискорд-серверу Linux и спросил об этом, они сказали, что я должен был написать «/dev/sda» вместо «/dev/sda1»

1
23.05.2021, 05:30
1 ответ

Вы можете указать любой или все эти параметры в командной строке qsub, а не в виде #PBS...комментариев в скрипте.

напр. ваш пакетный скрипт может быть переписан -как:

qsub -l nodes=1:ppn=20,walltime=05:00:00 -m e -o default.out -e errorfile script.sh

Со всеми параметрами командной строки qsub script.shдолжен содержать только:

#!/bin/bash

module load R/4.0
Rscript ~/r_script1.R

Вы можете комбинировать оба метода предоставления опций для qsub. например.вы можете указать параметры -oи -eв командной строке, а остальные в скрипте в виде комментариев #PBS:

$ qsub -o default.out -e errorfile script2.sh

script2.sh:

#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e

module load R/4.0

Rscript ~/r_script1.R

Затем вы можете объединить это с циклом bash for:

for i in {1..5} ; do
  qsub -o "default.$i.out" -e "errorfile.$i" script2.sh
done

Если вам нужно передать значение переменной цикла $iв сценарий, это возможно -, но есть несколько разных способов сделать это, в зависимости от того, какое программное обеспечение для управления кластером вы используете (, например. slurm или крутящий момент или что-то еще ). Одним из самых простых способов, который, вероятно, будет доступен независимо от того, какую версию qsubвы используете, является использование опции qsub -v.

напр. если вам нужно запускать разные сценарии R в каждом задании, r _script1.R, r _script2.R и т. д., вы можете использовать -v i, чтобы $iбыл доступен в среде сценария:

for i in {1..5} ; do
  qsub -o "default.$i.out" -e "errorfile.$i" -v i script3.sh
done

script3.sh:

#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e

module load R/4.0

Rscript ~/r_script"$i".R

Некоторые реализации qsub позволяют передавать аргументы сценарию непосредственно в командной строке, которые затем можно использовать как обычные позиционные параметры ($1, $2, $3 и т. д. )в сценарии.

Большинство (все? )реализации qsubтакже поддерживают параметр -tдля указания массива заданий. Доступ к этому можно получить в сценарии задания с помощью переменной среды PBS _ARRAYID. например.

qsub script4.sh

script4.sh (использует перенаправление оболочки для файлов вывода и ошибок, а не параметры qsub -oи -e):

#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e
#PBS -t 1-5

module load R/4.0

Rscript ~/r_script"$PBS_ARRAYID".R > "default.$PBS_ARRAYID.out" 2> "errorfile.$PBS_ARRAYID"

BTW, PBS _ARRAYID — это экспортируемая переменная среды, поэтому при необходимости к ней можно получить доступ в сценарии R с помощью Sys.getenv("PBS_ARRAYID"). Вы можете использовать это, например, для создания имен входных и выходных файлов и для решений if/then/else, чтобы контролировать действия R-скрипта. Это лучше, чем иметь несколько слегка -разных версий одного и того же R-скрипта.

ПРИМЕЧАНИЕ. :Раньше я управлял кластерами HPC, работающими как с Torque, так и с Slurm,прошло около 8 лет с тех пор, как я это сделал. Все приведенные выше примеры написаны по памяти (и с помощью поиска qsubсправочных страниц в Интернете )и не тестировались на реальном кластере. Они могут (возможно, )потребуются некоторые изменения для работы, особенно последний пример с использованием $PBS _ARRAYID -они предлагаются в качестве грубых примеров того, как вы можете делать то, что хотите.

0
28.07.2021, 11:30

Теги

Похожие вопросы