2016-03-11 3 views
0

Я пытаюсь обучить модель SVM большому набору данных (~ 110k точек тренировки). Это пример кода, в котором я использую пакет parallelSVM для параллелизации этапа обучения на подмножестве данных обучения на моем 4-ядерном компьютере Linux.makeCluster with parallelSVM in R занимает все память и своп

numcore = 4 
train.time = c() 
for(i in 1:5) 
{ 
    cl = makeCluster(4) 
    registerDoParallel(cores=numCore) 
    getDoParWorkers() 
    dummy = train_train[1:10000*i,] 
    begin = Sys.time() 
    model.svm = parallelSVM(as.factor(target) ~ .,data =dummy, 
     numberCores=detectCores(),probability = T) 
    end = Sys.time() - begin 
    train.time = c(train.time,end) 
    stopCluster(cl) 
    registerDoSEQ() 
} 

Идея этого фрагмента кода, чтобы оценить время, он будет принимать для обучения модели на весь набор данных, постепенно увеличивая размер фиктивной обучающего набора. После выполнения кода выше для 10 000 и 20 000 учебных образцов, является статистикой использования истории памяти и свопа из системного монитора. После четырех циклов цикла for и использования памяти и свопа около 95%, и я получаю следующее ошибка:

ошибка в summary.connection (подключение): неправильное подключение

Любые идеи о том, как справиться с этой проблемой? Есть ли способ освободить память, используемую кластером, после использования функции stopCluster()?

Примите во внимание тот факт, что я являюсь абсолютным новичком в этой области. Будет с благодарностью оценено краткое объяснение предлагаемых решений. Спасибо.

ответ

1

Ваша линия

registerDoParallel(cores=numCore) 

создает новый кластер с числом узлов, равным numCore (которые вы не указано иное). Этот кластер никогда не уничтожается, поэтому с каждой итерацией цикла вы запускаете новые новые процессы. Так как вы уже создаете кластер с cl = makeCluster(4), вы должны использовать

registerDoParallel(cl) 

вместо этого.

(И переместить makeCluster, registerDoParallel, stopCluster и registerDoSEQ звонки за пределы контура.)

+0

Я определил numCore переменная равна 4 где-то раньше. Спасибо, что заметили это. Я сделал соответствующее редактирование. – WitchKingofAngmar

+0

Я полностью удалил петлю и запустил код из 'dummy = train_train [1: 50000,]' to train.time = c (train.time, end) '. Потребление памяти составляло от 30% до 80%. Я делаю что-то неправильно? – WitchKingofAngmar

+0

Кроме того, я получаю около 20 предупреждающих сообщений в конце выполнения, которые говорят «закрытие неиспользуемого соединения 22» вплоть до «закрытия неиспользуемого соединения 3». Один из сверстников сказал мне, что эти сообщения следует ожидать и безвредны. Это правда? – WitchKingofAngmar

Смежные вопросы