Статьи

Mahout: распараллеливание создания деревьев решений

Пару месяцев назад я написал сообщение в  блоге, в  котором описывается использование   случайных лесов Mahout для  задачи распознавания цифр Kaggle,  и после того, как я увидел, сколько времени понадобилось для создания лесов с более чем 500 деревьями, я захотел узнать, можно ли это ускорить, распараллеливая обработать.

Смотря на  DecisionTree,  казалось, что можно создать множество небольших лесов, а затем объединить их вместе.

После безуспешных попыток достичь этого путем прямого использования  DecisionForest  я решил просто скопировать весь код из этого класса в  свою собственную версию,  что позволило мне добиться этого.

Код для построения леса в конечном итоге выглядит следующим образом:

List<Node> trees = new ArrayList<Node>();
 
MultiDecisionForest forest = MultiDecisionForest.load(new Configuration(), new Path("/path/to/mahout-tree"));
trees.addAll(forest.getTrees());
 
MultiDecisionForest forest = new MultiDecisionForest(trees);

Затем мы можем использовать  лес  для классификации значений в тестовом наборе данных, и, похоже, он работает достаточно хорошо

Я хотел , чтобы попытаться избежать ввода кода многопоточности в так что я использовал  GNU параллельно ,  которая доступна на Mac OS X с  варевом установить параллельно  и на Ubuntu путем  добавления следующего репозиторий  в /etc/apt/sources.list

deb http://ppa.launchpad.net/ieltonf/ppa/ubuntu oneiric main 
deb-src http://ppa.launchpad.net/ieltonf/ppa/ubuntu oneiric main

… с последующим  обновлением APT-GET  и  APT-получить установку параллельно .

Затем я написал скрипт для распараллеливания создания лесов:

parallelise-forests.sh

#!/bin/bash 
 
start=`date`
startTime=`date '+%s'`
numberOfRuns=$1
 
seq 1 ${numberOfRuns} | parallel -P 8 "./build-forest.sh"
 
end=`date`
endTime=`date '+%s'`
 
echo "Started: ${start}"
echo "Finished: ${end}"
echo "Took: " $(expr $endTime - $startTime)

build-forest.sh

#!/bin/bash
 
java -Xmx1024m -cp target/machinenursery-1.0.0-SNAPSHOT-standalone.jar main.java.MahoutPlaybox

Этого можно добиться, используя параметр параллелизма в  xargs,  но, к сожалению, я не смог добиться того же успеха с этой командой.

 До сегодняшнего дня я  не сталкивался  с  командой seq, но здесь она работает достаточно хорошо, позволяя нам указать, сколько раз мы хотим вызвать скрипт.

Вероятно, мне удалось добиться увеличения скорости примерно на 30% при запуске этого на моем Air. В экземпляре с высокой загрузкой процессора AWS наблюдалось большее увеличение, хотя по некоторым причинам некоторые задания, казалось, были убиты, и я не мог понять, почему.

К сожалению, даже с новым классификатором с огромным количеством деревьев я не увидел улучшения по сравнению со  случайным лесом Weka с использованием AdaBoost,  который я написал около месяца назад. У нас была точность 96,282% по сравнению с 96,529% с версией Weka.