Как использовать вложенное распараллеливание в R, когда вложенный цикл содержится в библиотеке? - PullRequest
0 голосов
/ 10 июня 2019

Я использую библиотеку карет в R и пытаюсь создать несколько моделей одновременно. Однако, поскольку каретка также способна к распараллеливанию, вещи не работают должным образом.

Я знаю, что правильный формат для вложенных циклов foreach в R следующий:

foreach(i=inputarray) %:%
    foreach(j=secondarray) %dopar% { 
        # functions here
    }

Однако в этой ситуации ближе всего я могу прийти примерно так:

foreach(i=inputarray) %:% {
    trainModel(use="modelName")
}

Возможно, неудивительно, что это работает не слишком хорошо, поскольку внешний итератор не передается должным образом, а код не запускается вообще. Использование% dopar% вместо этого приводит к работающему коду, но при каждом вызове trainModel используется только один поток, что видно из диспетчера задач при работе более длинных моделей.

Что касается системной информации, я использую Win 10 с R 3.6

.

1 Ответ

0 голосов
/ 12 июня 2019

В случае, если кому-то еще это понадобится, лучшим решением, которое я нашел, было создание второго кластера потоков внутри первого foreach() {} с использованием registerDoSNOW(makeCluster(x)) для назначения отдельного числа потоков для каждого цикла. Это дает дополнительное преимущество, позволяя вам предоставлять каждому циклу разное количество ресурсов для неравных размеров заданий, что полезно для моего приложения. Конечно, есть небольшой недостаток, заключающийся в том, что объявление внешнего кластера вызывает некоторые служебные потоки, которые мало что делают и мало влияют на производительность, но, тем не менее, в целом достойное решение.

cl <- makeCluster(n)
registerDoParallel(cl)

foreach(i=inputarray) %dopar% {
    library(doSNOW)
    registerDoSNOW(makeCluster(x))
    trainModel(...)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...