Параллельные вычисления при использовании CORElearn в R - PullRequest
0 голосов
/ 19 сентября 2018

Я использую ReliefF для выбора функций (используя пакет «CORElearn»).Это работало очень хорошо раньше.Но позже я хочу ускорить мой код.Поскольку в моем коде есть начальная загрузка (каждый цикл выполняет одно и то же, включая ReliefF), поэтому я использую пакет «параллельный» для параллельных вычислений.Но я понял, что каждый раз, когда речь заходит о части ReliefF, код просто застревает там.

Соответствующие коды следующие:

num.round <- 10  # number of rounds for bootstrap
rounds.btsp <- seq(1, num.round)  # sequence of numbers for bootstrap, used for parallel computing

boot.strap <- function(round.btsp) {

    ## some codes using other feature selection methods

    print('Finish feature selection using other methods')  # I can get this output

    # use ReliefF to rank the features
    data.ref <- data.frame(t(x.train.resample), y.train.resample, check.names = F)  # add the param to avoid changing '-' to '.'
    print('Start using attrEval')  # I’ll get this output, but then I'll get stuck here
    estReliefF <- attrEval('y.train.resample', data.ref, estimator = 'ReliefFexpRank', ReliefIterations = 30)
    names(estReliefF) <- fea.name  # This command needs to be added because it's very annoying that 'attrEval' will change the '-' in the names to '.'
    print('Start using estReliefF')  # I’ll never get here
    fea.rank.ref <- estReliefF[order(abs(estReliefF), decreasing = T)]
    fea.rank.ref <- data.frame(importance = fea.rank.ref)
    fea.rank.name.ref <- rownames(fea.rank.ref)  # the ranked feature list for this round

    return(fea.rank.name.ref)
}

results.btsp <- mclapply(rounds.btsp, boot.strap, mc.cores = num.round)

То, что я сейчас думаюявляется то, что функция 'attrEval' будет использовать несколько ядер для параллельных вычислений (я читал это в документе: https://cran.r -project.org / web / packages / CORElearn / CORElearn.pdf ).Тогда будет какой-то конфликт с той параллелью, которую я использую.Когда я изменяю num.round на 1, тогда нет проблем с запуском кода (но даже если я установлю его на 2, он не будет работать).

Сервер, который я использую, имеет 80 ядер.

Есть ли способ решить эту проблему?Я думаю, что отключение параллельных вычислений для функции 'attrEval' может быть решением?Хотя я не знаю, как это сделать ~~~

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Получил решение от участника пакета Marko: отключите многопоточность в CORElearn с помощью параметра maxThreads = 1 в 'attrEval'

0 голосов
/ 19 сентября 2018

Наличие нескольких уровней параллелизма может быть сложным.К сожалению, пакет CORElearn не позволяет напрямую манипулировать количеством используемых потоков.Поскольку он использует OpenMP для параллельного выполнения, вы можете попытаться установить переменную окружения OMP_NUM_THREADS соответствующим образом, например,

Sys.setenv(OMP_NUM_THREADS = 8)
num.round <- 10

Таким образом, должно быть 10 групп по 8 ядер, каждая из которых обрабатывает один раунд начальной загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...