AWS EMR下配置安装分布式xgboost库

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目前使用中遇到的问题

  1. demo/distributed-training下的默认算法参数配置文件mushroom.aws.conf将学习速率 eta 设为了最大值1.0, 实际训练的时候应该注释掉这行,使用默认值0.1, 否则结果一般会很差。
  2. cli版本的xgboost不支持early_stop_round参数,这使得调参过程无法自动化。
  3. 经过测试, cli版本的xgboost生成的*.model无法正确导入到对应的R包xgboost中,数次导入模型文件以后预测结果均完全错乱。
  4. 预测任务不支持分布式处理,只能单机进行, 而单机预测任务运行极慢,经测试20087维的样本按照8:2划分以后迭代1500次生成的模型文件使用 task=pred model_in=”my_train_model.model” 参数重新读入并进行预测需要约40分钟。

参考

  1. https://issues.apache.org/jira/browse/SPARK-9610
  2. https://xgboost.readthedocs.io/en/latest/parameter.html
  3. https://arxiv.org/abs/1603.02754
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值