Как я могу распараллелить в r на окнах - пример?

20

Как получить параллелизацию кода для работы в r в Windows? Включите простой пример. Публикация этого автоответчика, потому что это было довольно неприятно для работы. Вы обнаружите, что параллельный пакет НЕ работает сам по себе, но пакетный снегопад работает очень хорошо.

    
задан Carbon 29.05.2014 в 07:32
источник
  • Как пассивный пакет терпит неудачу для вас? Это, безусловно, работает для многих людей, но я думаю, что все пакеты параллельной обработки имеют больше проблем в Windows. –  Steve Weston 06.06.2014 в 20:02
  • Не работает вообще на окнах, но не могу сказать, почему. Вы должны использовать снег. –  Carbon 11.06.2014 в 09:39
  • @SteveWeston он терпит неудачу в том смысле, что он не позволяет специфицировать более одного ядра для обработки. stat.ethz.ch/R-manual/R-devel/library/parallel/html/...: «Он полагается на forking и, следовательно, недоступен в Windows, если mc.cores = 1.» –  ijoseph 18.07.2016 в 22:43
  • @ijoseph Эта цитата применима только к функциям «mc» (например, mclapply, mcMap, mcmapply и mcparallel). Параллельно функции, которые были получены из пакета снега (например, parLapply, clusterApply и clusterApplyLB), не используют fork и должны выполняться параллельно в Windows. Я использовал parLapply как параллельно, так и снегом успешно в Windows, но я также видел множество способов, с помощью которых оба пакета могут терпеть неудачу. Вот почему мне было любопытно, как именно это провалилось. –  Steve Weston 18.07.2016 в 23:05
  • @SteveWeston ах. Не понимал, что параллельно были те другие методы, которые не зависели от вилки. Будет полезно, спасибо большое! –  ijoseph 18.07.2016 в 23:22

4 ответа

27

Проводя это, потому что это заставило меня чертовски навсегда разобраться. Вот простой пример распараллеливания в r, который позволит вам проверить, работают ли для вас все, и вы попадаете на правильный путь.

library(snow)
z=vector('list',4)
z=1:4
system.time(lapply(z,function(x) Sys.sleep(1)))
cl<-makeCluster(###YOUR NUMBER OF CORES GOES HERE ###,type="SOCK")
system.time(clusterApply(cl, z,function(x) Sys.sleep(1)))
stopCluster(cl)

Вы также должны использовать библиотеку doSNOW для регистрации foreach в снежном кластере, это приведет к автоматическому распараллеливанию множества пакетов. Команда для регистрации - registerDoSNOW(cl)cl - возвращаемое значение из makeCluster() ), команда, которая отменяет регистрацию, равна registerDoSEQ() . Не забудьте выключить кластеры.

    
ответ дан Carbon 29.05.2014 в 07:32
источник
10

Это сработало для меня, я использовал пакет doParallel, потребовалось 3 строки кода:

# process in parallel
library(doParallel) 
cl <- makeCluster(detectCores(), type='PSOCK')
registerDoParallel(cl)

# turn parallel processing off and run sequentially again:
registerDoSEQ()

Расчет случайного леса уменьшился с 180 секунд до 120 секунд (на компьютере с Windows с 4 ядрами).

    
ответ дан Sander van den Oord 07.05.2015 в 15:02
источник
4

Я думаю, что эти библиотеки помогут вам:

foreach (facilitates executing the loop in parallel)
doSNOW (I think you already use it)
doMC (multicore functionality of the parallel package)

Пусть эта статья также поможет вам

Ссылка

Ссылка

    
ответ дан rischan 29.05.2014 в 08:12
источник
  • Пакет doMC зависит от функции mclapply для выполнения задач, поэтому он не может выполняться параллельно в Windows. –  Steve Weston 06.06.2014 в 19:37
3

На основе информации здесь я был способный преобразовать следующий код в параллельную версию, работающую под R Studio в Windows 7.

Исходный код:

#
# Basic elbow plot function
#
wssplot <- function(data, nc=20, seed=1234){
    wss <- (nrow(data)-1)*sum(apply(data,2,var))
    for (i in 2:nc){
        set.seed(seed)
        wss[i] <- sum(kmeans(data, centers=i, iter.max=30)$withinss)}
    plot(1:nc, wss, type="b", xlab="Number of clusters", 
       ylab="Within groups sum of squares")
}

Параллельный код:

library("parallel")

workerFunc <- function(nc) {
  set.seed(1234)
  return(sum(kmeans(my_data_frame, centers=nc, iter.max=30)$withinss)) }

num_cores <- detectCores()
cl <- makeCluster(num_cores)
clusterExport(cl, varlist=c("my_data_frame")) 
values <- 1:20 # this represents the "nc" variable in the wssplot function
system.time(
  result <- parLapply(cl, values, workerFunc) )  # paralel execution, with time wrapper
stopCluster(cl)
plot(values, unlist(result), type="b", xlab="Number of clusters", ylab="Within groups sum of squares")

Не предлагая это идеально или даже лучше всего, новичок, демонстрирующий, что параллель, похоже, работает под Windows. Надеюсь, что это поможет.

    
ответ дан Mark 17.01.2015 в 15:16
источник