`

dmlc分布式线性模型编译笔记

阅读更多
1、使用第三方修改后的wormhole工程


原始工程wormhole:https://github.com/dmlc/wormhole
文档:https://media.readthedocs.org/pdf/wormhole/latest/wormhole.pdf
在线文档:https://wormhole.readthedocs.io/en/latest/


下面的这个虽然比较新,但是。。。根本没开发完成!!!
difacto: https://github.com/dmlc/difacto

第三方修改过的:
https://github.com/CNevd/Difacto_DMLC
因为tracker原因,该项目在我自己搭建的hadoop(单机)上没问题,但是公司平台上运行不起来
tracker最终使用的是dmlc core的tracker(直接复制tracker文件夹即可,但是参数名称有变化);

最终使用的修改过tracker后的工程:https://github.com/cherishlc/Difacto_DMLC

2、找不到glog库的问题
注意:也可使用编译选项make USE_GLOG=0 从而不依赖glog
https://github.com/google/glog 下载一下,编译
注意:如果./autogen.sh && ./configure && make && make install命令的最后一步安装因权限问题无法解决,可以通过设置LD_LIBRARY_PATH, LIBRARY_PATH 等环境变量解决:
export GLOG_HOME=/home/user/glog

# g++ 引用的头文件路径
export EXTRA_INCLUDES=$GLOG_HOME/src
# g++ 引用的lib文件路径
export LIBRARY_PATH=$LIBRARY_PATH:$GLOG_HOME/.libs
# 运行程序时查找的动态链接库路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GLOG_HOME/.libs



3、编译
以下编译选项打开了HDFS开关,并且不依赖glog
make USE_HDFS=1 USE_GLOG=0 -j8

export MAKEDMLC="make USE_HDFS=1 USE_GLOG=0 -j8"
cd dmlc-core; $MAKEDMLC; cd -
cd ps-lite; $MAKEDMLC; cd -
cd src/linear; $MAKEDMLC


4、yarn任务提交
调用链:
TODO


/Difacto_DMLC/dmlc-core/yarn/src/org/apache/hadoop/yarn/dmlc/Client.java

5、logistic regression代码阅读

#训练数据的内部存储格式; 以稀疏矩阵形式存储
src/solver/minibatch_solver.h:  using Minibatch = dmlc::RowBlock<FeaID>;
dmlc-core/include/dmlc/data.h:  template<typename IndexType> struct RowBlock {

#index 比如 第0个特征的 FeaID为0
src/linear/async_sgd.h:using FeaID = ps::Key;



#真正执行训练的地方
src/linear/async_sgd.h:  virtual void ProcessMinibatch(const Minibatch& mb, const Workload& wl) {
线性模型的计算是在ProcessMinibatch函数中的loss->Init函数:
src/linear/loss.h: loss->Init(data->GetBlock(), *val, nt_);
void Init(const RowBlock<unsigned>& data,
    const std::vector<V>& w, int nt) {
data_ = data;
Xw_.resize(data_.size);
SpMV::Times(data_, w, &Xw_, nt_); // linear model here
nt_ = nt;
init_ = true;
}

线性部分(不包括sigmoid)的计算是在SpMV::Times函数,其实就是个 乘法+累加的运算
其定义在:
src/base/spmv.h
关键代码: 
if (D.value) {//D为dmlc::RowBlock<unsigned>;  D.value不为空,说明在libsvm 格式的训练文件中, 0 1:0.5 2:1中权重有不为1的情况; 这时,线性模型就会考虑这些权重!!!
  for (size_t j = D.offset[i]; j < D.offset[i+1]; ++j)
    y_i += x[D.index[j]] * D.value[j];
} else {
  for (size_t j = D.offset[i]; j < D.offset[i+1]; ++j)
    y_i += x[D.index[j]];
}



6、关于logistic loss
从下面的代码中可以看到,输入中的label只区分是否大于0,大于0则认为是正样本,否则为负样本
至于logistic regression中标签取0\1和取1,-1的区别(实际上没有区别,只是loss的形式不同,但loss的值是完全一样的),
可以参考博客:https://www.cnblogs.com/bentuwuying/p/6616680.html
定义在src/linear/loss.h: template <typename V> class LogitLoss
最终调用的是:src/base/binary_class_evaluation.h:  V LogitObjv()
  V LogitObjv() {
    V objv = 0;
#pragma omp parallel for reduction(+:objv) num_threads(nt_)
    for (size_t i = 0; i < size_; ++i) {
      V y = label_[i] > 0 ? 1 : -1;
      V score = y * predict_[i];
      if (score < -30)
        objv += -score;
      else if (score <= 30)
        objv += log( 1 + exp( - score ));
    }
    return objv;
  }


7、数据读取
0、在工程目录搜索libsvm文件名,可以发现libsvm格式的解析类位于dmlc-core/src/data/libsvm_parser.h中,解析方法为ParseBlock()

但是解析函数是被谁调用的呢?博主按如下方式进行的查找:
1、上文提到,真正执行训练的是src/linear/async_sgd.h中的AsgdWorker类,训练函数为ProcessMinibatch();在其中没有找到数据读取的相关函数
2、AsgdWorker类的父类为solver::MinibatchWorker, 位于src/solver/minibatch_solver.h中
3、ProcessMinibatch()虚函数在solver::MinibatchWorker的Process()方法中被调用,这里可以看到dmlc::data::MinibatchIter<FeaID> reader; 这个reader就是读取数据的类了,该类位于src/base/minibatch_iter.h中。
4、reader传递给ProcessMinibatch()函数的数据为reader.Value()
5、reader.Value()返回reader的成员变量out_blk_;  out_blk_在成员函数Next()的末尾被设为out_blk_ = mb_.GetBlock();
6、继续追溯,mb_在成员函数Next()中通过Push()方法被设置,在Push方法中,mb_通过in_blk_设置;而Next方法中有一句in_blk_ = parser_->Value();

至此,数据流分析完毕
  reader(比如LibSVMParser)
  => solver::MinibatchWorker的 in_blk_ => mb_ => out_blk_
  => AsgdWorker::ProcessMinibatch() mb 通过localize=> data
  => loss->Init(data->GetBlock(), *val, nt_); 声明loss,并将data赋值到其中

因而,如果想修改libsvm数据的解析方式及使用方式,需要修改的地方有:
  数据读取:LibSVMParser类中的ParseBlock()函数
  将读取的数据分片: MinibatchIter类中的Push函数
  数据本地化:Localizer类中的RemapIndex()函数
  计算梯度时使用样本权重:LogitLoss中的CalcGrad函数
 
分享到:
评论

相关推荐

    DMLC深盟分布式深度机器学习开源平台解析1

    摘要:本文由DMLC分布式深度机器学习开源项目(中文名深盟)开发者联合撰写,介绍DMLC已有的xgboost、cxxnet、Minerva、ParameterS

    DMLC深盟分布式深度机器学习开源平台解析

    算法速度、系统性能以及易用性的瓶颈,制约着目前机器学习的普及应用,DMLC分布式深度机器学习开源项目(中文名深盟)的诞生,正是要降低分布式机器学习的门槛。本文由深盟项目开发者联合撰写,将深入介绍深盟项目...

    dmlc-core:用于构建可扩展和便携式分布式机器学习的通用积木库

    DMLC-Core是支持所有DMLC项目的骨干库,为构建高效且可扩展的分布式机器学习库提供了基础。 开发者频道 什么是新的 内容 已知的问题 RecordIO格式不能跨不同的处理器字节序移植。 因此,不可能将RecordIO文件保存...

    Difacto_DMLC-master.zip

    分布式机器学习的代码内容

    王超&陈帅华 xgboost导读和实战

    xgboost是C++开源分布式机器学习系统DMLC的Boosting模型,单机采用多线程来加速树的构建,并依赖DMLC的另一个部件rabbit来进行分布式计算。xgboost提供了 Python和R语言接口。本文档由参与贡献的王超和陈帅华撰写。 ...

    xgboost导读和实战_王超&陈帅华

    xgboost是C++开源分布式机器学习系统DMLC的Boosting模型,单机采用多线程来加速树的构建,并依赖DMLC的另一个部件rabbit来进行分布式计算。xgboost提供了 Python和R语言接口。本文档由参与贡献的王超和陈帅华撰写。

    xgboost 0.4版本编译后32位&64位

    xgboost 0.4版本编译后32位&64位,按下面链接里的说法,0.47版本不支持Windows,所以对0.4版本用vs2015社区版进行32位和64位编译,分别用于32位操作系统/32位python和64位操作系统/64位python,xgboost最新版本0.6,...

    mxnet-model-gallery:DMLC项目的预训练模型

    模型库 所有模型都托管在并在CC0下获得许可。 该模型是ILSVRC2012数据集上的预训练模型。 该模型在ILSVRC2012-Validation Set上能够达到54.5%的Top-1准确性和78.3%的Top-5准确性。 该模型是ILSVRC2012数据集上的...

    mkmatlab代码-dmlc-cxxne:dmlc-cxxne

    上运行,几乎呈线性加速 该库由分布式参数服务器分布式支持 无需 GPU 编程即可轻松扩展 cxxnet 建立在 开发人员可以编写 numpy 样式的模板表达式来扩展库一次 mshadow 将为用户生成高性能的 CUDA 和 CPU 代码 它带来...

    xgboost64位免编译文件

    Windows环境下xgboost64位免编译文件。

    mkmatlab代码-CXXNET:DMLC/CXXNET的副本供学习

    包含最先进的深度学习模型的简明实现 该项目保持最小的依赖,使其可移植且易于构建 超越单一 GPU 和单一机器 该库可在多个 GPU 上运行,几乎呈线性加速 该库由分布式参数服务器分布式支持 无需 GPU 编程即可轻松扩展...

    xgboost-gpu 所需编译文件

    linux系统,ubuntu18.04 环境下,python3 编译xgboost-gpu所需文件:libxgboost.so 具体操作: git clone --recursive https://github.com/dmlc/xgboost cd xgboost mkdir build cd build cmake .. -DUSE_CUDA=ON --...

    MXNet设计笔记之:深度学习的编程模式比较

    【编者按】继xgboost,cxxnet,minerva之后,DMLC在9月29日发布了新的Project:dmlc/MXNet,MXNet是cxxnet的进化,在设计上经过成熟的思考,文档也很清楚。尤为难得的是,MXNet开发团队把设计笔记也做了分享。笔记的...

    XGBoost.jl:XGBoostJulia套餐

    该软件包包括高效的线性模型求解器和树学习算法。 该库使用OpenMP进行了并行化,它可以比某些现有的梯度增强软件包快10倍以上。 它支持各种目标函数,包括回归,分类和排名。 该软件包还具有可扩展性,因此用户也...

    web-data:存储所有Web数据的仓库,包括dmlc项目中文档的图像

    DMLC Web数据 该仓库用于托管所有Web数据,包括dmlc项目中文档的图像。

    HDFS客户端操作

    1.安装对应的编译后的hadoop包到非中文路径下 1.1 这里简单阐述一下在搭建环境时为什么hadoop需要重新编译源码 答: hadoop是用java写的,但是某些操作不适合用java实现,所以用的是c/c++的动态库(本地库),所以...

    noname

    环境变量必须设置变量才能启动DMLC_NUM_WORKER :工人人数DMLC_NUM_SERVER :服务器数DMLC_ROLE :当前节点的角色,可以是worker , server或scheduler DMLC_PS_ROOT_URI :调度程序节点的ip或主机名DMLC_PS_ROOT_...

    xgboost-mpi-example

    使用MPI和SLURM的XGBoost分布式执行示例要求奴隶MPI Python XGBoost python模块安装git clone https://github.com/dmlc/dmlc-core.gitcd dmlc-coremake跑步bash deploy.sh

    xgboost windows依赖jar包 用于 spark等计算

    &lt;groupId&gt;ml.dmlc &lt;artifactId&gt;xgboost4j-spark &lt;!--windows使用0.81-SNAPSHOT版本--&gt; &lt;!--version&gt;0.80; &lt;version&gt;0.81-SNAPSHOT 包含 import ml.dmlc.xgboost4j.scala.spark 等包 包含jar包 ...

    sketch-inversion:MXNet实现[卷积草图反转](https

    http://data.dmlc.ml/mxnet/models/imagenet/vgg/ 然后将vgg16-0000.params放在pretrained文件夹中 下载并解压缩数据集: 注意:该模型仅使用增强的训练,该与原始论文不同。 原始论文使用了四个数据集: , , 和...

Global site tag (gtag.js) - Google Analytics