Одновременное выполнение нескольких R-скриптов

В моем тезисе мне нужно выполнить много симуляционных исследований, которые все занимают довольно много времени. Мой компьютер имеет 4 ядра, поэтому мне было интересно, можно ли одновременно запускать два R-скрипта в Rstudio, разрешив им использовать два разных ядра? Если это можно было бы сделать, я мог бы сэкономить много времени, просто оставив компьютер в течение ночи, запуская все эти сценарии.

Ответ 1

РЕДАКТИРОВАТЬ: Учитывая улучшения RStudio, этот метод больше не является лучшим способом сделать это - см. Ответ Тома Келли ниже


Предполагая, что результаты не обязательно должны быть в одной и той же среде, вы можете достичь этого с помощью проектов RStudio: https://support.rstudio.com/hc/en-us/articles/200526207-Using-Projects

Сначала создайте два отдельных проекта. Вы можете открыть оба одновременно, что приведет к двум попыткам. Затем вы можете открыть каждый скрипт в каждом проекте и выполнить каждый из них отдельно. Затем в вашей ОС можно управлять распределением ядра.

Ответ 2

В RStudio

Если вы щелкните правой кнопкой мыши на RStudio, вы сможете открыть несколько отдельных "сессий" RStudio (независимо от того, используете ли вы Projects или нет). По умолчанию они будут использовать 1 ядро каждый.

Обновление (июль 2018 г.): RStudio v1.2.830-1, доступный в виде предварительного выпуска, поддерживает панель "Задания". Это посвящено запуску R-скриптов в фоновом режиме отдельно от интерактивного R-сеанса:

  • Запустите любой R-скрипт как фоновое задание в чистом R-сеансе

  • Мониторинг прогресса и просмотр вывода скрипта в реальном времени

  • При желании предоставьте заданиям глобальную среду при запуске и экспортируйте значения обратно после завершения

Это будет доступно в RStudio версии 1.2.

Запуск скриптов в терминале

Если у вас есть несколько сценариев, которые, как вы знаете, выполняются без ошибок, я бы порекомендовал запускать их с различными параметрами через командную строку:

RCMD script.R
RScript script.R
R --vanilla < script.R

Запуск в фоновом режиме:

nohup Rscript script.R &

Здесь "&" запускает скрипт в фоновом режиме (его можно получить с помощью fg, отслеживать с помощью htop и убить с помощью kill <pid> или pkill rsession), а nohup сохраняет вывод в файл и продолжает работать, если терминал закрыт,

Передача аргументов в скрипт:

Rscript script.R 1 2 3

Это передаст c(1, 2, 3) в R как выходные данные commandArgs() так что цикл в bash может запустить несколько экземпляров Rscript с циклом bash:

for ii in 1 2 3
  do
  nohup Rscript script.R $ii &
  done

Запуск параллельного кода в R

Вы часто обнаружите, что определенный шаг в вашем R-скрипте замедляет вычисления, могу ли я предложить запуск параллельного кода в вашем R-коде, а не запускать их по отдельности? Я бы порекомендовал пакет snow для запуска параллельных циклов в R. Обычно вместо использования:

cl <- makeCluster(n)
# n = number of cores (I'd recommend one less than machine capacity)
clusterExport(list=ls()) #export input data to all cores
output_list <- parLapply(cl, input_list, function(x) ... )
stopCluster() # close cluster when complete (particularly on shared machines)

Используйте это везде, где вы обычно используете функцию lapply в R для параллельного запуска.

Ответ 3

Вы можете получить многоядерный parallelism (как описано здесь https://cran.r-project.org/web/packages/doMC/vignettes/gettingstartedMC.pdf) в том же сеансе со следующим кодом

if(Sys.info()["sysname"]=="Windows"){
  library(doParallel)
  cl<-makeCluster(numberOfCores)
  registerDoParallel(cl)
}else{
  library(doMC)
  registerDoMC(numberOfCores)
}
library(foreach)

someList<-list("file1","file2")
returnComputation <-
  foreach(x=someList) %dopar%{
    source(x)
  }


if(Sys.info()["sysname"]=="Windows") stopCluster(cl)

Вам нужно будет адаптировать ваш выход.

Ответ 4

Все, что вам нужно сделать (при условии, что вы используете Unix/Linux), - запустить пакетную команду R и поместить ее в фоновый режим. Это автоматически выделит его на процессор.

В оболочке выполните:

/your/path/$ nohup R CMD BATCH --no-restore my_model1.R &
/your/path/$ nohup R CMD BATCH --no-restore my_model2.R &
/your/path/$ nohup R CMD BATCH --no-restore my_model3.R &
/your/path/$ nohup R CMD BATCH --no-restore my_model4.R &

выполняет команды, сохраняет распечатку в файле my_model1.Rout и сохраняет все созданные объекты R в файле .RData. Это будет запускать каждую модель на разных процессорах. Прогон сеанса и вывод будут помещены в выходные файлы.

Если вы делаете это через Интернет, через терминал, вам нужно будет использовать команду nohup. В противном случае при выходе из сеанса процессы будут прекращены.

/your/path/$ nohup R CMD BATCH --no-restore my_model1.R &

Если вы хотите дать процессам низкий приоритет, вы делаете:

/your/path/$ nohup nice -n 19 R CMD BATCH --no-restore my_model.R &

Лучше всего включить в начало скрипта некоторый код для загрузки и прикрепления соответствующего файла данных.

НИКОГДА не делай просто

/your/path/$ nohup R CMD BATCH my_model1.R &

Это испортит файл .RData (все смешные объекты тоже там) и серьезно подорвет воспроизводимость. То есть

--no-restore

или же

--vanilla

твои дорогие друзья.

Если у вас слишком много моделей, я предлагаю выполнить вычисления на облачной учетной записи, поскольку у вас может быть больше ЦП и ОЗУ. В зависимости от того, что вы делаете, и от пакета R, модели могут занять часы на текущем оборудовании.

Я научился этому нелегко, но здесь есть хороший документ:

http://users.stat.umn.edu/~geyer/parallel/parallel.pdf

НТН.

Ответ 5

Если вы хотите провести смущающую параллель, вы можете открыть столько терминалов, сколько хотите, на вкладке терминала (расположенной сразу после вкладки консоли) и запустить свой код с помощью Rscript yourcode.R. Каждый код будет работать на отдельном ядре по умолчанию. При необходимости вы также можете использовать аргумент командной строки (как упоминалось в @Tom Kelly).