DMLC和Petuum并行计算框架的搭建与使用

        DMLC的ps-lite以及Petuum的bosen两者都是目前比较流行的Parameter Server计算框架的实现,PS(Parameter Server)计算框架在并行机器学习系统中被广泛使用,之前并行机器学习领域比较流行的是基于MPI的All Reduce计算框架,AR(All Reduce)计算框架下,算法需要严格同步,节点之间需要等待; 而PS不需要严格同步,通过一些方法在一定的Error Bound条件下完成异步训练。
        由于是在实际中用到并行模型进行CTR预估训练,因此选择基于ps-lite的difacto以及基于bosen实现的mlr,前者是并行版本的factorization machine, 这个模型也是我在2014年参加Cretio在kaggle上举办的广告CTR预估竞赛时用过的,取得了17名的成绩,现在也被越来越多的公司在实际中使用;后者是并行版本的logistics regression模型,这个是最普遍被使用的模型。
     1 difacto
     编译dmlc-core,编译之前要将difacto_dmlc/dmlc-core/make/config.mk中关于使用HDFS的选项设置为:USE_HDFS = 1
      编译ps-lite, ps-lite依赖6个第三方库:gflags glog protobuf zmq lz4 cityhash。 由于所使用的机器不能连接外网,因此我先将这六个库先下载到ps-lite文件夹下,并且修改difacto_dmlc/ps-lite/make/deps.mk文件,避免在编译之前将已经下载好的第三方库给删除了。
      编译FM模型,进入文件夹:difacto_dmlc/src/difacto,执行命令:make即可,得到的可执行文件在build文件夹中。
    使用yarn提交job, run_yarn.sh内容为:
    ../../dmlc-core/tracker/dmlc_yarn.py –jobname dmlc_wxs –vcores 1 -mem 512 -n 2 -s 1 build/difacto.dmlc guide/dmlc.fm.conf –log_dir=log –sync_timeout 500 -alsologtostderr -v 10
     其中dmlc.fm.conf中内容为:
     train_data = “hdfs:///dmlc/data/agaricus.txt.train”
     val_data = “hdfs:///dmlc/data/agaricus.txt.test”
     model_out = “hdfs:///dmlc/data/out/”
     max_data_pass = 3
    在执行sh run_yarn.sh之前,记得将训练数据和测试数据放到dmlc.fm.conf中指定的路径下。
     过程中遇到过以下几个问题:

     (1)重新编译dmlc-core会遇到错误提示:
    In file included from src/io.cc:17:0: src/io/hdfs_filesys.h:10:18: 致命错误:hdfs.h:没有那个文件或目录 #include <hdfs.h>
  解决方法:设置HADOOP_HDFS_HOME的环境变量为:export HADOOP_HDFS_HOME=/home/worker/xiaoshu/hadoop/hadoop-2.7.1即可。
    2 mlr:
    第一次使用petuum是在2014年的6月份,当时在360搜索广告算法组实习做广告CTR预估。可以用三种方式使用petuum提供的算法:1,Local: 数据放在local机器上,单机训练;2,HDFS + ssh:将数据放到hdfs上,使用ssh提交job并行训练;3,HDFS + YARN,将数据放到hdfs上,使用yarn提交job并行训练。
     2.1  local模式:
        修改launch.py中train_file, test_file, output_file_prefix(输出路径),执行./launch.py
     2.2 HDFS+ssh模式:
        进入文件夹:petuum/bosen, 将defns.mk.template文件名修改为defns.mk,并将其中关于HDFS选项uncomment:  HAS_HDFS = -DHAS_HADOOP # Uncomment this line to enable hadoop。然后make 即可。
        随后进入:petuum/bosen/app/mlr文件夹,执行make命令编译mlr模型。
        进入petuum/bosen/app/mlr/script文件夹,修改launch.py中的几项配置:
   “train_file”: “hdfs://10.101.2.88:9000/user/worker/petuum/mlr/covtype.scale.train.small”
       “test_file”: “hdfs://10.101.2.88:9000/user/worker/petuum/mlr/covtype.scale.test.small”
        “output_file_prefix”: “hdfs://10.101.2.88:9000/user/worker/petuum/mlr/out”
     2.3 HDFS+YARN模式:
        需要用到launch_on_yarn.py和run_local.py这两个文件,只需要修改 run_local.py中的某些配置就可以:
   “train_file”: “hdfs://10.101.2.88:9000/user/worker/petuum/mlr/covtype.scale.train.small”
    “test_file”: “hdfs://10.101.2.88:9000/user/worker/petuum/mlr/covtype.scale.test.small”
    “output_file_prefix”: “hdfs://10.101.2.88:9000/user/worker/petuum/mlr/out”
        然后执行:./launch_on_yarn.py
       遇到的一些问题:
    (1)copy到新机器上直接运行./launch.py,会出现:
        /home/worker/xiaoshu/petuum_local/bosen/app/mlr/bin/mlr_main: error while loading shared libraries: libboost_thread.so.1.58.0: cannot open shared object file: No such file or directory
        重新make就行了。
    (2)执行./launch_on_local_with_hdfs.py
      重新在boson中make,成功;然后在mL中make,提示/usr/bin/ld: cannot find -lhdfs:
      进入/home/worker/xiaoshu/hadoop/hadoop-2.7.1/lib/native,里面有libhadoop.a libhadoop.so    libhadooputils.a  libhdfs.so libhadooppipes.a  libhadoop.so.1.0.0  libhdfs.a         libhdfs.so.0.0.0。
     执行:sudo cp * /usr/lib, 并执行sudo config生效
    (3)在执行./launch_on_local_with_hdfs.py,提示:Environment variable CLASSPATH not set! getJNIEnv: getGlobalJNIEnv failed F0810 04:20:17.638351 39658 hdfs.hpp:185] Cannot connect to HDFS. Host: 10.101.2.88, port: 9000
      执行:export CLASSPATH=`hadoop classpath –glob`:$CLASSPATH;然后即可成功执行./launch_on_local_with_hdfs.py

2 thoughts on “DMLC和Petuum并行计算框架的搭建与使用”

  1. 您好, 我是清华软件在读学生刘宗前, 关于DMLC在yarn上的部署, 有些问题想要请教一下博主, 不知道博主能否加一下微信, 方便咨询, 或者通过email沟通。
    微信号:qian2729

Leave a Reply

Your email address will not be published. Required fields are marked *