Как применить функцию clusterApply к параллельным вычислениям?

#r #parallel-processing #cluster-computing

#r #параллельная обработка #кластерные вычисления

Вопрос:

У меня есть функция sum_var , которая принимает целое число в качестве входных данных и возвращает действительное число в качестве выходных данных. Я проверил эту функцию на некоторых входах, и она работает хорошо.

Я хотел бы использовать clusterApply для использования мой процессор (6 ядер и 12 логических процессоров). Я попытался изменить код, указанный в классе

 library("parallel")
cl <- makeCluster(6)
res_par <- clusterApply(cl, 1:10000, fun = sum_var)
  

Но он возвращает ошибку Error in checkForRemoteErrors(val) : 10000 nodes produced errors; first error: object 'df_simulate' not found .

Не могли бы вы подробнее рассказать о том, как достичь моей цели? Ниже приведен полный код.

 ### Generate dataframe
n_simu <- 1000
set.seed(1)
df_simulate <- data.frame(x_1 = rnorm(n_simu))
for (k in 2:10000) {
set.seed(k)
df_simulate[, paste0("x_", k)] <- rnorm(n_simu)
}
df_simulate[, "y"] <- runif(n_simu, 0, 0.5)
df_simulate[df_simulate$x_40 > 0 amp; df_simulate$x_99 > 0.8, "y"] <-
df_simulate[df_simulate$x_40 > 0 amp; df_simulate$x_99 > 0.8, "y"]   5.75
df_simulate[df_simulate$x_40 > 0 amp; df_simulate$x_99 <= 0.8 amp; df_simulate$x_30 > 0.5, "y"] <-
df_simulate[df_simulate$x_40 > 0 amp; df_simulate$x_99 <= 0.8 amp; df_simulate$x_30 > 0.5, "y"]   18.95
df_simulate[df_simulate$x_40 > 0 amp; df_simulate$x_99 <= 0.8 amp; df_simulate$x_30 <= 0.5, "y"] <-
df_simulate[df_simulate$x_40 > 0 amp; df_simulate$x_99 <= 0.8 amp; df_simulate$x_30 <= 0.5, "y"]   20.55
df_simulate[df_simulate$x_40 <= 0 amp; df_simulate$x_150 < 0.5, "y"] <-
df_simulate[df_simulate$x_40 <= 0 amp; df_simulate$x_150 < 0.5, "y"] - 5
df_simulate[df_simulate$x_40 <= 0 amp; df_simulate$x_150 >= 0.5, "y"] <-
df_simulate[df_simulate$x_40 <= 0 amp; df_simulate$x_150 >= 0.5, "y"] - 10

### Function to calculate the sum of variances
n_min <- 5
index <- n_min:(1000 - n_min)

sum_var <- function(m){
  df1 <- df_simulate[, m]
  df2 <- as.data.frame(sort(df1))
  for (i in index){
    df3 <- df2[1:i, 1]
    df4 <- df2[(i 1):1000, 1]
    df2[i, 2] <- sd(df3)   sd(df4)
  }
  position <- which.min(df2[, 2]) 
  return(df2[position, 1])
}

### Parallel Computing    
library("parallel")
cl <- makeCluster(6)
res_par <- clusterApply(cl, 1:10000, fun = sum_var)
  

Ответ №1:

При использовании makeCluster в Windows для каждого «кластера» используется новый процесс R. Там загружаются только базовые пакеты, и процессы не содержат переменных, которые вы определили в своей глобальной среде. Поэтому вам необходимо экспортировать все переменные, которые вы используете в своей функции, в кластеры. Для этого вы можете использовать clusterExport :

 library("parallel")
cl <- makeCluster(6)
clusterExport(cl, "df_simulate")
res_par <- clusterApply(cl, 1:10000, fun = sum_var)
  

Вот небольшой обзор и введение в различные методы распараллеливания в R.

Комментарии:

1. Спасибо за исправление. Это работает нормально. Меня беспокоит только то, что мой процессор, похоже, работает только с 1 логическим процессором. Я не уверен, действительно ли выполняются параллельные вычисления. imgur.com/a/DwNuxNV