En la anterior entrada vimos cómo instalar la librería XGBOOST sobre CentOS con soporte HDFS. Bien, en ésta trataremos de ver su ejecución a través de algún ejemplo, eso sí, sin entrar a valorar el resultado o si se puede mejorar el modelo, variables, etc, simplemente se trata de demostrar la funcionalidad de poder ejecutar la librería XGBOOST en modo distribuido.
DMLC-YARN.JAR
Lo primero que deberemos hacer es crear el paquete dmlc-yarn.jar necesario para la ejecución de XGBOOST en modo distribuido, YARN.
Lo primero que deberemos hacer es crear el paquete dmlc-yarn.jar necesario para la ejecución de XGBOOST en modo distribuido, YARN.
cd /usr/local/xgboost/dmlc-core/tracker/yarn/
./build.sh // NO preocuparse por los warnings.
ls -al dmlc-yarn.jar // Debemos comprobar que se crea el fichero dmlc-yarn.jar
rw-r--r-- 1 root root 21292 dic 16 13:39 dmlc-yarn.jar
./build.sh // NO preocuparse por los warnings.
ls -al dmlc-yarn.jar // Debemos comprobar que se crea el fichero dmlc-yarn.jar
rw-r--r-- 1 root root 21292 dic 16 13:39 dmlc-yarn.jar
Ejemplo
Ejemplo de cómo ejecutar XGBOOST en modo YARN con los conjuntos de datos almacenados previamente en HDFS. Además, el modelo resultante también será salvado en el HDFS.
Nota: El ejemplo mostrado a continuación fue ejecutado bajo el usuario root, totalmente desaconsejable su uso, pero así que cada uno lo adapte a su entorno ;)
1) Creo la estructura de directorios necesarios para el ejemplo en el HDFS:
hadoop fs -mkdir /user/root/xgboost
hadoop fs -mkdir /user/root/xgboost/data
hadoop fs -mkdir /user/root/xgboost/data/train
hadoop fs -mkdir /user/root/xgboost/data/test
hadoop fs -mkdir /user/root/xgboost/model
hadoop fs -chmod 777 /user/root/xgboost/model
2) Cargo los siguientes datasets de ejemplo que vienen, por defecto, con XGBOOST.
hadoop fs -put /usr/local/xgboost/demo/data/agaricus.txt.train /user/root/xgboost/data/train/
hadoop fs -put /usr/local/xgboost/demo/data/agaricus.txt.test /user/root/xgboost/data/test/
3) Creo la configuración necesaria para llevar a cabo el ejemplo.
export LD_LIBRARY_PATH=/usr/hdp/2.4.2.0-258/usr/lib/
vim /usr/local/xgboost/demo/distributed-training/hdfs.conf
# General Parameters, see comment for each definition
# choose the booster, can be gbtree or gblinear
booster = gbtree
# choose logistic regression loss function for binary classification
objective = binary:logistic
# Tree Booster Parameters
# step size shrinkage
eta = 1.0
# minimum loss reduction required to make a further partition
gamma = 1.0
# minimum sum of instance weight(hessian) needed in a child
min_child_weight = 1
# maximum depth of a tree
max_depth = 3
# Task Parameters
# the number of round to do boosting
num_round = 2
# 0 means do not save any model except the final round model
save_period = 0
# The path of training data
data = "hdfs://namenode01.domain.com/user/root/xgboost/data/train"
# The path of validation data, used to monitor training process
eval[test] = "hdfs://namenode01.domain.com/root/xgboost/data/test"
model_dir = "hdfs://namenode01.domain.com/user/root/xgboost/model"
# evaluate on training data as well each round
eval_train = 1
¡¡¡Importante!!! Incluir en el path del HDFS el FQDN de nuestro NameNode principal o bien el del grupo si hemos configurado la alta disponibilidad.
4) Ahora ya sí, se puede proceder a ejecutar el ejemplo:
/usr/local/xgboost/dmlc-core/tracker/dmlc-submit --cluster yarn --num-workers 2 /usr/local/xgboost/xgboost /usr/local/xgboost/demo/distributed-training/hdfs.conf
2016-12-16 13:43:19,708 INFO start listen on 192.168.4.245:9091
16/12/16 13:43:21 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
16/12/16 13:43:22 WARN shortcircuit.DomainSocketFactory: The short-circuit local reads feature cannot be used because libhadoop cannot be loaded.
16/12/16 13:43:23 INFO impl.TimelineClientImpl: Timeline service address: http://namenode01.domain.com:8188/ws/v1/timeline/
16/12/16 13:43:23 INFO client.RMProxy: Connecting to ResourceManager at namenode01.domain.com/192.168.4.245:8050
16/12/16 13:43:24 INFO dmlc.Client: jobname=DMLC[nworker=2]:xgboost,username=root
16/12/16 13:43:24 INFO dmlc.Client: Submitting application application_1481716095353_0075
16/12/16 13:43:24 INFO impl.YarnClientImpl: Submitted application application_1481716095353_0075
2016-12-16 13:43:29,410 INFO @tracker All of 2 nodes getting started
2016-12-16 13:43:33,723 INFO [13:43:33] [0] test-error:0.016139 train-error:0.014433
2016-12-16 13:43:33,904 INFO [13:43:33] [1] test-error:0.000000 train-error:0.001228
2016-12-16 13:43:34,253 INFO @tracker All nodes finishes job
2016-12-16 13:43:34,253 INFO @tracker 4.84310793877 secs between node start and job finish
Application application_1481716095353_0075 finished with state FINISHED at 1481888615119
5) Comprobar la existencia del modelo recién creado. El nombre del fichero, por defecto, sigue el patrón <num_rounds>.model siendo <num_rounds> el valor establecido para dicha variable en el fichero de configuracion.
hadoop fs -ls /user/root/xgboost/model
Found 1 items
-rw-r--r-- 2 yarn root 1501 2016-12-16 13:43 /user/root/xgboost/model/0002.model
El modelo puede ser cargado posteriormente en R, Python o Julia.
El modelo puede ser cargado posteriormente en R, Python o Julia.