Где распараллелить?Создание bash-скрипта для распараллеливания на нескольких узлах - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу распараллелить работу по нескольким узлам.Каждое ядро ​​должно запускать определенную комбинацию параметров, а затем сохранять результат в виде файла.Использование srun для запуска R-скрипта заставляет все узлы и ядра выполнять один и тот же код.Неиспользование srun запускает код только на одном узле, где он затем работает параллельно, но не использует ядра на других узлах.

Я попытался дать разные записи для --nodes = [], --tasks-per-node = [], --cpus-per-task = [] или --ntasks = [] и экспериментировалс некоторыми опциями в srun.
С другой стороны, я попытался вызвать другие узлы из R-скрипта.

Мне нужен скрипт, который распределяет задачи по всем ядрам, давая имкомбинации параметров, которые они должны оценить.На данный момент я даже не уверен, какие части проблемы должны быть обработаны в скрипте bash, а какие - в исполняемом скрипте.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Обработка из R-скрипта

При запуске R-скрипта с srun способ заставить все экземпляры делать что-то другое (кроме использования MPI, что нетривиально)) означает ссылку на переменную окружения SLURM_PROC_ID.

Вставьте строку, например

idx = as.numeric(Sys.getenv('SLURM_PROC_ID'))

, и получите все комбинации параметров в списке.Затем выберите комбинацию из списка в зависимости от idx.

Обработка из сценария отправки Bash

Вы также можете управлять распределением в сценарии отправки с помощью конструкциикак следующее (с https://www.gnu.org/software/parallel/parallel_tutorial.html)

parallel srun --exclusive -n 1 -c1 Rscript myscript.R ::: {1..10}

для запуска myscript.R 10 раз, с одним аргументом в диапазоне от 1 до 10 соответственно.Затем вы получите значение аргумента в R-скрипте с commandArgs()

0 голосов
/ 07 февраля 2019

Это похоже на вариант использования для MPI , стандарта для написания приложений с распределенной памятью.Он также доступен для использования с R.

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

В этом случае я бы рекомендовал использовать ваш сценарий как есть, но писать сценарий bash (как вы сами предлагали) для обработки распределения по узлам.Этот сценарий bash должен просто отправить (srun) несколько выполнений сценария R с различными комбинациями параметров в кластер.В зависимости от объема работы, которую вы хотите выполнить, вы можете написать код для автоматического поиска подходящих параметров srun в зависимости от общего количества доступных ядер и количества выполняемых сценариев.Вы также можете просто вручную определить, сколько ядер должно потреблять каждое выполнение.

Использование srun для запуска R-скрипта заставляет все узлы и ядра выполнять один и тот же код.

Это я не до конца понимаю.Если вы srun ваш R-скрипт с разными комбинациями параметров, разные узлы будут вычислять разные части проблемы.Конечно, вам придется агрегировать результаты вручную или автоматически в вашем bash-скрипте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...