Как правильно использовать план кластера в пакете R future (furrr) - PullRequest
1 голос
/ 08 января 2020

В настоящее время я использую furrr для создания более организованного исполнения моей модели. Я использую data.frame для упорядоченной передачи параметров функции, а затем использую furrr::future_map() для сопоставления функции по всем параметрам. Функция работает безупречно при использовании последовательных и многоядерных фьючерсов на моем локальном компьютере (OSX).

Теперь я хочу протестировать мой код, создав собственный кластер из AWS экземпляров (как показано здесь ).

Я создал функцию, используя код связанной статьи:

make_cluster_ec2  <- function(public_ip){
  ssh_private_key_file  <-  Sys.getenv('PEM_PATH')
  github_pac  <-  Sys.getenv('PAC')

  cl_multi <- future::makeClusterPSOCK(
  workers = public_ip,
  user = "ubuntu",
  rshopts = c(
    "-o", "StrictHostKeyChecking=no",
    "-o", "IdentitiesOnly=yes",
    "-i", ssh_private_key_file
  ),
  rscript_args = c(
    "-e", shQuote("local({p <- Sys.getenv('R_LIBS_USER'); dir.create(p, recursive = TRUE, showWarnings = FALSE); .libPaths(p)})"),
    "-e", shQuote("install.packages('devtools')"),
    "-e", shQuote(glue::glue("devtools::install_github('user/repo', auth_token = '{github_pac}')"))
  ),
  dryrun = FALSE)

  return(cl_multi)

}

Затем я создаю объект кластера и проверяю, подключен ли он к нужному экземпляру

public_ids <- c('public_ip_1', 'public_ip_2')
cls <- make_cluster_ec2(public_ids)
f <- future(Sys.info())

И когда я печатаю f, я получаю спецификации одного из моих удаленных экземпляров, которые указывают, что сокет правильно подключен:

> value(f)
                                      sysname
                                      "Linux"
                                      release
                            "4.15.0-1037-aws"
                                      version
"#39-Ubuntu SMP Tue Apr 16 08:09:09 UTC 2019"
                                     nodename
                           "ip-xxx-xx-xx-xxx"
                                      machine
                                     "x86_64"
                                        login
                                     "ubuntu"
                                         user
                                     "ubuntu"
                               effective_user
                                     "ubuntu"

Но когда я запускаю свой код, используя план кластера:

plan(list(tweak(cluster, workers = cls), multisession))
  parameter_df %>%
  mutate(model_traj =  furrr::future_pmap(list('lat' = latitude,
                               'lon' = longitude,
                               'height' = stack_height,
                               'name_source' = facility_name,
                               'id_source' = facility_id,
                               'duration' = duration,
                               'days' = seq_dates,
                               'daily_hours' = daily_hours,
                               'direction' = 'forward',
                               'met_type' = 'reanalysis',
                               'met_dir' = here::here('met'),
                               'exec_dir' = here::here("Hysplit4/exec"),
                               'cred'= list(creds)),
                           dirtywind::hysplit_trajectory,
                           .progress = TRUE)
  )

Я получаю следующую ошибку:

Error in file(temp_file, "a") : cannot open the connection
In addition: Warning message:
In file(temp_file, "a") :
  cannot open file '/var/folders/rc/rbmg32js2qlf4d7cd4ts6x6h0000gn/T//RtmpPvdbV3/filecf23390c093.txt': No such file or directory

Я не могу понять, что происходит под капотом, и я не могу traceback() ошибка либо с моих удаленных машин. Я проверил связь с примерами в статье, и все, кажется, работает правильно. Мне интересно, почему пытается создать tempdir во время выполнения. Что мне здесь не хватает?

(Это также проблема в репо furrr)

1 Ответ

3 голосов
/ 09 января 2020

Отключить индикатор выполнения, т. Е. Не указывать .progress = TRUE.

Это потому, что .progress = TRUE предполагает, что ваши R-работники могут записать во временный файл, созданный основным процессом R . Обычно это возможно только при параллельном включении на одном компьютере.

Меньший пример этой ошибки:

library(future)
## Set up a cluster with one worker running on another machine
cl <- makeClusterPSOCK(workers = "node2")
plan(cluster, workers = cl)

y <- furrr::future_map(1:2, identity, .progress = FALSE)
str(y)
## List of 2
##  $ : int 1
##  $ : int 2

y <- furrr::future_map(1:2, identity, .progress = TRUE)
## Error in file(temp_file, "a") : cannot open the connection
## In addition: Warning message:
## In file(temp_file, "a") :
##   cannot open file '/tmp/henrik/Rtmp1HkyJ8/file4c4b864a028ac.txt': No such file or directory
...