запланированные ядра не дали результатов, все значения заданий будут затронуты в parallel::mclapply() в R 4.0.1

Я использую parallel::mclapply() с R 4.0.1 и получаю следующее предупреждение: запланированные ядра... не дали результатов, это повлияет на все значения заданий.

Вот результат моего исследования: просмотрев исходный код функции, я понял, что это происходит, когда вектор dr не весь ИСТИНА. Это означает, что для некоторых ядер второе условие внутри цикла for ниже (is.raw(a)) никогда не выполняется. a — это значение, возвращаемое readChild(), что, если возвращены необработанные данные хотя бы один раз, условие будет проверено хотя бы один раз. Итак, я думаю, что readChild() возвращает NULL.

readChild и readChildren возвращают необработанный вектор с атрибутом pid, если данные были доступны, целочисленный вектор длины один с идентификатором процесса, если дочерний процесс завершился, или NULL, если дочерний процесс больше не существует (для readChildren дочерние элементы вообще отсутствуют).

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

    while (!all(fin)) {
        s <- selectChildren(ac[!fin], -1)
        if (is.null(s)) break # no children -> no hope we get anything (should not happen)
        if (is.integer(s))
            for (ch in s) {
                a <- readChild(ch)
                if (is.integer(a)) {
                    core <- which(cp == a)
                    fin[core] <- TRUE
                } else if (is.raw(a)) {
                    core <- which(cp == attr(a, "pid"))
                    job.res[[core]] <- ijr <- unserialize(a)
                    if (inherits(ijr, "try-error"))
                        has.errors <- c(has.errors, core)
                    dr[core] <- TRUE
                } else if (is.null(a)) {
                    # the child no longer exists (should not happen)
                    core <- which(cp == ch)
                    fin[core] <- TRUE
                }
            }
    }

person lulions    schedule 09.07.2020    source источник
comment
Добро пожаловать в СО! Можно ли включить минимальный воспроизводимый пример? См. инструкции на stackoverflow.com/help/minimal-reproducible-example.   -  person Lstat    schedule 09.07.2020
comment
Спасибо, я пытаюсь воспроизвести предупреждающее сообщение. На данный момент у меня получилось только в AWS Sagemaker с инстансом ml.m5.12xlarge и очень большим объемом данных.   -  person lulions    schedule 09.07.2020


Ответы (1)


Это сообщение об ошибке может появиться, когда дочерний процесс умирает/сбой, например.

> y <- parallel::mclapply(1:2, FUN = function(x) if (x == 1) quit("no") else x)
Warning message:
In parallel::mclapply(1:2, FUN = function(x) if (x == 1) quit("no") else x) :
  scheduled core 1 did not deliver a result, all values of the job will be affected

> str(y)
List of 2
 $ : NULL
 $ : int 2

То, что дочерний процесс полностью умирает, конечно, нехорошо. Это может произойти по нескольким причинам. Я думаю, что вы распараллеливаете что-то, что не должно быть распараллелено. Известно, что разветвленная обработка (=mclapply()) нестабильна с многопоточным кодом, среди прочего.

Чего стоит, если вместо этого вы используете структуру future (отказ от ответственности: Я автор), вы получите немного более информативное сообщение об ошибке, например.

> library(future.apply)
> plan(multicore)

> y <- future_lapply(1:2, FUN = function(x) if (x == 1) quit("no") else x)
Error: Failed to retrieve the result of MulticoreFuture (future_lapply-1) from
the forked worker (on localhost; PID 19959). Post-mortem diagnostic: No process
exists with this PID, i.e. the forked localhost worker is no longer alive.
person HenrikB    schedule 09.07.2020
comment
Есть ли способ получить обратную связь для будущего или mclapply? Ни в одном из сообщений мне, пользователю, не сообщается, где код взломан. - person James Dalgleish; 13.04.2021