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