Будущее пакета R: инициализация плана () не удалась - PullRequest
0 голосов
/ 29 ноября 2018

Попытка этого кода

library(future)
library(foreach)

ncores <- 3
cl <- parallel::makeCluster(3)
avail <- bigstatsr::FBM(ncores, 1, type = "integer", init = 1)
doFuture::registerDoFuture()

res <- vector("list", 5)
for (i in seq_along(res)) {

  while (sum(avail[]) == 0) {
    cat("Waiting..\n")
    Sys.sleep(0.5)
  }
  ind.avail <- which(avail[] == 1)
  cat("Available:", length(ind.avail), "\n")

  plan(cluster, workers = cl[ind.avail])
  foo <- foreach(i = 3:1) %dopar% {
    Sys.sleep(i)
  }

  print(one <- ind.avail[1])
  avail[one] <- 0; print(avail[])
  res[[i]] <- cluster(workers = cl[one], {
    Sys.sleep(5)
    avail[one] <- 1
    i
  })
}

sapply(res, resolved)
parallel::stopCluster(cl)

Ошибка, которую я получаю: Initialization of plan() failed, because the test future used for validation failed. The reason was: Unexpected result (of class ‘NULL’ != ‘FutureResult’) retrieved for ClusterFuture future (label = ‘<none>’, expression = ‘NA’).

Объяснение моего примера, пытающегося воспроизвести мою реальную проблему:

  • Iмногократно (здесь 5) по двум шагам
  • первый шаг легко распараллеливается с foreach
  • второй шаг распараллелить нелегко и зависит от первого шага

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

1 Ответ

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

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

Будущая структура уже обнаруживает это (отсюда и ошибка).Я обновил развивающую версию будущего , чтобы дать больше подсказок и свидетельств того, что происходит:

Error: Initialization of plan() failed, because the test future used for
  validation failed. The reason was: Unexpected result (of class ‘character’
  != ‘FutureResult’) retrieved for ClusterFuture future (label = 
  ‘future-plan-test’, expression = ‘NA’): future-grmall. This suggests that
  the communication with ClusterFuture worker (‘SOCKnode’ #1) is out of sync.

Я думаю, что вы можете обойти это, убедившись, что вы собралистоимость разрешенных фьючерсов перед повторным использованием их работников.Вызов plan(cluster, ...) подтверждает, что по крайней мере одно будущее может быть успешно разрешено.

...