AWS EMR下配置安装分布式xgboost库
为什么需要xgboost
截止目前, 最新的Spark MLlib 2.0.2仍然缺少处理不平衡样本集的能力,速度、分类性能也十分感人. xgboost无论在速度和AUC等分类性能指标上都能秒掉目前最新的Spark MLlib。 另外, xgboost的扩展性也十分好, 在作者的论文3中, 仅使用了4台m3.2xlarge EC2实例就成功运行了17亿/67维的Criteo数据, 是唯一能在有限资源下达成该目标的主流开源机器学习算法库。
本文的配置安装过程参考了这篇csdn博客,补全了编译libhdfs.so的部分,根据安装环境的不同提供了AWS EMR jvm环境变量的设置和xgboost实际运行中可能遇到问题的说明
环境
最新AWS EMR 5.2.0, 其中对应的hadoop组件均为最新, 具体组件版本可以查看这里, 节点类型EC2 m3.xlarge 20台, Spark 2.0.2已配置安装, 以下组件均为EMR 自带
$uname -a
Linux ip-10-27-116-126 4.4.23-31.54.amzn1.x86_64 #1 SMP Tue Oct 18 22:02:09 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$uname -r
4.4.23-31.54.amzn1.x86_64
$cmake version 2.8.12
cmake version 2.8.12
$gcc -version
gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
$java -version
java version "1.7.0_121"
OpenJDK Runtime Environment (amzn-2.6.8.1.69.amzn1-x86_64 u121-b00)
OpenJDK 64-Bit Server VM (build 24.121-b00, mixed mode)
编译libhdfs.so
这一步是整个安装配置过程的关键, 但是官方的安装配置指南却直接忽略了这一步。
wget https://github.com/cloudera/hadoop-common/archive/cdh5-2.6.0_5.5.0.zip # git clone https://github.com/cloudera/hadoop-common.git
unzip hadoop-common-cdh5-2.6.0_5.5.0.zip
cd hadoop-common-cdh5-2.6.0_5.5.0/hadoop-hdfs-project/hadoop-hdfs/src
cmake -DJAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk.x86_64 -DGENERATED_JAVAH=/usr/lib/jvm/java-1.7.0-openjdk.x86_64 -DJAVA_JVM_LIBRARY=/usr/lib/jvm/java-1.7.0-openjdk.x86_64/jre/lib/amd64/server/libjvm.so -DJAVA_INCLUDE_PATH=/usr/lib/jvm/java-1.7.0-openjdk.x86_64/include -DJAVA_INCLUDE_PATH2=/usr/lib/jvm/java-1.7.0-openjdk.x86_64/include/linux
make -j4 -DJAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk.x86_64 -DJAVA_JVM_LIBRARY=/usr/lib/jvm/java-1.7.0-openjdk.x86_64/jre/lib/amd64/server/libjvm.so -DJAVA_INCLUDE_PATH=/usr/lib/jvm/java-1.7.0-openjdk.x86_64/include -DJAVA_INCLUDE_PATH2=/usr/lib/jvm/java-1.7.0-openjdk.x86_64/include/linux
cp -r ./target/usr/local/lib /usr/lib/hadoop/lib/native
编译xgboost with s3,hdfs support
配置hdoop环境变量和S3访问密钥
export HADOOP_HOME=/usr/lib/hadoop
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=/usr/lib/hadoop-hdfs
export HADOOP_MAPRED_HOME=/usr/lib/hadoop-yarn
export HADOOP_YARN_HOME=$HADOOP_MAPRED_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
# AWS S3 access
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxx # AWS提供的密钥对
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXX #
编译xgboost xgboost with s3,hdfs support
git clone --recursive https://github.com/dmlc/xgboost
cd xgboost
cp make/config.mk config.mk
echo -e "USE_S3=1\nUSE_HDFS=1" >> config.mk
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk.x86_64
export JAVA_JVM_LIBRARY=/usr/lib/jvm/java-1.7.0-openjdk.x86_64/jre/lib/amd64/server/libjvm.so
export JAVA_INCLUDE_PATH=/usr/lib/jvm/java-1.7.0-openjdk.x86_64/include
export JAVA_INCLUDE_PATH2=/usr/lib/jvm/java-1.7.0-openjdk.x86_64/include/linux
make -j4
运行测试实例
cd xgboost/demo/dis
cd xgboost/demo/distributed-training
../../dmlc-core/tracker/dmlc-submit --cluster=yarn --num-workers=2 --worker-cores=2\
../../xgboost mushroom.aws.conf nthread=2\
data=hdfs://10.27.116.126:8020/xgb-demo/train\
eval[test]=hdfs://10.27.116.126:8020/xgb-demo/test\
model_dir=hdfs://10.27.116.126:8020/xgb-demo/model
xgboost目前使用中遇到的问题
- demo/distributed-training下的默认算法参数配置文件mushroom.aws.conf将学习速率 eta 设为了最大值1.0, 实际训练的时候应该注释掉这行,使用默认值0.1, 否则结果一般会很差。
- cli版本的xgboost不支持early_stop_round参数,这使得调参过程无法自动化。
- 经过测试, cli版本的xgboost生成的*.model无法正确导入到对应的R包xgboost中,数次导入模型文件以后预测结果均完全错乱。
- 预测任务不支持分布式处理,只能单机进行, 而单机预测任务运行极慢,经测试200万87维的样本按照8:2划分以后迭代1500次生成的模型文件使用 task=pred model_in=”my_train_model.model” 参数重新读入并进行预测需要约40分钟。